zincjs 1.20.1-beta.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/zinc.js +5 -5
- package/build/zinc.js.map +1 -1
- package/package.json +13 -12
- package/src/controls.js +21 -15
- package/src/primitives/textureSlides.js +2 -1
- package/src/sceneLoader.js +78 -64
- package/src/utilities.js +14 -17
package/build/zinc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zinc.js","sources":["../src/three/Geometry.js","../src/assets/disc.png","../src/utilities.js","../src/primitives/augmentShader.js","../src/three/line/Line.js","../src/three/line/LineSegments.js","../src/primitives/lod.js","../src/assets/mapMarker.svg","../src/primitives/marker.js","../src/primitives/zincObject.js","../src/primitives/geometry.js","../src/primitives/label.js","../src/primitives/glyph.js","../src/three/Loader.js","../src/videoHandler.js","../src/loaders/JSONLoader.js","../src/primitives/glyphset.js","../src/three/Points.js","../src/primitives/pointset.js","../src/primitives/lines.js","../src/texture/texture.js","../src/texture/textureArray.js","../src/shaders/textureSlide.js","../src/primitives/texturePrimitive.js","../src/primitives/textureSlides.js","../src/controls.js","../src/assets/mapMarkerOrange.svg","../src/primitives/markerCluster.js","../src/minimap.js","../src/three/line/LineSegmentsGeometry.js","../src/three/line/LineMaterial.js","../src/three/line/LineSegments2.js","../src/primitives/lines2.js","../src/region.js","../src/three/GLTFExporter.js","../src/sceneExporter.js","../src/loaders/GLTFToZincJSLoader.js","../src/loaders/OBJLoader.js","../src/loaders/primitivesLoader.js","../src/loaders/STLLoader.js","../src/primitives/tubeLines.js","../src/sceneLoader.js","../src/scene.js","../src/renderer.js","../src/zinc.js"],"sourcesContent":["import {\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tEventDispatcher,\n\tFloat32BufferAttribute,\n\tMatrix3,\n\tMatrix4,\n\tMathUtils,\n\tObject3D,\n\tSphere,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst _m1 = new Matrix4();\nconst _obj = new Object3D();\nconst _offset = new Vector3();\nconst _temp = new Vector3();\n\nfunction Geometry() {\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 this.normals = [];\n this.uvs = [];\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\tthis.morphNormalsReady = 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.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\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\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 ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.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\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 return vertices;\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\tlet vertexNormals = tmpGeo.computeVertexNormals();\n\n if (vertexNormals && vertexNormals.length > 0) {\n this.morphTargets[i].normals = new Array( this.vertices.length );\n\n for ( let v = 0; v < vertexNormals.length; v ++ ) {\n \n this.morphTargets[i].normals[ v ] = vertexNormals[v].clone();\n \n }\n }\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 this.morphNormalsReady = true;\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\tmergeMorph: function ( geometry, matrix ) {\n\n\t\tconst m = this.morphTargets.length,\n\t\t\tmorphTargets1 = this.morphTargets,\n\t\t\tmorphTargets2 = geometry.morphTargets,\n\t\t\tn = this.morphColors.length,\n\t\t\tmorphColors1 = this.morphColors,\n\t\t\tmorphColors2 = geometry.morphColors;\n\n if ( m > 0 && m == morphTargets2.length) {\n\n\t\t\tfor ( let i = 0, l = morphTargets1.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphTarget1 = morphTargets1[ i ];\n\t\t\t\tconst morphTarget2 = morphTargets2[ i ];\n\n\t\t\t\tfor ( let k = 0, kl = morphTarget2.vertices.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst vertex = morphTarget2.vertices[ k ];\n\t\t\n\t\t\t\t\tconst vertexCopy = vertex.clone();\n\t\t\n\t\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\t\t\n\t\t\t\t\tmorphTarget1.vertices.push( vertexCopy );\n\t\t\n\t\t\t\t}\n\n\t\t\t\tif ( morphTarget1.normals && morphTarget2.normals ) {\n\t\t\t\t\t\n\t\t\t\t\tfor ( let k = 0; k < morphTarget2.normals.length; k = k + 3) {\n\n\t\t\t\t\t\t_temp.set(morphTarget2.normals2[k], morphTarget2.normals2[k + 1], morphTarget2.normals2[k + 2]);\n\t\t\t\n\t\t\t\t\t\tif ( matrix !== undefined ) _temp.applyMatrix4( matrix );\n\t\t\t\n\t\t\t\t\t\tmorphTarget1.normals.push(_temp.x, _temp.y, _temp.z);\n\t\t\t\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 ( n > 0 && n == morphColors2.length) {\n\n\t\t\tfor ( let i = 0, l = morphColors1.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphColor1 = morphColors1[ i ];\n\t\t\t\tconst morphColor2 = morphColors2[ i ];\n\n\t\t\t\tfor ( let k = 0, kl = morphColor2.colors; k < kl; k ++ ) {\n\n\t\t\t\t\tmorphColor1.colors.push( morphColor2.colors[ k ].clone() );\n\t\t\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\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\tnormals2 = geometry.normals,\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\tfor ( let i = 0; i < normals2.length; i = i + 3) {\n\n\t\t\t_temp.set(normals2[i], normals2[i + 1], normals2[i + 2]);\n\n\t\t\tif ( matrix !== undefined ) _temp.applyMatrix4( matrix );\n\n\t\t\tthis.normals.push(_temp.x, _temp.y, _temp.z);\n\n\t\t}\n\n\t\t// colors\n\n\t\tfor ( let i = 0, il = colors2.length; i < il; i ++ ) {\n\t\t\tif ((typeof colors2[ i ] === \"number\")) {\n\t\t\t\tcolors1.push( colors2[ i ] );\n\t\t\t} else {\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\t\t\t}\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\tthis.mergeMorph( geometry, matrix );\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\n\tcomputeGroups( ) {\n\n\t\tconst groups = [];\n\n\t\tlet group, i;\n\t\tlet materialIndex = undefined;\n\n\t\tconst faces = this.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\treturn groups;\n\n\t},\n\n\ttoBufferGeometry: function () {\n\n\t\tconst geometry = new DirectGeometry().fromGeometry( this );\n\n\t\tconst buffergeometry = new BufferGeometry();\n\n\t\tconst positions = new Float32Array( geometry.vertices.length * 3 );\n\t\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t}\n\n\t\t// groups\n\n\t\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tbuffergeometry.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t},\n\n toIndexedBufferGeometry: function () {\n\n\t\t//const geometry = new DirectGeometry().fromGeometry( this );\n\n\t\tconst buffergeometry = new BufferGeometry();\n\n\t\tconst positions = new Float32Array( this.vertices.length * 3 );\n\t\tbuffergeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( this.vertices ) );\n\n\t\tif ( this.normals.length > 0 ) {\n\t\t\tconst normals = new Float32Array( this.normals.length );\n let buffer = new BufferAttribute( normals, 3 ).copyArray( this.normals );\n\t\t\tbuffergeometry.setAttribute( 'normal', buffer);\n\t\t}\n if ( this.uvs.length > 0 && this.uvs[0].length > 0 ) {\n\n\t\t\tconst uvs = new Float32Array( this.uvs[0].length * 2 );\n\t\t\tbuffergeometry.setAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyArray( this.uvs[0] ) );\n\t\t}\n\n\t\tif ( this.uvs.length > 1 && this.uvs[1].length > 0 ) {\n\t\t\tconst uvs2 = new Float32Array( this.uvs[1].length * 2 );\n\t\t\tbuffergeometry.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyArray( this.uvs[1] ) );\n\t\t}\n\n if ( this.colors.length > 0) {\n\n const colorArray = [];\n for (let i = 0 ; i < this.colors.length; i++) {\n colorArray.push(new Color( this.colors[ i ] ));\n }\n const colors = new Float32Array( colorArray.length * 3 );\n\t\t\tbuffergeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( colorArray ) );\n\n } else {\n\n const colorsArray = new Float32Array( this.vertices.length * 3 );\n for (let i = 0; i < this.vertices.length * 3; i++) {\n colorsArray[i] = 1.0;\n }\n buffergeometry.setAttribute( 'color', new BufferAttribute( colorsArray, 3 ) );\n \n }\n\n if (this.faces.length > 0) {\n\n let colors = [];\n\n let indices = [];\n\n for (let i = 0 ; i < this.faces.length; i++) {\n\n indices.push(this.faces[i].a, this.faces[i].b, this.faces[i].c);\n\n const vertexColors = this.faces[i].vertexColors;\n \n if ( vertexColors.length === 3 ) {\n \n colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n \n } else {\n \n const color = this.faces[i].color;\n \n colors.push( color, color, color );\n \n }\n\n }\n\n // if ( colors.length > 0 ) {\n\n// const colorsArray = new Float32Array( colors.length * 3 );\n// buffergeometry.setAttribute( 'color', new BufferAttribute( colorsArray, 3 ).copyColorsArray( colors ) );\n \n// }\n\n buffergeometry.setIndex( indices );\n\n buffergeometry.groups = this.computeGroups();\n\n }\n\n\t\t// morphs\n\n if (this.morphTargets.length > 0) {\n\n\t\t\tconst array = [];\n const normalsArray = [];\n\n\t\t\tfor ( let i = 0, l = this.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphTarget = this.morphTargets[ i ];\n\n\t\t\t\tconst attribute = new Float32BufferAttribute( morphTarget.vertices.length * 3, 3 );\n\t\t\t\tattribute.name = morphTarget.name;\n\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget.vertices ) );\n\n if (morphTarget.normals) {\n\n\n const attribute = new Float32BufferAttribute( morphTarget.normals.length * 3, 3 );\n attribute.name = morphTarget.name;\n\n normalsArray.push( attribute.copyVector3sArray( morphTarget.normals ) );\n \n }\n\n\t\t\t}\n\n\t\t\tbuffergeometry.morphAttributes.position = array;\n buffergeometry.morphAttributes.normal = normalsArray;\n\n\t\t}\n\n\t\t// skinning\n\n\t\tif ( this.skinIndices.length > 0 ) {\n\n\t\t\tconst skinIndices = new Float32BufferAttribute( this.skinIndices.length * 4, 4 );\n\t\t\tbuffergeometry.setAttribute( 'skinIndex', skinIndices.copyVector4sArray( this.skinIndices ) );\n\n\t\t}\n\n\t\tif ( this.skinWeights.length > 0 ) {\n\n\t\t\tconst skinWeights = new Float32BufferAttribute( this.skinWeights.length * 4, 4 );\n\t\t\tbuffergeometry.setAttribute( 'skinWeight', skinWeights.copyVector4sArray( this.skinWeights ) );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tbuffergeometry.boundingSphere = this.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tbuffergeometry.boundingBox = this.boundingBox.clone();\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t},\n\n\tcomputeTangents: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t},\n\n\tcomputeLineDistances: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );\n\n\t},\n\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\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nGeometry.createBufferGeometryFromObject = function ( object ) {\n\n\tlet buffergeometry = new BufferGeometry();\n\n\tconst geometry = object.geometry;\n\n\tif ( object.isPoints || object.isLine ) {\n\n\t\tconst positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\tconst colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\tbuffergeometry.setAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\tbuffergeometry.setAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\tconst lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\tbuffergeometry.setAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tbuffergeometry.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tbuffergeometry.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t} else if ( object.isMesh ) {\n\n\t\tbuffergeometry = geometry.toBufferGeometry();\n\n\t}\n\n\treturn buffergeometry;\n\n};\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\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\nexport { Face3, Geometry };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sHDgwCEMBJZu0AAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAABM5JREFUWMO1V0tPG2cUPZ4Hxh6DazIOrjFNqJs0FIMqWFgWQkatsmvVbtggKlSVRVf5AWz4AWz4AUSKEChll19QJYSXkECuhFxsHjEhxCYm+DWGMZ5HF72DJq4bAzFXurI0M/I5997v3u9cC65vTJVn2lX/xHINQOYSBLTLEuIuCWw4Z3IGAEvf6ASmVHjNzHCXBG4A0AjACsAOwEbO0nsFQBnAGYASAIl+ZRMR7SolMEdsByD09fV5R0ZGgg8ePPjW5/N1iqLYpuu6RZblciKR2I9Go69evnwZnZ+fjwI4IS8AKBIRzeQfJWCANwKwh0KhtrGxsYehUOin1tbW+zzP23ietzY2NnIAoGmaLsuyUiqVyvl8XtrY2NiamZn589mzZxsAUgCOAeQAnFI2tI+VxIjaAeDzoaGh7xYWFuZOTk6OZVk+12uYqqq6JEnn0Wg0OT4+/geAXwGEAdwDIFJQXC1wO4DWR48e/RCPxxclSSroVzRFUbSDg4P848ePFwH8DuAhkWih83TRQWxFOXgAwvDwcOfo6OhvXV1d39tsNtuVBwTDWBwOh1UUxVsMw1hXVlbSdCgNV43uYSvrHg6H24aHh38eHBz85TrgF9FYLHA4HLzH43FvbW2d7u/vG+dANp8FpqIlbd3d3V8Fg8EfBUFw4BONZVmL3+9vHhkZCQL4AoAHgJPK8G+yzC0XDofdoVAo5PP5vkadTBAEtr+/39ff3x8gAp/RPOEqx2qjx+NpvXv3bk9DQ0NDvQgwDIOWlhZrMBj8kgi0UJdxRgYMArzL5XJ7vd57qLPZ7Xamp6fnNgBXtQxcjFuHw+Hyer3t9SYgCAITCAScAJoBNNEY/08GOFVVrfVMv7kMNDntFD1vjIAPrlRN0xjckOm6biFQ3jwNPwDMZrOnqVTqfb3Bi8Wivru7W/VCYkwPlKOjo0IikXh7EwQikYgE4Nw0CfXKDCipVCoTj8df3QABbW1tLUc6oUgkFPMkVACUNjc337148eKvw8PDbJ2jP1taWkoCyNDVXDSECmNSK4qiKNLq6urW8+fPI/UicHx8rD59+jSVy+WOAKSJhKENwFItLtoxk8mwsixzHR0dHe3t7c5PAU+n09rs7OzJkydPYqVSaQfANoDXALIk31S2smU1TWMPDg7K5XKZ7+3t9TudTut1U7+wsFCcmJiIpdPpbQBxADsAknQWymYCOukBHYCuKApisdhpMpnURFEU79y503TVyKenpzOTk5M7e3t7MQKPV0Zv1gNm+awB0MvlshqLxfLb29uyJElWURSbXC4XXyvqxcXFs6mpqeTc3Nzu3t7e3wQcA7BPZ8Cov1pNlJplmQtAG8MwHV6v95tAINA5MDBwPxAIuLu6upr8fr/VAN3c3JQjkcjZ+vp6fnl5+d2bN29SuVzuNYAEpf01CdRChUL+X1VskHACuA3Ay3Fcu9vt7nA6nZ7m5uYWQRCaNE3jVVW15PP580KhIGUymWw2m00DOAJwSP4WwPtq4LX2Ao6USxNlQyS/RcQcdLGwlNIz6vEMAaZpNzCk2Pll94LK/cDYimxERiBwG10sxjgvEZBE0UpE6vxj+0Ct5bTaXthgEhRmja8QWNkkPGsuIpfdjpkK+cZUWTC0KredVmtD/gdlSl6EG4AMvQAAAABJRU5ErkJggg==\"","import * as THREE from 'three';\nimport { Geometry as THREEGeometry } from './three/Geometry';\nimport SpriteTextModule from 'three-spritetext';\nconst SpriteText = SpriteTextModule.default || SpriteTextModule;\nimport Zinc from './zinc';\nimport discPNG from './assets/disc.png';\n\nfunction resolveURL(url) {\n\tlet actualURL = url;\n\tlet prefix = Zinc.modelPrefix;\n\n\tif (prefix) {\n\t\tif (prefix[prefix.length -1] != '/')\n\t\t\tprefix = prefix + '/';\n\t\tconst r = new RegExp('^(?:[a-z]+:)?//', 'i');\n\t\tif (!r.test(url)) {\n\t\t\tactualURL = prefix + url;\n\t\t}\n\t}\n\n\treturn actualURL;\n}\n\nfunction createNewURL(target, reference) {\n const getNewURL = (target, reference) => {\n try {\n let newURL = (new URL(target, reference)).href;\n //Make sure the target url does not contain parameters\n if (target && target.split(\"?\").length < 2) {\n const paramsStrings = reference.split(\"?\");\n //There are parameters, add them to the target\n if (paramsStrings.length === 2) {\n newURL = newURL + \"?\" + paramsStrings[1];\n }\n }\n return newURL;\n } catch {\n console.error(`There is an issue creating the url link with: ${target}.` );\n }\n }\n if (!Array.isArray(target)) {\n return getNewURL(target, reference);\n } else {\n const urls = [];\n target.forEach((url) => {\n urls.push(getNewURL(url, reference));\n });\n return urls;\n }\n}\n\n/*\n * Calculate the bounding box of a mesh, values will be\n * set for cachedBox, b1, v1 and v2 and they need to be\n * defined.\n */\nfunction getBoundingBox(mesh, cachedBox, b1, v1, v2) {\n let influences = mesh.morphTargetInfluences;\n let attributes = undefined;\n if (mesh.geometry)\n attributes = mesh.geometry.morphAttributes;\n let found = false;\n if (influences && attributes && attributes.position) {\n v1.set(0.0, 0.0, 0.0);\n v2.set(0.0, 0.0, 0.0);\n for (let i = 0; i < influences.length; i++) {\n if (influences[i] > 0) {\n found = true;\n b1.setFromArray(attributes.position[i].array);\n v1.add(b1.min.multiplyScalar(influences[i]));\n v2.add(b1.max.multiplyScalar(influences[i]));\n }\n }\n if (found) {\n cachedBox.set(v1, v2);\n }\n }\n if (!found) {\n cachedBox.setFromBufferAttribute(\n mesh.geometry.attributes.position);\n }\n mesh.updateWorldMatrix(true, true);\n cachedBox.applyMatrix4(mesh.matrixWorld);\n}\n\n\n//Convenient function\nfunction loadExternalFile(url, data, callback, errorCallback) {\n // Set up an asynchronous request\n const request = new XMLHttpRequest();\n request.open('GET', resolveURL(url), true);\n\n // Hook the event that gets called as the request progresses\n request.onreadystatechange = () => {\n // If the request is \"DONE\" (completed or failed)\n if (request.readyState == 4) {\n // If we got HTTP status 200 (OK)\n if (request.status == 200) {\n callback(request.responseText, data)\n } else { // Failed\n errorCallback(url);\n }\n }\n };\n\n request.send(null);\n}\n\nfunction loadExternalFiles(urls, callback, errorCallback) {\n const numUrls = urls.length;\n let numComplete = 0;\n const result = [];\n\n // Callback for a single file\n function partialCallback(text, urlIndex) {\n result[urlIndex] = text;\n numComplete++;\n\n // When all files have downloaded\n if (numComplete == numUrls) {\n callback(result);\n }\n }\n\n for (let i = 0; i < numUrls; i++) {\n \tloadExternalFile(urls[i], i, partialCallback, errorCallback);\n }\n}\n\n\n//Get the colours at index\nconst getColorsRGB = (colors, index) => {\n const index_in_colors = Math.floor(index/3);\n const remainder = index%3;\n let hex_value = 0;\n if (remainder == 0)\n {\n hex_value = colors[index_in_colors].r;\n }\n else if (remainder == 1)\n {\n hex_value = colors[index_in_colors].g;\n }\n else if (remainder == 2)\n {\n hex_value = colors[index_in_colors].b;\n }\n const mycolor = new THREE.Color(hex_value);\n return [mycolor.r, mycolor.g, mycolor.b];\n}\n\nconst updateMorphColorAttribute = function(targetGeometry, morph) {\n if (morph && targetGeometry && targetGeometry.morphAttributes &&\n targetGeometry.morphAttributes[ \"color\" ]) {\n const morphColors = targetGeometry.morphAttributes[ \"color\" ];\n const influences = morph.morphTargetInfluences;\n const length = influences.length;\n targetGeometry.deleteAttribute( 'morphColor0' );\n targetGeometry.deleteAttribute( 'morphColor1' );\n let bound = 0;\n let morphArray = [];\n for (let i = 0; (1 > bound) || (i < length); i++) {\n if (influences[i] > 0) {\n bound++;\n morphArray.push([i, influences[i]]);\n }\n }\n if (morphArray.length == 2) {\n targetGeometry.setAttribute('morphColor0', morphColors[ morphArray[0][0] ] );\n targetGeometry.setAttribute('morphColor1', morphColors[ morphArray[1][0] ] );\n } else if (morphArray.length == 1) {\n targetGeometry.setAttribute('morphColor0', morphColors[ morphArray[0][0] ] );\n targetGeometry.setAttribute('morphColor1', morphColors[ morphArray[0][0] ] );\n }\n }\n}\n\n\nconst toBufferGeometry = (geometryIn, options) => {\n let geometry = undefined;\n if (geometryIn instanceof THREEGeometry) {\n if (options.localTimeEnabled && !geometryIn.morphNormalsReady &&\n (geometryIn.morphNormals == undefined || geometryIn.morphNormals.length == 0))\n geometryIn.computeMorphNormals();\n geometry = geometryIn.toIndexedBufferGeometry();\n if (options.localMorphColour) {\n copyMorphColorsToIndexedBufferGeometry(geometryIn, geometry);\n }\n } else if (geometryIn instanceof THREE.BufferGeometry) {\n geometry = geometryIn.clone();\n }\n geometry.colorsNeedUpdate = true;\n geometry.computeBoundingBox();\n geometry.computeBoundingSphere();\n if (geometryIn._video)\n geometry._video = geometryIn._video;\n return geometry;\n}\n\nconst copyMorphColorsToBufferGeometry = (geometry, bufferGeometry) => {\n if (geometry && geometry.morphColors && geometry.morphColors.length > 0 ) {\n let array = [];\n let morphColors = geometry.morphColors;\n for ( var i = 0, l = morphColors.length; i < l; i ++ ) {\n let morphColor = morphColors[ i ];\n let colorArray = [];\n for ( var j = 0; j < geometry.faces.length; j ++ ) {\n let face = geometry.faces[j];\n let color = getColorsRGB(morphColor.colors, face.a);\n colorArray.push(color[0], color[1], color[2]);\n color = getColorsRGB(morphColor.colors, face.b);\n colorArray.push(color[0], color[1], color[2]);\n color = getColorsRGB(morphColor.colors, face.c);\n colorArray.push(color[0], color[1], color[2]);\n }\n var attribute = new THREE.Float32BufferAttribute( geometry.faces.length * 3 * 3, 3 );\n attribute.name = morphColor.name;\n array.push( attribute.copyArray( colorArray ) );\n }\n bufferGeometry.morphAttributes[ \"color\" ] = array;\n }\n}\n\n\nconst copyMorphColorsToIndexedBufferGeometry = (geometry, bufferGeometry) => {\n if (geometry && geometry.morphColors && geometry.morphColors.length > 0 ) {\n let array = [];\n let morphColors = geometry.morphColors;\n for ( let i = 0, l = morphColors.length; i < l; i ++ ) {\n const morphColor = morphColors[ i ];\n const colorArray = [];\n for ( let j = 0; j < morphColor.colors.length * 3; j ++ ) {\n let color = getColorsRGB(morphColor.colors, j);\n colorArray.push(color[0], color[1], color[2]);\n }\n const attribute = new THREE.Float32BufferAttribute( colorArray, 3 );\n attribute.name = morphColor.name;\n array.push( attribute );\n }\n bufferGeometry.morphAttributes[ \"color\" ] = array;\n }\n}\n\n/**\n * Merges a set of attributes into a single instance. All attributes must have compatible properties and types.\n * Instances of {@link InterleavedBufferAttribute} are not supported.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to merge.\n * @return {?BufferAttribute} The merged attribute. Returns `null` if the merge does not succeed.\n */\nfunction mergeAttributes( attributes ) {\n\n let TypedArray;\n let itemSize;\n let normalized;\n let gpuType = - 1;\n let arrayLength = 0;\n\n for ( let i = 0; i < attributes.length; ++ i ) {\n\n const attribute = attributes[ i ];\n\n if ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n if ( TypedArray !== attribute.array.constructor ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n return null;\n\n }\n\n if ( itemSize === undefined ) itemSize = attribute.itemSize;\n if ( itemSize !== attribute.itemSize ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n return null;\n\n }\n\n if ( normalized === undefined ) normalized = attribute.normalized;\n if ( normalized !== attribute.normalized ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n return null;\n\n }\n\n if ( gpuType === - 1 ) gpuType = attribute.gpuType;\n if ( gpuType !== attribute.gpuType ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n return null;\n\n }\n\n arrayLength += attribute.count * itemSize;\n\n }\n\n const array = new TypedArray( arrayLength );\n const result = new THREE.BufferAttribute( array, itemSize, normalized );\n let offset = 0;\n\n for ( let i = 0; i < attributes.length; ++ i ) {\n\n const attribute = attributes[ i ];\n if ( attribute.isInterleavedBufferAttribute ) {\n\n const tupleOffset = offset / itemSize;\n for ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n for ( let c = 0; c < itemSize; c ++ ) {\n\n const value = attribute.getComponent( j, c );\n result.setComponent( j + tupleOffset, c, value );\n\n }\n\n }\n\n } else {\n\n array.set( attribute.array, offset );\n\n }\n\n offset += attribute.count * itemSize;\n\n }\n\n if ( gpuType !== undefined ) {\n\n result.gpuType = gpuType;\n\n }\n\n return result;\n\n}\n\n/**\n * Merges a set of geometries into a single instance. All geometries must have compatible attributes.\n *\n * @param {Array<BufferGeometry>} geometries - The geometries to merge.\n * @param {boolean} [useGroups=false] - Whether to use groups or not.\n * @return {?BufferGeometry} The merged geometry. Returns `null` if the merge does not succeed.\n */\nconst mergeGeometries = ( geometries, useGroups = false ) => {\n\n const isIndexed = geometries[ 0 ].index !== null;\n\n const attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n const morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n const attributes = {};\n const morphAttributes = {};\n\n const morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n const mergedGeometry = new THREE.BufferGeometry();\n\n let offset = 0;\n\n for ( let i = 0; i < geometries.length; ++ i ) {\n\n const geometry = geometries[ i ];\n let attributesCount = 0;\n\n // ensure that all geometries are indexed, or none\n\n if ( isIndexed !== ( geometry.index !== null ) ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n return null;\n\n }\n\n // gather attributes, exit early if they're different\n\n for ( const name in geometry.attributes ) {\n\n if ( ! attributesUsed.has( name ) ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n return null;\n\n }\n\n if ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n attributes[ name ].push( geometry.attributes[ name ] );\n\n attributesCount ++;\n\n }\n\n // ensure geometries have the same number of attributes\n\n if ( attributesCount !== attributesUsed.size ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n return null;\n\n }\n\n // gather morph attributes, exit early if they're different\n\n if ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n return null;\n\n }\n\n for ( const name in geometry.morphAttributes ) {\n\n if ( ! morphAttributesUsed.has( name ) ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n return null;\n\n }\n\n if ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n morphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n }\n\n if ( useGroups ) {\n\n let count;\n\n if ( isIndexed ) {\n\n count = geometry.index.count;\n\n } else if ( geometry.attributes.position !== undefined ) {\n\n count = geometry.attributes.position.count;\n\n } else {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n return null;\n\n }\n\n mergedGeometry.addGroup( offset, count, i );\n\n offset += count;\n\n }\n\n }\n\n // merge indices\n\n if ( isIndexed ) {\n\n let indexOffset = 0;\n const mergedIndex = [];\n\n for ( let i = 0; i < geometries.length; ++ i ) {\n\n const index = geometries[ i ].index;\n\n for ( let j = 0; j < index.count; ++ j ) {\n\n mergedIndex.push( index.getX( j ) + indexOffset );\n\n }\n\n indexOffset += geometries[ i ].attributes.position.count;\n\n }\n\n mergedGeometry.setIndex( mergedIndex );\n\n }\n\n // merge attributes\n\n for ( const name in attributes ) {\n\n const mergedAttribute = mergeAttributes( attributes[ name ] );\n\n if ( ! mergedAttribute ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n return null;\n\n }\n\n mergedGeometry.setAttribute( name, mergedAttribute );\n\n }\n\n // merge morph attributes\n\n for ( const name in morphAttributes ) {\n\n const numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n if ( numMorphTargets === 0 ) break;\n\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[ name ] = [];\n\n for ( let i = 0; i < numMorphTargets; ++ i ) {\n\n const morphAttributesToMerge = [];\n\n for ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n morphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n }\n\n const mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n if ( ! mergedMorphAttribute ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n return null;\n\n }\n\n mergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n }\n\n }\n\n return mergedGeometry;\n\n}\n\nconst mergeVertices = ( geometry, tolerance = 1e-4 ) => {\n\n tolerance = Math.max( tolerance, Number.EPSILON );\n\n // Generate an index buffer if the geometry doesn't have one, or optimize it\n // if it's already available.\n var hashToIndex = {};\n var indices = geometry.getIndex();\n var positions = geometry.getAttribute( 'position' );\n var vertexCount = indices ? indices.count : positions.count;\n\n // next value for triangle indices\n var nextIndex = 0;\n\n // attributes and new attribute arrays\n var attributeNames = Object.keys( geometry.attributes );\n var attrArrays = {};\n var morphAttrsArrays = {};\n var newIndices = [];\n var getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\n // initialize the arrays\n for ( var i = 0, l = attributeNames.length; i < l; i ++ ) {\n var name = attributeNames[ i ];\n\n attrArrays[ name ] = [];\n\n var morphAttr = geometry.morphAttributes[ name ];\n if ( morphAttr ) {\n\n morphAttrsArrays[ name ] = new Array( morphAttr.length ).fill().map( () => [] );\n\n }\n\n }\n\n // convert the error tolerance to an amount of decimal places to truncate to\n var decimalShift = Math.log10( 1 / tolerance );\n var shiftMultiplier = Math.pow( 10, decimalShift );\n for ( var i = 0; i < vertexCount; i ++ ) {\n\n var index = indices ? indices.getX( i ) : i;\n\n // Generate a hash for the vertex attributes at the current index 'i'\n var hash = '';\n for ( var j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n var name = attributeNames[ j ];\n var attribute = geometry.getAttribute( name );\n var itemSize = attribute.itemSize;\n\n for ( var k = 0; k < itemSize; k ++ ) {\n\n // double tilde truncates the decimal value\n hash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * shiftMultiplier ) },`;\n\n }\n\n }\n\n // Add another reference to the vertex if it's already\n // used by another index\n if ( hash in hashToIndex ) {\n\n newIndices.push( hashToIndex[ hash ] );\n\n } else {\n\n // copy data to the new index in the attribute arrays\n for ( var j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n var name = attributeNames[ j ];\n var attribute = geometry.getAttribute( name );\n var morphAttr = geometry.morphAttributes[ name ];\n var itemSize = attribute.itemSize;\n var newarray = attrArrays[ name ];\n var newMorphArrays = morphAttrsArrays[ name ];\n\n for ( var k = 0; k < itemSize; k ++ ) {\n\n var getterFunc = getters[ k ];\n newarray.push( attribute[ getterFunc ]( index ) );\n\n if ( morphAttr ) {\n\n for ( var m = 0, ml = morphAttr.length; m < ml; m ++ ) {\n\n newMorphArrays[ m ].push( morphAttr[ m ][ getterFunc ]( index ) );\n\n }\n\n }\n\n }\n\n }\n\n hashToIndex[ hash ] = nextIndex;\n newIndices.push( nextIndex );\n nextIndex ++;\n\n }\n\n }\n\n // Generate typed arrays from new attribute arrays and update\n // the attributeBuffers\n const result = geometry.clone();\n for ( var i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n var name = attributeNames[ i ];\n var oldAttribute = geometry.getAttribute( name );\n var attribute;\n\n var buffer = new oldAttribute.array.constructor( attrArrays[ name ] );\n if ( oldAttribute.isInterleavedBufferAttribute ) {\n\n attribute = new THREE.BufferAttribute( buffer, oldAttribute.itemSize, oldAttribute.itemSize );\n\n } else {\n\n attribute = geometry.getAttribute( name ).clone();\n attribute.setArray( buffer );\n\n }\n\n result.setAttribute( name, attribute );\n\n // Update the attribute arrays\n if ( name in morphAttrsArrays ) {\n\n for ( var j = 0; j < morphAttrsArrays[ name ].length; j ++ ) {\n\n var morphAttribute = geometry.morphAttributes[ name ][ j ].clone();\n morphAttribute.setArray( new morphAttribute.array.constructor( morphAttrsArrays[ name ][ j ] ) );\n result.morphAttributes[ name ][ j ] = morphAttribute;\n\n }\n\n }\n\n }\n\n // Generate an index buffer typed array\n var cons = Uint8Array;\n if ( newIndices.length >= Math.pow( 2, 8 ) ) cons = Uint16Array;\n if ( newIndices.length >= Math.pow( 2, 16 ) ) cons = Uint32Array;\n\n var newIndexBuffer = new cons( newIndices );\n var newIndices = null;\n if ( indices === null ) {\n\n newIndices = new THREE.BufferAttribute( newIndexBuffer, 1 );\n\n } else {\n\n newIndices = geometry.getIndex().clone();\n newIndices.setArray( newIndexBuffer );\n\n }\n\n result.setIndex( newIndices );\n\n return result;\n}\n\nfunction PhongToToon(materialIn) {\n\tif (materialIn.isMeshPhongMaterial) {\n\t\tlet material = new THREE.MeshToonMaterial({\n\t\t\tcolor : materialIn.color.clone(),\n\t\t\tmorphTargets : materialIn.morphTargets,\n\t\t\tmorphNormals : materialIn.morphNormals,\n\t\t\tvertexColors : materialIn.vertexColors,\n\t\t\ttransparent : materialIn.transparent,\n\t\t\topacity : materialIn.opacity,\n\t\t\tside : materialIn.side\n\t\t});\n\t\tif (materialIn.map)\n\t\t\tmaterial.map = materialIn.map;\n\t\treturn material;\n\t}\n\n\treturn materialIn;\n}\n\n/**\n * Create and return a new buffer geometry with the size of length,\n * and initial coords.\n */\nfunction createBufferGeometry(length, coords) {\n if (coords && (length >= coords.length)) {\n const geometry = new THREE.BufferGeometry()\n const vertices = new Float32Array(length * 3);\n let i = 0;\n coords.forEach(coord => {\n vertices[i++] = coord[0];\n vertices[i++] = coord[1];\n vertices[i++] = coord[2];\n });\n geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n geometry.setDrawRange(0, coords.length);\n return geometry;\n }\n return undefined;\n};\n\nfunction getCircularTexture() {\n const image = new Image();\n image.src = discPNG;\n const texture = new THREE.Texture();\n texture.image = image;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction createNewSpriteText(text, height, colour, font, pixel, weight) {\n const sprite = new SpriteText(text, height, colour, font, pixel, weight);\n sprite.fontFace = font;\n sprite.fontSize = pixel;\n sprite.fontWeight = weight;\n sprite.material.map.generateMipmaps = false;\n sprite.material.map.anisotropy = 4;\n sprite.material.sizeAttenuation = false;\n sprite.material.alphaTest = 0.5;\n sprite.material.transparent = true;\n sprite.material.depthWrite = false;\n sprite.material.depthTest = false;\n sprite.center.set(0.5, -1.2);\n sprite.renderOrder = 10000;\n return sprite;\n}\n\n/*\n * Check if the compare path match with the region or/and group.\n * comparePath should be in the form of regionPath/Group.\n * * can be used as wildcard.\n * comparePath will be used to compare both region and group if it\n * is a single string without /\n */\nfunction isRegionGroup(regionPath, groupName, comparePath) {\n if (comparePath) {\n const region = regionPath ? regionPath : \"\";\n const group = groupName ? groupName : \"\";\n const n = comparePath.lastIndexOf('/');\n if (n > -1) {\n let r = undefined;\n let g = undefined;\n r = comparePath.substring(0, n);\n g = comparePath.substring(n + 1);\n if (r === \"*\" || r === \"**\" || r.toLowerCase() === region.toLowerCase()) {\n if (g === \"*\" || g === \"**\" || g.toLowerCase() === group.toLowerCase()) {\n return true;\n }\n }\n } else {\n //one single value if one of the region / group matches\n if (region.toLowerCase() === comparePath.toLowerCase() ||\n group.toLowerCase() === comparePath.toLowerCase()) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction removeVertexAtIndex(geometry, index, maintainLength) {\n const positionAttribute = geometry.getAttribute('position');\n const normalAttribute = geometry.getAttribute('normal'); // Also update other attributes\n\n if (!positionAttribute) return;\n\n const itemSize = positionAttribute.itemSize; // e.g., 3 for x, y, z\n const start = index * itemSize;\n const deleteCount = itemSize;\n let removed = false;\n\n // Helper to remove elements from a typed array\n const removeElements = (attribute, name) => {\n let removed = false;\n const array = Array.from(attribute.array);\n if (array.length >= (start + deleteCount)) {\n array.splice(start, deleteCount); // Use splice for removal\n if (maintainLength) {\n array.concat(new Array(deleteCount).fill(0));\n }\n removed = true;\n const newArray = new Float32Array(array);\n geometry.setAttribute(name, new THREE.BufferAttribute(newArray, itemSize));\n geometry.getAttribute(name).needsUpdate = true;\n }\n // Create new BufferAttribute with the modified array\n\n return removed;\n };\n\n removed = removeElements(positionAttribute, 'position');\n if (normalAttribute) removeElements(normalAttribute, 'normal');\n // Repeat for 'uv', 'color', etc.\n\n // If the geometry is indexed, the index buffer will also need adjustment\n if (geometry.index !== null) {\n // This is more complex, typically easier to work with non-indexed geometry when modifying vertices\n console.warn(\"Removing vertices from indexed geometry requires index buffer recalculation.\");\n }\n\n return removed;\n\n}\n\n\nexport {\n copyMorphColorsToBufferGeometry,\n createBufferGeometry,\n createNewSpriteText,\n createNewURL,\n getBoundingBox,\n getCircularTexture,\n getColorsRGB,\n isRegionGroup,\n loadExternalFile,\n loadExternalFiles,\n mergeGeometries,\n mergeVertices,\n PhongToToon,\n removeVertexAtIndex,\n resolveURL,\n updateMorphColorAttribute,\n toBufferGeometry,\n };\n\n","\n/**\n * Provide additional shaders to render time dependent color.\n */\nconst augmentMorphColor = function() {\n return function(shader) {\n shader.vertexShader = shader.vertexShader.replace(\n '#include <color_pars_vertex>',\n [\n\t 'varying vec3 vColor;',\n 'attribute vec3 morphColor0;',\n 'attribute vec3 morphColor1;'\n ].join( '\\n' )\n );\n shader.vertexShader = shader.vertexShader.replace(\n '#include <color_vertex>',\n [\n 'vColor.xyz = color.xyz;',\n '#ifdef USE_MORPHTARGETS',\n 'vColor = morphColor0 * morphTargetInfluences[ 0 ];',\n 'vColor += morphColor1 * morphTargetInfluences[ 1 ];',\n '#endif'\n ].join( '\\n' )\n );\n };\n}\n\nexport { augmentMorphColor };","import {\n BufferGeometry,\n Float32BufferAttribute,\n LineBasicMaterial,\n\tMatrix4,\n Object3D,\n Ray,\n\tSphere,\n\tVector3\n} from 'three';\n\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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() {\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\tconsole.error( 'THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n const drawRange = geometry.drawRange;\n const morphPosition = geometry.morphAttributes.position;\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\t\t_sphere.radius += threshold;\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\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 start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n const b = index.getX( i + 1 );\n \n calculatePosition( vStart, vEnd, this, positionAttribute, morphPosition, a, b );\n\n\t\t\t\t\tconst distSq = _ray.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\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n calculatePosition( vStart, vEnd, this, positionAttribute, morphPosition, i, i+1 );\n\n\t\t\t\t\tconst distSq = _ray.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\tconsole.error( 'THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\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\nfunction calculatePosition( vStart, vEnd, object, position, morphPosition, a, b )\t{\n\n vStart.fromBufferAttribute( position, a );\n vEnd.fromBufferAttribute( position, b );\n\n var morphInfluences = object.morphTargetInfluences;\n\n if ( object.material.morphTargets && morphPosition && morphInfluences ) {\n\n _morphA.set( 0, 0, 0 );\n _morphB.set( 0, 0, 0 );\n\n for ( var i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n var influence = morphInfluences[ i ];\n var morphAttribute = morphPosition[ i ];\n\n if ( influence === 0 ) continue;\n\n _tempA.fromBufferAttribute( morphAttribute, a );\n _tempB.fromBufferAttribute( morphAttribute, b );\n\n _morphA.addScaledVector( _tempA.sub( vStart ), influence );\n _morphB.addScaledVector( _tempB.sub( vEnd ), influence );\n\n }\n\n vStart.add( _morphA );\n vEnd.add( _morphB );\n\n }\n\n}\n\nLine.prototype.isLine = true;\n\n\nexport { Line };","import { Line } from './Line.js';\nimport {\n Float32BufferAttribute,\n\tVector3\n} from 'three';\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\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.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t_end.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.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.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\tconsole.error( 'THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineSegments.prototype.isLineSegments = true;\n\nexport { LineSegments };","import * as THREE from 'three';\nimport { toBufferGeometry, updateMorphColorAttribute } from '../utilities';\nimport { LineSegments } from '../three/line/LineSegments';\n\n/**\n * Provides an object which stores meshes at different levels based\n * on specified distance.\n * This object is ued by zincObject to provide mesh at different LODs.\n * A layer is displayed when the distance from the camera is greater\n * than its specified distance and closest compared to other layers.\n * This is intended to be an internal object used only by Zinc Object.\n *\n * This object assumes the centroid and bounding box are consistent between\n * different level of layers.\n *\n * @class\n * @author Alan Wu\n * @return {LOD}\n */\nconst LOD = function (parent) {\n this.levels = [];\n this._currentLevel = 0;\n this._renderOrder = 1;\n this._material = undefined;\n this._secondaryMaterial = undefined;\n this._loader = undefined;\n //The owning Zinc Object\n this._parent = parent;\n\n /*\n * Add a level of LOD at the specified distance\n */\n this.addLevel = (object, distanceIn) => {\n if (object) {\n const distance = Math.abs(distanceIn);\n let l;\n for (l = 0; l < this.levels.length; l++) {\n if (distance < this.levels[l].distance) {\n break;\n }\n }\n const levelObject = {\n distance: distance,\n morph: object,\n loaded: true,\n loading: false,\n url: \"\",\n };\n this.levels.splice(l, 0, levelObject);\n object.renderOrder = this._renderOrder;\n //this.add( object );\n }\n }\n\n /*\n * This is called once an ondemand level is loaded\n */\n this.levelLoaded = (object, distanceIn) => {\n if (object) {\n const distance = Math.abs(distanceIn);\n for (let l = 0; l < this.levels.length; l++) {\n if (distance === this.levels[l].distance) {\n this._parent.group.add(object);\n this.levels[l].morph = object;\n this.levels[l].loaded = true;\n this.levels[l].loading = false;\n break;\n }\n }\n this.checkTransparentMesh();\n }\n }\n\n this.addLevelFromURL = (loader, level, url, index, preload) => {\n this._loader = loader;\n const distance = this.calculateDistance(level);\n const levelObject = {\n distance: distance,\n morph: undefined,\n loaded: false,\n loading: false,\n url: url,\n index: index,\n };\n let l;\n for (l = 0; l < this.levels.length; l++) {\n if (distance < this.levels[l].distance) {\n break;\n }\n }\n this.levels.splice(l, 0, levelObject);\n if (preload) {\n this.loadLevel(l);\n }\n }\n\n //load the mesh at index, return true if morph is not ready\n this.loadLevel = (index) => {\n const level = this.levels[index];\n if (!level.morph && !level.loaded &&\n !level.loading) {\n level.loading = true;\n this._loader.load(level.url, this.lodLoader(level.distance),\n undefined, undefined, {index: level.index});\n }\n return (level.morph === undefined);\n }\n\n\n this.calculateDistance = function (level) {\n this._parent.getBoundingBox();\n const radius = this._parent.radius;\n let distance = 0;\n if (level === \"far\") {\n distance = radius * 4.5;\n } else if (level === \"medium\") {\n distance = radius * 2.5;\n } else if (level === \"close\") {\n distance = 0;\n }\n return distance;\n }\n\n /**\n * Check if there are multiple levels.\n */\n this.containsLevels = () => {\n if (this.levels && this.levels.length > 1) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if material is transparent, create secondary mesh\n * for better rendering if required.\n */\n this.checkTransparentMesh = () => {\n const level = this.levels[this._currentLevel];\n if (this._material) {\n if (this._material.transparent) {\n if (!this._secondaryMaterial) {\n this._secondaryMaterial = this._material.clone();\n this._secondaryMaterial.side = THREE.FrontSide;\n }\n this._secondaryMaterial.opacity = this._material.opacity;\n if (this._secondaryMaterial.emissive) {\n this._secondaryMaterial.emissive.copy(this._material.emissive);\n }\n this._secondaryMaterial.needsUpdate = true;\n // THREE.Mesh - for utilities purpose such as rendering\n // transparent surfaces - one for front face and one for back face.\n if (!level.secondaryMesh) {\n level.secondaryMesh = new THREE.Mesh(level.morph.geometry,\n this._secondaryMaterial);\n level.secondaryMesh.renderOrder = level.morph.renderOrder + 1;\n level.secondaryMesh.userData = level.morph.userData;\n level.secondaryMesh.name = level.morph.name;\n }\n this._material.side = THREE.BackSide;\n this._material.needsUpdate = true;\n if (!level.secondaryMesh.parent) {\n level.morph.add(level.secondaryMesh);\n if (this._parent.animationGroup) {\n this._parent.animationGroup.add(level.secondaryMesh);\n }\n }\n } else {\n if (level.secondaryMesh) {\n //Do not delete this mesh, remove it from\n //rendering and animation group instead\n level.morph.remove(level.secondaryMesh);\n if (this._parent.animationGroup) {\n this._parent.animationGroup.uncache(level.secondaryMesh);\n this._parent.animationGroup.remove(level.secondaryMesh);\n }\n }\n this._material.side = THREE.DoubleSide;\n this._material.needsUpdate = true;\n }\n }\n }\n\n this.dispose = () => {\n this.levels.forEach((level) => {\n if (level.morph && level.morph.geometry) {\n level.morph.geometry.dispose();\n }\n });\n if (this._material) {\n this._material.dispose();\n }\n if (this._secondaryMaterial) {\n this._secondaryMaterial.dispose();\n }\n }\n\n this.getCurrentLevel = () => {\n return this._currentLevel;\n }\n\n this.getCurrentMorph = () => {\n const level = this.levels[this._currentLevel];\n if (level && level.morph) {\n return level.morph;\n }\n return this._parent.morph;\n }\n\n /**\n * Loader for lod object\n */\n this.lodLoader = function (distance) {\n return (geometryIn) => {\n const material = this._material;\n const options = {\n localTimeEnabled: this._parent.timeEnabled,\n localMorphColour: this._parent.morphColour,\n }\n const geometry = toBufferGeometry(geometryIn, options);\n let mesh = undefined;\n if (this._parent.isGeometry) {\n mesh = new THREE.Mesh(geometry, material);\n } else if (this._parent.isLines) {\n mesh = new LineSegments(geometry, material);\n }\n mesh.userData = this._parent;\n mesh.renderOrder = this._renderOrder;\n geometryIn.dispose();\n this.levelLoaded(mesh, distance);\n };\n }\n\n this.updateMorphColorAttribute = (currentOnly) => {\n //Multilayers - set all\n if (this._material) {\n if ((this._material.vertexColors == THREE.VertexColors) ||\n (this._material.vertexColors == true)) {\n if (currentOnly) {\n const morph = this.getCurrentMorph();\n updateMorphColorAttribute(morph.geometry, morph);\n } else {\n this.levels.forEach((level) => {\n if (level.morph && level.morph.geometry) {\n updateMorphColorAttribute(level.morph.geometry, level.morph);\n }\n });\n }\n }\n }\n }\n\n this.setColour = (colour) => {\n this._material.color = colour;\n if (this._secondaryMaterial) {\n this._secondaryMaterial.color = colour;\n }\n updateGeometryColour();\n }\n\n this.setFrustumCulled = (flag) => {\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.frustumCulled = flag;\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.frustumCulled = flag;\n }\n });\n }\n\n this.setMaterial = (material) => {\n if (material) {\n if (!this._material || (this._material.id !== material.id)) {\n this._material = material;\n if (this._secondaryMaterial) {\n this._secondaryMaterial.dispose();\n }\n this._secondaryMaterial = material.clone()\n this._secondaryMaterial.side = THREE.FrontSide;\n this._secondaryMaterial.transparent = true;\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.material = this._material;\n if (level.morph.geometry) {\n level.morph.geometry.colorsNeedUpdate = true;\n }\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.material = this._secondaryMaterial;\n }\n });\n }\n }\n }\n\n this.setName = (name) => {\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.name = name;\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.name = name;\n }\n });\n }\n\n this.setRenderOrder = (order) => {\n this._renderOrder = order;\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.renderOrder = order;\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.renderOrder = order;\n }\n });\n }\n\n this.setVertexColors = (vertexColors) => {\n this._material.vertexColors = vertexColors;\n updateGeometryColour();\n if (this._secondaryMaterial) {\n this._secondaryMaterial.vertexColors = vertexColors;\n }\n }\n\n /* Update layers based on the */\n this.update = (camera, center) => {\n const levels = this.levels;\n if (levels.length > 1) {\n const distance = camera.cameraObject.position.distanceTo(center);\n let visibleIndex = -1;\n let optimalIndex = -1;\n let i, l;\n //Found a visible index that is within range of the LOD\n for (i = 0, l = levels.length; i < l; i++) {\n if (distance >= levels[i].distance) {\n //Check if a level is loading\n if (levels[i].morph) {\n if (visibleIndex > -1 && levels[visibleIndex].morph) {\n levels[visibleIndex].morph.visible = false;\n }\n visibleIndex = i;\n levels[i].morph.visible = true;\n optimalIndex = -1;\n }\n else {\n optimalIndex = i;\n }\n } else {\n break;\n }\n }\n if (optimalIndex > -1) {\n this.loadLevel(optimalIndex);\n }\n for (; i < l; i++) {\n if (levels[i].morph) {\n //Set visibility of other morph to false\n //and set the closest lod to true if\n //none is found\n if (visibleIndex > -1) {\n levels[i].morph.visible = false;\n } else {\n levels[i].morph.visible = true;\n visibleIndex = i;\n }\n }\n }\n if (this._currentLevel != visibleIndex) {\n this._currentLevel = visibleIndex;\n this.checkTransparentMesh();\n }\n }\n }\n\n this.toggleMarker = (marker, flag) => {\n this.levels.forEach((level) => {\n if (level.morph) {\n if (flag) {\n level.morph.add(marker);\n } else {\n level.morph.remove(marker);\n }\n }\n });\n }\n\n const updateGeometryColour = () => {\n this.levels.forEach((level) => {\n if (level.morph && level.morph.geometry) {\n level.morph.geometry.colorsNeedUpdate = true;\n }\n });\n }\n}\n\nexport { LOD };\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'%20?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20version='1.1'%20width='365'%20height='560'%20viewBox='0%200%20365%20560'%20xml:space='preserve'%3e%3cdesc%3eCreated%20with%20Fabric.js%205.2.4%3c/desc%3e%3cdefs%3e%3c/defs%3e%3crect%20x='0'%20y='0'%20width='100%25'%20height='100%25'%20fill='transparent'%3e%3c/rect%3e%3cg%20transform='matrix(0%200%200%200%200%200)'%20id='808ed283-2524-440f-88ae-3bdb47bb5749'%20%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%20182.5%20280)'%20id='db30413d-5bff-4b98-ab59-464497ee199e'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-182.5'%20y='-280'%20rx='0'%20ry='0'%20width='365'%20height='560'%20/%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0.99%200%200%200.99%20182.5%20280)'%20%3e%3cg%20style=''%20vector-effect='non-scaling-stroke'%20%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-540'%20y='-540'%20rx='0'%20ry='0'%20width='1080'%20height='1080'%20/%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3cpath%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(0,89,116);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20transform='%20translate(-182.9,%20-279.85)'%20d='M%20182.9%20551.7%20C%20182.9%20551.8000000000001%20183.1%20552%20183.1%20552%20C%20183.1%20552%20358.3%20283%20358.3%20194.6%20C%20358.3%2064.5%20269.5%207.900000000000006%20182.9%207.699999999999989%20C%2096.3%207.9%207.5%2064.5%207.5%20194.6%20C%207.5%20283%20182.8%20552%20182.8%20552%20C%20182.8%20552%20182.9%20551.7%20182.9%20551.7%20z%20M%20122.2%20187.2%20C%20122.2%20153.6%20149.4%20126.39999999999999%20183%20126.39999999999999%20C%20216.6%20126.39999999999999%20243.8%20153.6%20243.8%20187.2%20C%20243.8%20220.79999999999998%20216.5%20248%20182.9%20248%20C%20149.4%20248%20122.2%20220.8%20122.2%20187.2%20z'%20stroke-linecap='round'%20/%3e%3c/g%3e%3cg%20transform='matrix(3.82%200%200%203.82%200%20-100.77)'%20%3e%3ccircle%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20cx='0'%20cy='0'%20r='35'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","import * as THREE from 'three';\nimport myImage from '../assets/mapMarker.svg';\nimport { createNewSpriteText } from '../utilities';\nimport { ZincObject } from './zincObject';\n\nconst markerImage = new Image(128, 128);\nmarkerImage.src = myImage;\nconst texture = new THREE.Texture();\ntexture.image = markerImage;\ntexture.needsUpdate = true;\nconst size = [0.02, 0.03, 1];\nconst spriteMaterial = new THREE.SpriteMaterial({\n map: texture,\n alphaTest: 0.5,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n sizeAttenuation: false\n});\n\n/**\n * A special graphics type with a tear drop shape.\n * It is currently used to mark the location of a\n * {@link zincObject}.\n *\n * @class\n * @author Alan Wu\n * @return {Marker}\n */\nconst Marker = function(zincObject) {\n if (Object.getPrototypeOf(this) !== ZincObject.prototype) {\n Object.setPrototypeOf(Marker.prototype, ZincObject.prototype);\n }\n\n ZincObject.call(this);\n this.texture = texture;\n let sprite = undefined;\n let userTexture = undefined;\n let userMaterial = undefined;\n let userSprite = undefined;\n let userUrl = undefined;\n let defaultDisplay = true;\n this.morph = new THREE.Group();\n this.group = this.morph;\n this.parent = zincObject;\n this.isMarker = true;\n let enabled = false;\n this.ndc = new THREE.Vector3();\n let number = undefined;\n let label = undefined;\n\n\tlet initialise = () => {\n sprite = new THREE.Sprite(spriteMaterial);\n sprite.center.set(0.5, 0);\n this.morph.add(sprite);\n this.morph.position.set(0, 0, 0);\n this.morph.renderOrder = 10000;\n sprite.scale.set(size[0], size[1], size[2]);\n sprite.userData = this;\n }\n\n this.updateVisual = (min, max) => {\n let scale = 1;\n let porportion = 0;\n if (min !== max) {\n porportion = (1 - (this.ndc.z - min) / (max - min));\n scale = 0.6 + porportion * 0.4;\n }\n this.setSpriteSize(scale);\n }\n\n this.updateNDC = camera => {\n this.ndc.copy(this.morph.position);\n this.ndc.project(camera);\n this.ndc.z = Math.min(Math.max(this.ndc.z, 0), 1);\n return this.ndc;\n }\n\n /**\n * Set the position of the marker.\n *\n * @param {Number} x - x coordinate to be set.\n * @param {Number} y - y coordinate to be set.\n * @param {Number} z - z coordinate to be set.\n */\n this.setPosition = (x, y, z) => {\n this.morph.position.set(x, y, z);\n }\n\n /**\n * Set the size of the marker.\n *\n * @param {Number} size - size to be set.\n */\n this.setSpriteSize = size => {\n sprite.scale.set(0.015, 0.02, 1);\n sprite.scale.multiplyScalar(size);\n }\n\n this.setUserSprite = () => {\n if (userSprite) {\n this.morph.add(userSprite);\n if (defaultDisplay) {\n this.morph.remove(sprite);\n if (label) {\n this.morph.remove(label);\n }\n defaultDisplay = false;\n }\n }\n }\n\n this.setImageForUserSprite = (image, size) => {\n if (userSprite) {\n this.morph.remove(userSprite);\n userSprite = undefined;\n }\n if (userTexture) userTexture.dispose();\n if (userMaterial) userMaterial.dispose();\n userTexture = new THREE.Texture();\n userTexture.image = image;\n userTexture.needsUpdate = true;\n userMaterial = new THREE.SpriteMaterial({\n map: userTexture,\n alphaTest: 0.5,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n sizeAttenuation: false\n });\n if (!size) {\n size = [0.05, 0.05, 1];\n }\n userSprite = new THREE.Sprite(userMaterial);\n userSprite.center.set(0.5, 0);\n userSprite.scale.set(size[0], size[1], size[2]);\n userSprite.userData = this;\n this.setUserSprite();\n }\n\n this.setDefaultSprite = () => {\n if (!defaultDisplay) {\n defaultDisplay = true;\n this.morph.add(sprite);\n if (userSprite) this.morph.remove(userSprite);\n if (label) this.morph.add(label);\n }\n }\n\n this.loadUserSprite = (url, size) => {\n if (url) {\n if (url !== userUrl) {\n userUrl = url;\n const userImage = new Image(128, 128);\n userImage.crossOrigin = \"anonymous\"\n userImage.onload = () => {\n this.setImageForUserSprite(userImage, size);\n };\n userImage.src = url;\n } else {\n this.setUserSprite();\n }\n }\n }\n\n /**\n * Clean up this object,\n */\n this.dispose = () => {\n if (this.morph) {\n this.morph.clear();\n }\n if (sprite) {\n sprite.clear();\n sprite = undefined;\n }\n if (label) {\n label.material.map.dispose();\n label.material.dispose();\n label = undefined;\n }\n }\n\n this.isEnabled = () => {\n return enabled;\n }\n\n this.setNumber = (numberIn) => {\n if (!numberIn || (number != numberIn)) {\n //remove label\n if (label) {\n this.morph.remove(label);\n label.material.map.dispose();\n label.material.dispose();\n label = undefined;\n }\n }\n if (!label && numberIn) {\n label = createNewSpriteText(numberIn, 0.012, \"black\", \"Asap\", 120, 700);\n this.morph.add(label);\n }\n number = numberIn;\n }\n\n this.getNumber = () => {\n return number ? number : 1;\n }\n\n /**\n * Set the visibility of this Geometry.\n *\n * @param {Boolean} visible - a boolean flag indicate the visibility to be set\n */\n this.setVisibility = function(visible) {\n if (visible !== this.visible) {\n this.visible = visible;\n this.group.visible = visible;\n if (this.parent.region) this.parent.region.pickableUpdateRequired = true;\n }\n }\n\n /**\n * Enable and visualise the marker.\n */\n this.enable = () => {\n enabled = true;\n this.morph.visible = true;\n this.visible = true;\n }\n\n /**\n * Disable and hide the marker.\n */\n this.disable = () => {\n enabled = false;\n this.morph.visible = false;\n this.visible = false;\n }\n\n\tinitialise();\n\n}\n\nexport { Marker };\n","import * as THREE from 'three';\nimport {\n createBufferGeometry,\n getBoundingBox,\n removeVertexAtIndex,\n resolveURL\n} from '../utilities';\nimport { LOD } from './lod';\nimport { Marker } from './marker';\n\nlet uniqueiId = 0;\n\nconst getUniqueId = function () {\n return \"pr\" + uniqueiId++;\n}\n\n/**\n * Provides the base object for other primitive types.\n * This class contains multiple base methods.\n *\n * @class\n * @author Alan Wu\n * @return {ZincObject}\n */\nconst ZincObject = function() {\n this.isZincObject = true;\n this.geometry = undefined;\n // THREE.Mesh\n this.morph = undefined;\n this.group = new THREE.Group();\n this._lod = new LOD(this);\n /**\n\t * Groupname given to this geometry.\n\t */\n this.groupName = undefined;\n this.timeEnabled = false;\n this.morphColour = false;\n this.inbuildTime = 0;\n this.mixer = undefined;\n this.animationGroup = undefined;\n\t/**\n\t * Total duration of the animation, this value interacts with the\n\t * {@link Renderer#playRate} to produce the actual duration of the\n\t * animation. Actual time in second = duration / playRate.\n\t */\n this.duration = 6000;\n this.clipAction = undefined;\n this.userData = {};\n this.videoHandler = undefined;\n this.marker = undefined;\n this.markerNumber = undefined;\n this.markerUpdateRequired = true;\n this.closestVertexIndex = -1;\n this.boundingBoxUpdateRequired = true;\n this.cachedBoundingBox = new THREE.Box3();\n this.anatomicalId = undefined;\n this.region = undefined;\n this.animationClip = undefined;\n this.markerMode = \"inherited\";\n this.uuid = getUniqueId();\n this._v1 = new THREE.Vector3();\n this._v2 = new THREE.Vector3();\n this._b1 = new THREE.Box3();\n this.center = new THREE.Vector3();\n this.radius = 0;\n this.visible = true;\n //Draw range is only used by primitives added\n //programatically with addVertices function\n this.drawRange = -1;\n //Default value of colour\n this.origColour = undefined;\n this.origVertexColors = false;\n this.isPickable = true;\n}\n\n/**\n * Set the duration of the animation of this object.\n *\n * @param {Number} durationIn - Duration of the animation.\n */\nZincObject.prototype.setDuration = function(durationIn) {\n this.duration = durationIn;\n if (this.clipAction) {\n this.clipAction.setDuration(this.duration);\n }\n}\n\n/**\n * Get the duration of the animation of this object.\n *\n * @return {Number}\n */\nZincObject.prototype.getDuration = function() {\n return this.duration;\n}\n\n/**\n * Set the region this object belongs to.\n *\n * @param {Region} region\n */\nZincObject.prototype.setRegion = function(region) {\n this.region = region;\n}\n\n/**\n * Get the region this object belongs to.\n *\n * @return {Region}\n */\nZincObject.prototype.getRegion = function() {\n return this.region;\n}\n\n/**\n * Get the threejs object3D.\n *\n * @return {Object}\n */\n ZincObject.prototype.getMorph = function() {\n const morph = this._lod.getCurrentMorph();\n return morph ? morph : this.morph;\n}\n\n/**\n * Get the threejs object3D.\n *\n * @return {Object}\n */\n ZincObject.prototype.getGroup = function() {\n return this.group;\n}\n\n/**\n * Set the internal threejs object3D.\n */\n ZincObject.prototype.setMorph = function(mesh) {\n this.morph = mesh;\n this.group.add(this.morph);\n //this is the base level object\n const distance = this._lod.calculateDistance(\"far\");\n this._lod.addLevel(mesh, distance);\n this._lod.setMaterial(mesh.material);\n}\n\n/**\n * Handle transparent mesh, create a clone for backside rendering if it is\n * transparent.\n */\nZincObject.prototype.checkTransparentMesh = function() {\n return;\n}\n\n/**\n * Set the mesh function for zincObject.\n *\n * @param {THREE.Mesh} mesh - Mesh to be set for this zinc object.\n * @param {Boolean} localTimeEnabled - A flag to indicate either the mesh is\n * time dependent.\n * @param {Boolean} localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\nZincObject.prototype.setMesh = function(mesh, localTimeEnabled, localMorphColour) {\n //Note: we assume all layers are consistent with time frame\n //Thus adding them to the same animation group should work.\n //This step is only required for the primary (level 0) mesh.\n this.animationGroup = new THREE.AnimationObjectGroup(mesh);\n this.mixer = new THREE.AnimationMixer(this.animationGroup);\n const geometry = mesh.geometry;\n this.geometry = mesh.geometry;\n this.clipAction = undefined;\n if (geometry && geometry.morphAttributes) {\n let morphAttribute = geometry.morphAttributes.position;\n if (!morphAttribute) {\n morphAttribute = geometry.morphAttributes.color ?\n geometry.morphAttributes.color :\n geometry.morphAttributes.normal;\n }\n if (morphAttribute) {\n this.animationClip = THREE.AnimationClip.CreateClipsFromMorphTargetSequences(\n morphAttribute, 10, true);\n if (this.animationClip && (this.animationClip[0] != undefined)) {\n this.clipAction = this.mixer.clipAction(this.animationClip[0]).setDuration(\n this.duration);\n this.clipAction.loop = THREE.loopOnce;\n this.clipAction.clampWhenFinished = true;\n this.clipAction.play();\n }\n }\n }\n this.timeEnabled = localTimeEnabled;\n this.morphColour = localMorphColour;\n mesh.userData = this;\n mesh.matrixAutoUpdate = false;\n this.setMorph(mesh);\n this.checkTransparentMesh();\n if (this.timeEnabled) {\n this.setFrustumCulled(false);\n } else {\n if (this.morphColour) {\n geometry.setAttribute('morphTarget0', geometry.getAttribute( 'position' ) );\n geometry.setAttribute('morphTarget1', geometry.getAttribute( 'position' ) );\n }\n }\n this.boundingBoxUpdateRequired = true;\n}\n\n/**\n * Set isPickable for this ZincObject.\n *\n * @param {String} isPickable - Boolean to enable object pick.\n */\nZincObject.prototype.setIsPickable = function(isPickable) {\n if (this.isPickable !== isPickable) {\n this.isPickable = isPickable;\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n}\n\n/**\n * Set the anatomicalId for this ZincObject.\n *\n * @param {String} anatomicalId - Id to be set.\n */\nZincObject.prototype.setAnatomicalId = function(anatomicalId) {\n this.anatomicalId = anatomicalId;\n}\n\n/**\n * Set the name for this ZincObject.\n *\n * @param {String} groupNameIn - Name to be set.\n */\nZincObject.prototype.setName = function(groupNameIn) {\n this.groupName = groupNameIn;\n this._lod.setName(groupNameIn);\n}\n\n/**\n * Get the local time of this geometry, it returns a value between\n * 0 and the duration.\n *\n * @return {Number}\n */\nZincObject.prototype.getCurrentTime = function() {\n if (this.clipAction) {\n const ratio = this.clipAction.time / this.clipAction._clip.duration;\n return this.duration * ratio;\n } else {\n return this.inbuildTime;\n }\n}\n\n/**\n * Set the local time of this geometry.\n *\n * @param {Number} time - Can be any value between 0 to duration.\n */\nZincObject.prototype.setMorphTime = function(time) {\n let timeChanged = false;\n if (this.clipAction) {\n const ratio = time / this.duration;\n const actualDuration = this.clipAction._clip.duration;\n let newTime = ratio * actualDuration;\n if (newTime != this.clipAction.time) {\n this.clipAction.time = newTime;\n timeChanged = true;\n }\n if (timeChanged && this.isTimeVarying()) {\n this.mixer.update( 0.0 );\n }\n } else {\n let newTime = time;\n if (time > this.duration)\n newTime = this.duration;\n else if (0 > time)\n newTime = 0;\n else\n newTime = time;\n if (newTime != this.inbuildTime) {\n this.inbuildTime = newTime;\n timeChanged = true;\n }\n }\n if (timeChanged) {\n this.boundingBoxUpdateRequired = true;\n this._lod.updateMorphColorAttribute(true);\n if (this.timeEnabled)\n this.markerUpdateRequired = true;\n }\n}\n\n/**\n * Check if the geometry is time varying.\n *\n * @return {Boolean}\n */\nZincObject.prototype.isTimeVarying = function() {\n if (this.timeEnabled || this.morphColour)\n return true;\n return false;\n}\n\n/**\n * Get the visibility of this Geometry.\n *\n */\nZincObject.prototype.getVisibility = function() {\n return this.visible;\n}\n\n/**\n * Set the visibility of this Geometry.\n *\n * @param {Boolean} visible - a boolean flag indicate the visibility to be set\n */\nZincObject.prototype.setVisibility = function(visible) {\n if (visible !== this.visible) {\n this.visible = visible;\n this.group.visible = visible;\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n}\n\n/**\n * Set the opacity of this Geometry. This function will also set the isTransparent\n * flag according to the provided alpha value.\n *\n * @param {Number} alpah - Alpha value to set for this geometry,\n * can be any value between from 0 to 1.0.\n */\nZincObject.prototype.setAlpha = function(alpha) {\n const material = this._lod._material;\n let isTransparent = false;\n if (alpha < 1.0)\n isTransparent = true;\n material.opacity = alpha;\n material.transparent = isTransparent;\n this.checkTransparentMesh();\n}\n\n/**\n * The rendering will be culled if it is outside of the frustrum\n * when this flag is set to true, it should be set to false if\n * morphing is enabled.\n *\n * @param {Boolean} flag - Set frustrum culling on/off based on this flag.\n */\nZincObject.prototype.setFrustumCulled = function(flag) {\n //multilayers - set for all layers\n this._lod.setFrustumCulled(flag);\n}\n\n/**\n * Set rather a zinc object should be displayed using per vertex colour or\n * not.\n *\n * @param {Boolean} vertexColors - Set display with vertex color on/off.\n */\nZincObject.prototype.setVertexColors = function(vertexColors) {\n //multilayers - set for all\n this._lod.setVertexColors(vertexColors);\n\n}\n\n/**\n * Get the colour of the mesh.\n *\n * @return {THREE.Color}\n */\nZincObject.prototype.getColour = function() {\n if (this._lod._material)\n return this._lod._material.color;\n\treturn undefined;\n}\n\n/**\n * Set the colour of the mesh.\n *\n * @param {THREE.Color} colour - Colour to be set for this geometry.\n */\nZincObject.prototype.setColour = function(colour) {\n this._lod.setColour(colour);\n}\n\n/**\n * Set the colour of the mesh.\n *\n * @param {THREE.Color} colour - Colour to be set for this geometry.\n */\nZincObject.prototype.setGreyScale = function(flag) {\n if (flag) {\n if (!this.origColour) {\n if (this._lod._material) {\n this.origColour = this._lod._material.color;\n this.origVertexColors = this._lod._material.vertexColors;\n this._lod.setVertexColors(false);\n this._lod.setColour(new THREE.Color().setHex( 0xBBBBBB ));\n return true;\n }\n }\n } else {\n if (this.origColour) {\n this._lod.setColour(this.origColour);\n this._lod.setVertexColors(this.origVertexColors);\n this.origColour = undefined;\n return true;\n }\n }\n return false;\n}\n\n/**\n * Get the colour of the mesh in hex string form.\n *\n * @return {String}\n */\nZincObject.prototype.getColourHex = function() {\n if (!this.morphColour) {\n if (this._lod._material && this._lod._material.color)\n return this._lod._material.color.getHexString();\n }\n return undefined;\n}\n\n/**\n * Set the colour of the mesh using hex in string form.\n *\n * @param {String} hex - The colour value in hex form.\n */\nZincObject.prototype.setColourHex = function(hex) {\n this._lod._material.color.setHex(hex);\n if (this._lod._secondaryMaterial) {\n this._lod._secondaryMaterial.color.setHex(hex);\n }\n}\n\n/**\n * Set the emissive rgb of the mesh using rgb.\n *\n * @param {String} colour - The colour value in rgb form.\n */\nZincObject.prototype.setEmissiveRGB = function(colour) {\n if (this._lod._material && this._lod._material.emissive) {\n this._lod._material.emissive.setRGB(...colour);\n }\n if (this._lod._secondaryMaterial) {\n this._lod._secondaryMaterial.emissive.setRGB(...colour);\n }\n}\n\n\n/**\n * Set the material of the geometry.\n *\n * @param {THREE.Material} material - Material to be set for this geometry.\n */\nZincObject.prototype.setMaterial = function(material) {\n this._lod.setMaterial(material);\n}\n\n/**\n * Get the index of the closest vertex to centroid.\n *\n * @return {Number} - integer index in the array\n */\nZincObject.prototype.getClosestVertexIndex = function() {\n let closestIndex = -1;\n const morph = this.getMorph();\n if (morph && morph.geometry) {\n let position = morph.geometry.attributes.position;\n if (position) {\n this._b1.setFromBufferAttribute(position);\n this._b1.getCenter(this._v1);\n let distance = -1;\n let currentDistance = 0;\n for (let i = 0; i < position.count; i++) {\n this._v2.fromArray(position.array, i * 3);\n currentDistance = this._v2.distanceTo(this._v1);\n if (distance == -1)\n distance = currentDistance;\n else if (distance > (currentDistance)) {\n distance = currentDistance;\n closestIndex = i;\n }\n }\n }\n }\n return closestIndex;\n}\n\n/**\n * Get the closest vertex to centroid.\n *\n * @return {THREE.Vector3}\n */\nZincObject.prototype.getClosestVertex = function(applyMatrixWorld) {\n let position = new THREE.Vector3();\n if (this.closestVertexIndex == -1) {\n this.closestVertexIndex = this.getClosestVertexIndex();\n }\n const morph = this.getMorph();\n if (morph && morph.geometry && this.closestVertexIndex >= 0) {\n let influences = morph.morphTargetInfluences;\n let attributes = morph.geometry.morphAttributes;\n if (influences && attributes && attributes.position) {\n let found = false;\n for (let i = 0; i < influences.length; i++) {\n if (influences[i] > 0) {\n found = true;\n this._v1.fromArray(\n attributes.position[i].array, this.closestVertexIndex * 3);\n position.add(this._v1.multiplyScalar(influences[i]));\n }\n }\n if (found) {\n return applyMatrixWorld ? position.applyMatrix4(morph.matrixWorld) : position;\n }\n } else {\n position.fromArray(morph.geometry.attributes.position.array,\n this.closestVertexIndex * 3);\n return applyMatrixWorld ? position.applyMatrix4(morph.matrixWorld) : position;\n }\n }\n //Matrix world has already been applied\n this.getBoundingBox();\n position.copy(this.center);\n return position;\n}\n\n/**\n * Get the bounding box of this geometry.\n *\n * @return {THREE.Box3}.\n */\nZincObject.prototype.getBoundingBox = function() {\n if (this.visible) {\n let morph = this._lod.getCurrentMorph();\n if (morph && morph.visible) {\n if (this.boundingBoxUpdateRequired) {\n getBoundingBox(morph, this.cachedBoundingBox, this._b1, this._v1, this._v2);\n this.cachedBoundingBox.getCenter(this.center);\n this.radius = this.center.distanceTo(this.cachedBoundingBox.max);\n this.boundingBoxUpdateRequired = false;\n }\n return this.cachedBoundingBox;\n }\n }\n return undefined;\n}\n\n/**\n * Clear this geometry and free the memory.\n */\nZincObject.prototype.dispose = function() {\n //multilayyers\n this._lod.dispose();\n this.animationGroup = undefined;\n this.mixer = undefined;\n this.morph = undefined;\n this.group = undefined;\n this.clipAction = undefined;\n this.groupName = undefined;\n}\n\n/**\n * Check if marker is enabled based on the objects settings with\n * the provided scene options.\n *\n * @return {Boolean}\n */\nZincObject.prototype.markerIsRequired = function(options) {\n if (this.visible &&\n (this.markerMode === \"on\" || (options && options.displayMarkers &&\n (this.markerMode === \"inherited\")))) {\n return true;\n }\n return false;\n}\n\n/**\n * Update the marker's position and size based on current viewport.\n */\nZincObject.prototype.updateMarker = function(playAnimation, options) {\n if ((playAnimation == false) &&\n (this.markerIsRequired(options)))\n {\n let ndcToBeUpdated = options.ndcToBeUpdated;\n if (this.groupName) {\n if (!this.marker) {\n this.marker = new Marker(this);\n this.markerUpdateRequired = true;\n }\n if (this.markerUpdateRequired) {\n let position = this.getClosestVertex(false);\n if (position) {\n this.marker.setPosition(position.x, position.y, position.z);\n this.markerUpdateRequired = false;\n }\n }\n if (!this.marker.isEnabled()) {\n if (options.markersList &&\n (!(this.marker.uuid in options.markersList))) {\n ndcToBeUpdated = true;\n options.markersList[this.marker.uuid] = this.marker;\n }\n this.marker.enable();\n this.group.add(this.marker.morph);\n }\n this.marker.setNumber(this.markerNumber);\n if (this.markerImgURL) {\n this.marker.loadUserSprite(this.markerImgURL);\n } else {\n this.marker.setDefaultSprite();\n }\n if (options && options.camera && (ndcToBeUpdated ||\n options.markerCluster.markerUpdateRequired)) {\n this.marker.updateNDC(options.camera.cameraObject);\n options.markerCluster.markerUpdateRequired = true;\n }\n }\n } else {\n if (this.marker && this.marker.isEnabled()) {\n this.marker.disable();\n this.group.remove(this.marker.morph);\n if (options.markersList &&\n (this.marker.uuid in options.markersList)) {\n options.markerCluster.markerUpdateRequired = true;\n delete options.markersList[this.marker.uuid];\n }\n }\n this.markerUpdateRequired = true;\n }\n}\n\nZincObject.prototype.processMarkerVisual = function(min, max) {\n if (this.marker && this.marker.isEnabled()) {\n this.marker.updateVisual(min, max);\n }\n}\n\nZincObject.prototype.initiateMorphColor = function() {\n //Multilayers - set all\n if (this.morphColour == 1) {\n this._lod.updateMorphColorAttribute(false);\n }\n}\n\nZincObject.prototype.setRenderOrder = function(renderOrder) {\n //multiilayers\n this._lod.setRenderOrder(renderOrder);\n}\n\n/**\n * Get the windows coordinates.\n *\n * @return {Object} - position and rather the closest vertex is on screen.\n */\nZincObject.prototype.getClosestVertexDOMElementCoords = function(scene) {\n if (scene && scene.camera) {\n let inView = true;\n const position = this.getClosestVertex(true);\n position.project(scene.camera);\n position.z = Math.min(Math.max(position.z, 0), 1);\n if (position.x > 1 || position.x < -1 || position.y > 1 || position.y < -1) {\n inView = false;\n }\n scene.getZincCameraControls().getRelativeCoordsFromNDC(position.x, position.y, position);\n return {position, inView};\n } else {\n return undefined;\n }\n}\n\n/**\n * Set marker mode for this zinc object which determine rather the\n * markers should be displayed or not.\n *\n * @param {string} mode - There are three options:\n * \"on\" - marker is enabled regardless of settings of scene\n * \"off\" - marker is disabled regardless of settings of scene\n * \"inherited\" - Marker settings on scene will determine the visibility\n * of the marker.\n *\n * @return {Boolean}\n */\n ZincObject.prototype.setMarkerMode = function(mode, options) {\n if (mode !== this.markerMode) {\n if (mode === \"on\" || mode === \"off\") {\n this.markerMode = mode;\n } else {\n this.markerMode = \"inherited\";\n }\n if (this.region) {\n this.region.pickableUpdateRequired = true;\n }\n }\n if (options) {\n this.markerNumber = options.number;\n this.markerImgURL = options.imgURL;\n }\n}\n\n//Update the geometry and colours depending on the morph.\nZincObject.prototype.render = function(delta, playAnimation,\n cameraControls, options) {\n if (this.visible && !(this.timeEnabled && playAnimation)) {\n this._lod.update(cameraControls, this.center);\n }\n if (playAnimation == true) {\n if ((this.clipAction) && this.isTimeVarying()) {\n this.mixer.update( delta );\n }\n else {\n let targetTime = this.inbuildTime + delta;\n if (targetTime > this.duration)\n targetTime = targetTime - this.duration;\n this.inbuildTime = targetTime;\n }\n //multilayers\n if (this.visible && delta != 0) {\n this.boundingBoxUpdateRequired = true;\n if (this.morphColour == 1) {\n this._lod.updateMorphColorAttribute(true);\n }\n }\n }\n this.updateMarker(playAnimation, options);\n}\n\n/**\n * Add lod from an url into the lod object.\n */\nZincObject.prototype.addLOD = function(loader, level, url, index, preload) {\n this._lod.addLevelFromURL(loader, level, url, index, preload);\n}\n\n/**\n * Add lod from an url into the lod object.\n */\nZincObject.prototype.addVertices = function(coords) {\n let mesh = this.getMorph();\n let geometry = undefined;\n if (!mesh) {\n geometry = createBufferGeometry(500, coords);\n this.drawRange = coords.length;\n } else {\n if (this.drawRange > -1) {\n const positionAttribute = mesh.geometry.getAttribute( 'position' );\n coords.forEach(coord => {\n positionAttribute.setXYZ(this.drawRange, coord[0], coord[1], coord[2])\n ++this.drawRange;\n });\n positionAttribute.needsUpdate = true;\n mesh.geometry.setDrawRange(0, this.drawRange);\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n geometry = mesh.geoemtry;\n this.boundingBoxUpdateRequired = true;\n }\n }\n return geometry;\n}\n\n/**\n * Add lod from an url into the lod object.\n */\nZincObject.prototype.deleteVertices = function(index) {\n let mesh = this.getMorph();\n if (mesh?.geometry && this.drawRange >= index) {\n if (removeVertexAtIndex(mesh.geometry, index, true)) {\n --this.drawRange;\n mesh.geometry.setDrawRange(0, this.drawRange);\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n return true;\n }\n }\n return false;\n}\n\n/**\n * Set the objects position.\n */\nZincObject.prototype.setPosition = function(x, y, z) {\n const group = this.getGroup();\n if (group) {\n group.position.set(x, y, z);\n group.matrixWorldNeedsUpdate = true;\n group.updateMatrix();\n group.updateWorldMatrix(true, true);\n this.boundingBoxUpdateRequired = true;\n }\n}\n\nZincObject.prototype.loadAdditionalSources = function(primitivesLoader, sources) {\n primitivesLoader.load(resolveURL(filename), meshloader(region, colour, opacity, localTimeEnabled, localMorphColour, undefined, undefined,\n undefined, undefined, finishCallback), this.onProgress(filename), this.onError(finishCallback));\n}\n\n/**\n * Set the objects scale.\n */\nZincObject.prototype.setScaleAll = function(scale) {\n const group = this.getGroup();\n if (group) {\n group.scale.set(scale, scale, scale);\n group.updateMatrix();\n this.boundingBoxUpdateRequired = true;\n }\n}\n\nexport { ZincObject };\n\n","import * as THREE from 'three';\nimport { toBufferGeometry } from '../utilities';\nimport { augmentMorphColor } from './augmentShader';\nimport { ZincObject} from './zincObject';\n\nconst createMeshForGeometry = (geometryIn, materialIn, options) => {\n // First copy the geometry\n let geometry = toBufferGeometry(geometryIn, options);\n\n let isTransparent = false;\n if (1.0 > options.opacity)\n isTransparent = true;\n\n let material = undefined;\n if (geometry._video === undefined) {\n const morphTargets = options.localTimeEnabled || options.localMorphColour;\n if (materialIn) {\n material = materialIn;\n material.morphTargets = morphTargets;\n material.morphNormals = options.localTimeEnabled;\n } else {\n if (geometry instanceof THREE.BufferGeometry && geometry.attributes.color === undefined) {\n material = new THREE.MeshPhongMaterial({\n color : options.colour,\n morphTargets : morphTargets,\n morphNormals : options.localTimeEnabled,\n transparent : isTransparent,\n opacity : options.opacity,\n side : THREE.DoubleSide\n });\n } else {\n material = new THREE.MeshPhongMaterial({\n color : options.colour,\n morphTargets : morphTargets,\n morphNormals : options.localTimeEnabled,\n vertexColors : THREE.VertexColors,\n transparent : isTransparent,\n opacity : options.opacity,\n side : THREE.DoubleSide\n });\n }\n }\n //material = PhongToToon(material);\n if (options.localMorphColour && geometry.morphAttributes[ \"color\" ]) {\n material.onBeforeCompile = augmentMorphColor();\n }\n } else {\n let videoTexture = geometry._video.createCanvasVideoTexture();\n material = new THREE.MeshBasicMaterial({\n morphTargets : options.localTimeEnabled,\n color : new THREE.Color(1, 1, 1),\n transparent : isTransparent,\n opacity : options.opacity,\n map : videoTexture,\n side : THREE.DoubleSide\n });\n this.videoHandler = geometry._video;\n }\n return new THREE.Mesh(geometry, material);\n}\n\n/**\n * Provides an object which stores geometry and provides method which controls its animations.\n * This is created when a valid json file containging geometry is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Geometry}\n */\nconst Geometry = function () {\n ZincObject.call(this);\n\t// THREE.Geometry or THREE.BufferGeometry\n\tthis.videoHandler = undefined;\n this.isGeometry = true;\n\n /**\n * Create the mesh for rendering\n *\n * @param {THREE.Geomtry} geometryIn - Geometry to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the geometry.\n * @param {Object} options - Provide various options\n * @param {THREE.Color} options.colour - colour to be set for the geometry\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the geometry is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n * @param {Number} options.opacity - Opacity to be set for the geometry\n */\n\tthis.createMesh = (geometryIn, materialIn, options) => {\n //Skip if there is a morph already\n\t\tif (this.morph && this.morph.geometry && (geometryIn != undefined))\n\t\t\treturn;\n\t\tconst mesh = createMeshForGeometry(geometryIn, materialIn, options);\n\t\tthis.setMesh(mesh, options.localTimeEnabled, options.localMorphColour);\n\t}\n\n /**\n * Calculate the UV for texture rendering.\n */\n\tthis.calculateUVs = () => {\n //Multilayers\n\t\tthis.geometry.computeBoundingBox();\n\t\tconst max = this.geometry.boundingBox.max, min = this.geometry.boundingBox.min;\n\t\tconst offset = new THREE.Vector2(0 - min.x, 0 - min.y);\n\t\tconst range = new THREE.Vector2(max.x - min.x, max.y - min.y);\n\t\tthis.geometry.faceVertexUvs[0] = [];\n\t\tfor (let i = 0; i < this.geometry.faces.length ; i++) {\n\t\t const v1 = this.geometry.vertices[this.geometry.faces[i].a];\n\t\t const v2 = this.geometry.vertices[this.geometry.faces[i].b];\n\t\t const v3 = this.geometry.vertices[this.geometry.faces[i].c];\n\t\t geometry.faceVertexUvs[0].push(\n\t\t [\n\t\t new THREE.Vector2((v1.x + offset.x)/range.x ,(v1.y + offset.y)/range.y),\n\t\t new THREE.Vector2((v2.x + offset.x)/range.x ,(v2.y + offset.y)/range.y),\n\t\t new THREE.Vector2((v3.x + offset.x)/range.x ,(v3.y + offset.y)/range.y)\n\t\t ]);\n\t\t}\n\t\tgeometry.uvsNeedUpdate = true;\n\t}\n\n /**\n * Handle transparent mesh, create a clone for backside rendering if it is\n * transparent.\n */\n this.checkTransparentMesh = function() {\n this._lod.checkTransparentMesh();\n }\n\n\t/**\n\t * Set wireframe display for this geometry.\n\t *\n\t * @param {Boolean} wireframe - Flag to turn on/off wireframe display.\n\t */\n\tthis.setWireframe = wireframe => {\n\t\tthis.morph.material.wireframe = wireframe;\n\t}\n\n /**\n * Edit Vertice in index.\n */\n this.editVertices = function(coords, i) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n const attribute = mesh.geometry.getAttribute(\"position\");\n if (!mesh || 0 > i) {\n return;\n } else {\n let index = i * 3;\n coords.forEach(coord => {\n attribute.array[index++] = coord[0];\n attribute.array[index++] = coord[1];\n attribute.array[index++] = coord[2];\n });\n attribute.needsUpdate = true;\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n }\n\n\n}\n\nGeometry.prototype = Object.create(ZincObject.prototype);\nexport { Geometry };\n","import SpriteTextModule from 'three-spritetext';\nconst SpriteText = SpriteTextModule.default || SpriteTextModule;\n\n/**\n * Bitmap labels, this is used with {@link Glyph} to\n * provide labels.\n *\n * @param {String} textIn - Text to be displayed dwith the label.\n * @param {THREE.Color} colour - Colour to be set for the label.\n *\n * @class\n * @author Alan Wu\n * @return {Label}\n */\nconst Label = function (textIn, colourIn) {\n let text = textIn;\n let sprite = undefined;\n const position = [0, 0, 0];\n let colour = colourIn;\n let size = 1.0;\n let fontWeight = 500;\n if (colourIn)\n sprite = new SpriteText(text, 0.012, colourIn.getStyle());\n else\n sprite = new SpriteText(text, 0.012);\n sprite.fontFace = \"Asap\";\n sprite.fontWeight = fontWeight;\n sprite.material.map.generateMipmaps = false;\n sprite.material.sizeAttenuation = false;\n sprite.center.x = -0.05;\n sprite.center.y = 0;\n const originalScale = [sprite.scale.x, sprite.scale.y];\n\n /**\n * Get the current position in an array containing the x, y and z\n * coordinates.\n *\n * @return {Array}\n */\n this.getPosition = () => {\n if (sprite)\n return [sprite.position.x, sprite.position.y, sprite.position.z];\n return [0, 0, 0];\n }\n\n /**\n * Set the position of the label in 3D coordinates.\n *\n * @param {Number} x - x coordinate to be set.\n * @param {Number} y - y coordinate to be set.\n * @param {Number} z - z coordinate to be set.\n */\n this.setPosition = (x, y, z) => {\n position[0] = x;\n position[1] = y;\n position[2] = z;\n\n if (sprite) {\n sprite.position.set(x, y, z);\n }\n }\n\n /**\n * Set the colour of the label\n *\n * @param {THREE.Color} colour - colour to be set\n */\n this.setColour = colourIn => {\n if (colourIn) {\n sprite.color = colourIn.getStyle();\n colour = colourIn;\n }\n }\n\n /**\n * Scale the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setScale = scaling => {\n if (sprite && scaling > 0.0)\n sprite.scale.set(scaling, scaling, 1.0);\n }\n\n /**\n * Set depth test for sprite object.\n *\n * @param {Boolean} flag - Enable/disable depth test\n */\n this.setDepthTest = flag => {\n if (flag && flag !== sprite.material.depthTest) {\n sprite.material.depthTest = flag;\n }\n }\n\n /**\n * Set a new text for the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setSize = sizeIn => {\n if (sizeIn > 0.0) {\n sprite.scale.x = originalScale[0] * sizeIn;\n sprite.scale.y = originalScale[1] * sizeIn;\n size = sizeIn;\n }\n }\n\n /**\n * Set a new text for the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setFontWeight = fontWeightIn => {\n if (fontWeightIn && fontWeightIn !== fontWeight) {\n sprite.fontWeight = fontWeightIn;\n fontWeight = fontWeightIn;\n }\n }\n\n /**\n * Set a new text for the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setText = textIn => {\n if (textIn && textIn !== sprite.text) {\n sprite.text = textIn;\n text = textIn;\n }\n }\n\n /**\n * Set visibility of the label.\n *\n * @param {Boolean} flag - Visibility to set\n */\n this.setVisibility = flag => {\n sprite.visible = flag;\n }\n\n /**\n * Free up the memory\n */\n this.dispose = () => {\n //sprite.dispose();\n }\n\n /**\n * Get the intrnal sprite.\n *\n * @return {THREE.Sprite}\n */\n this.getSprite = () => {\n return sprite;\n }\n\n /**\n * Get the text.\n *\n * @return {String}\n */\n this.getString = () => {\n return text;\n }\n\n};\n\nexport { Label };\n\n\n\n","import * as THREE from 'three';\nimport { Label } from './label';\nimport { ZincObject } from './zincObject';\n\n/**\n * Zinc representation of glyph graphic, it contains the colours,\n * geometry and transformation of the glyph.\n *\n * @param {THREE.Geometry} geometry - Geometry of the glyph .\n * @param {THREE.Material} materialIn - Material of the glyph.\n * @param {Number} idIn - Id of the glyph.\n *\n * @class\n * @author Alan Wu\n * @return {Glyph}\n */\nconst Glyph = function (geometry, materialIn, idIn, glyphsetIn) {\n ZincObject.call(this);\n let material = undefined;\n if (materialIn) {\n material = materialIn.clone();\n material.vertexColors = THREE.FaceColors;\n }\n const parent = glyphsetIn;\n this.id = idIn;\n let label = undefined;\n let labelString = undefined;\n this.isGlyph = true;\n let _position = [0, 0, 0];\n\n /**\n * Create a glyph using mesh\n * @param {THREE.Mesh} meshIn - Mesh to create the glyph from\n *\n * @returns {Boolean} true if successful\n */\n this.fromMesh = meshIn => {\n if (meshIn && meshIn.isMesh) {\n this.morph = meshIn.clone();\n this.morph.userData = this;\n this.group.add(this.morph);\n return true;\n }\n return false;\n }\n\n if (geometry && material) {\n this.fromMesh(new THREE.Mesh(geometry, material));\n }\n\n /**\n * Get the {Glyphset} containing this glyph.\n *\n * @returns {Boolean} true if successful\n */\n this.getGlyphset = function () {\n return parent;\n }\n\n /**\n * Set and update the text containing this glyph.\n * @param {String} text - Label to be set for this instance\n */\n this.setLabel = text => {\n if (text && (typeof text === 'string' || text instanceof String)) {\n labelString = text;\n if (this.morph)\n this.morph.name = text;\n }\n }\n\n /**\n * Display label with the choosen colour. It will replace the current\n * label.\n * @param {THREE.Color} colour - Colour for the label.\n */\n this.showLabel = (colour) => {\n if (label) {\n _position = label.getPosition();\n this.group.remove(label.getSprite());\n label.dispose();\n label = undefined;\n }\n if (labelString && (typeof labelString === 'string' || labelString instanceof String)) {\n label = new Label(labelString, colour);\n label.setPosition(_position[0], _position[1], _position[2]);\n const sprite = label.getSprite();\n sprite.material.alphaTest = 0.5;\n sprite.material.transparent = true;\n sprite.material.depthWrite = false;\n this.group.add(label.getSprite());\n }\n }\n\n /**\n * Hide label with the choosen colour.\n */\n this.hideLabel = () => {\n if (label) {\n _position = label.getPosition();\n this.group.remove(label.getSprite());\n label.dispose();\n label = undefined;\n }\n }\n\n /**\n * Get the label of this glyph\n * @return {Label}\n */\n this.getLabel = () => {\n return labelString;\n }\n\n /**\n * Get the mesh of this glyph.\n * @return {THREE.Mesh}\n */\n this.getMesh = () => {\n return this.morph;\n }\n\n /**\n * Set the transformation of this glyph.\n * @param {Array} position - Three components vectors containing position of the\n * transformation.\n * @param {Array} axis1 - Three components vectors containing axis1 rotation of the\n * transformation.\n * @param {Array} axis2 - Three components vectors containing axis2 rotation of the\n * transformation.\n * @param {Array} position - Three components vectors containing axis3 rotation of the\n * transformation.\n */\n this.setTransformation = (position, axis1, axis2, axis3) => {\n if (this.morph) {\n this.morph.matrix.elements[0] = axis1[0];\n this.morph.matrix.elements[1] = axis1[1];\n this.morph.matrix.elements[2] = axis1[2];\n this.morph.matrix.elements[3] = 0.0;\n this.morph.matrix.elements[4] = axis2[0];\n this.morph.matrix.elements[5] = axis2[1];\n this.morph.matrix.elements[6] = axis2[2];\n this.morph.matrix.elements[7] = 0.0;\n this.morph.matrix.elements[8] = axis3[0];\n this.morph.matrix.elements[9] = axis3[1];\n this.morph.matrix.elements[10] = axis3[2];\n this.morph.matrix.elements[11] = 0.0;\n this.morph.matrix.elements[12] = position[0];\n this.morph.matrix.elements[13] = position[1];\n this.morph.matrix.elements[14] = position[2];\n this.morph.matrix.elements[15] = 1.0;\n this.morph.matrixAutoUpdate = false;\n }\n _position = [...position];\n if (label) {\n label.setPosition(position[0], position[1], position[2]);\n }\n }\n\n /**\n * Set the color of the glyph and its label.\n *\n * @param {THREE.Color} color - Colour to be set.\n */\n this.setColour = (color) => {\n if (label)\n label.setColour(color);\n if (this.secondaryMesh && this.secondaryMesh.material)\n this.secondaryMesh.material.color = colour;\n if (this.geometry) {\n this.geometry.colorsNeedUpdate = true;\n }\n }\n\n /**\n * Clear and free its memory.\n */\n this.dispose = () => {\n if (this.material)\n this.material.dispose();\n this.morph = undefined;\n }\n}\n\nGlyph.prototype = Object.create(ZincObject.prototype);\nexport { Glyph };\n","import {\n\tNoBlending,\n\tNormalBlending,\n\tAdditiveBlending,\n\tSubtractiveBlending,\n\tMultiplyBlending,\n\tCustomBlending,\n\n\tFaceColors,\n\tVertexColors,\n\n\tDoubleSide,\n\tBackSide,\n\n\tMirroredRepeatWrapping,\n RepeatWrapping,\n MathUtils,\n MaterialLoader,\n TextureLoader,\n Color\n} from 'three';\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Loader() {}\n\nLoader.Handlers = {\n\n\thandlers: [],\n\n\tadd: function ( regex, loader ) {\n\n\t\tthis.handlers.push( regex, loader );\n\n\t},\n\n\tget: function ( file ) {\n\n\t\tvar handlers = this.handlers;\n\n\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\tvar regex = handlers[ i ];\n\t\t\tvar loader = handlers[ i + 1 ];\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\nObject.assign( Loader.prototype, {\n\n\tcrossOrigin: 'anonymous',\n\n\tonLoadStart: function () {},\n\n\tonLoadProgress: function () {},\n\n\tonLoadComplete: function () {},\n\n\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\tvar array = [];\n\n\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t}\n\n\t\treturn array;\n\n\t},\n\n\tcreateMaterial: ( function () {\n\n\t\tvar BlendingMode = {\n\t\t\tNoBlending: NoBlending,\n\t\t\tNormalBlending: NormalBlending,\n\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\tCustomBlending: CustomBlending\n\t\t};\n\n\t\tvar color = new Color();\n\t\tvar textureLoader = new TextureLoader();\n\t\tvar materialLoader = new MaterialLoader();\n\n\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t// convert from old material format\n\n\t\t\tvar textures = {};\n\n\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\tvar texture;\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t}\n\n\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t}\n\n\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t}\n\n\t\t\t\tvar uuid = MathUtils.generateUUID();\n\n\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\treturn uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar json = {\n\t\t\t\tuuid: MathUtils.generateUUID(),\n\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t};\n\n\t\t\tfor ( var name in m ) {\n\n\t\t\t\tvar value = m[ name ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\tjson.normalScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\tcase 'opacity':\n\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\tcase 'transparent':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\treturn materialLoader.parse( json );\n\n\t\t};\n\n\t} )()\n\n} );\n\nexport { Loader };\n","import * as THREE from 'three';\n\n/**\n * Provide basic functionality to display video as texture.\n * VideoTexture is used for creating and updating a video projected onto a Three.js texture\n *\n * @class\n * @param {Object} containerIn - Container to create the renderer on.\n * @author Alan Wu\n * @return {VideoHandler}\n */\nconst VideoHandler = function(srcIn) {\n\n\tvar _this = this;\n\tthis.video = undefined;\n\tthis.videoTexture = undefined;\n\tvar src = srcIn;\n\tvar lastTime = 0;\n\tvar lastUpdate = 0;\n\tvar frameRate = 30;\n\tvar videoPlaneLoadedFlag = false;\n\tvar lastPlayPos = 0;\n\tvar currentPlayPos = 0;\n\tvar bufferingDetected = false;\n\n\tvar checkBuffering = function(delta, playAnimation) {\n\t currentPlayPos = _this.video.currentTime;\n\n\t // checking offset should be at most the check interval\n\t // but allow for some margin\n\t var offset = delta - 0.02;\n\n\t // if no buffering is currently detected,\n\t // and the position does not seem to increase\n\t // and the _this.video isn't manually paused...\n\t if (!bufferingDetected && (currentPlayPos < (lastPlayPos + offset)) &&\n\t \t\t!_this.video.paused) {\n\t bufferingDetected = true;\n\t }\n\n\t // if we were buffering but the _this.video has advanced,\n\t // then there is no buffering\n\t if (bufferingDetected && (currentPlayPos > (lastPlayPos + offset)) &&\n\t \t\t!_this.video.paused) {\n\t bufferingDetected = false;\n\t }\n\t lastPlayPos = currentPlayPos;\n\t}\n\n\tvar initialise = function(){\n\t\tif (document) {\n\t\t \t_this.video = document.createElement( 'video' );\n\t\t \t_this.video.crossOrigin = \"anonymous\";\n\t\t \t_this.video.src = src;\n\t\t \t_this.video.load();\n _this.video.loop = true;\n\n\t\t}\n\t}\n\n\tthis.setMorphTime = function(time, duration){\n\t\tvar actualTime = time / duration * _this.video.duration;\n\t\t_this.video.currentTime = actualTime;\n\t}\n\n\t// videoPlaneLoaded connects the video to the video texture once it has loaded\n\t this.getVideoDuration = function() {\n\t\t return _this.video.duration;\n\t}\n\n\tthis.createCanvasVideoTexture = function(){\n\t\t_this.videoTexture = new THREE.VideoTexture( _this.video );\n\t\t_this.videoTexture.minFilter = THREE.LinearFilter;\n\t\t_this.videoTexture.magFilter = THREE.LinearFilter;\n\t\t_this.videoTexture.format = THREE.RGBFormat;\n _this.video.currentTime = 0;\n\t\treturn _this.videoTexture;\n\t}\n\n\tthis.getCurrentTime = function(duration) {\n\t\tif (_this.video)\n\t\t\treturn duration * (_this.video.currentTime / _this.video.duration);\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tthis.isReadyToPlay = function(){\n\t\t// video.readyState 3 means we have data to load for the current time and foreseeable future\n\t\tif (_this.video && _this.video.readyState >= 3){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t//this should be handle by scene... check the sync at\n\tinitialise();\n\n}\n\nexport { VideoHandler }\n","import * as THREE from 'three';\nimport { Face3 } from '../three/Geometry';\nimport { Geometry } from '../three/Geometry';\nimport { Loader } from '../three/Loader';\nimport { VideoHandler } from '../videoHandler';\n\nconst AnimationClip = THREE.AnimationClip;\nconst Color = THREE.Color;\nconst DefaultLoadingManager = THREE.DefaultLoadingManager;\nconst FileLoader = THREE.FileLoader;\nconst LoaderUtils = THREE.LoaderUtils;\nconst Vector2 = THREE.Vector2;\nconst Vector3 = THREE.Vector3;\nconst Vector4 = THREE.Vector4;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction JSONLoader( manager ) {\n\n\tif ( typeof manager === 'boolean' ) {\n\n\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\tmanager = undefined;\n\n\t}\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\tthis.withCredentials = false;\n\n this.paramsString = \"\";\n\n}\n\nObject.assign( JSONLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url );\n\n\t\tvar loader = new FileLoader( this.manager );\n\n const params = url.split(\"?\");\n\n //There are parameters, add them to the target\n if (url.length === 2) {\n\n this.paramsString = paramsStrings[1];\n\n } else {\n\n this.paramsString = \"\";\n\n }\n\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = undefined;\n\t\t\ttry {\n json = JSON.parse(text);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\"The loader has encountered an error while parsing the content of a resource.\");\n\t\t\t\tif (onError) {\n\t\t\t\t\tonError({responseURL: url});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar metadata = json.metadata;\n\n\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\tvar type = metadata.type;\n\n\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n if (scope && scope.parse) {\n\t\t\t\ttry {\n\t\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\t\tonLoad( object.geometry, object.materials );\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(\"The loader has encountered aon loading the geometry\");\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t\tif (onError) {\n\t\t\t\t\t\tonError({responseURL: url});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTexturePath: function ( value ) {\n\n\t\tthis.texturePath = value;\n\n\t},\n\n\tparse: ( function () {\n\n\t\tfunction parseModel( json, geometry ) {\n\n\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t}\n\n\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tscale = json.scale,\n\n\t\t\t\tnUvLayers = 0;\n\n\n\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t// disregard empty arrays\n\n\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = vertices.length;\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\tvertex = new Vector3();\n\n\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = faces.length;\n\n if (json.uvs) {\n\n for ( i = 0; i < json.uvs.length; i ++ ) {\n\n geometry.uvs[i] = [];\n\n for ( let k = 0; k < json.uvs[i].length ; k++ ) {\n\n geometry.uvs[i][k] = json.uvs[i][k];\n\n }\n\n }\n\n }\n\n if (normals) {\n\n for ( i = 0; i < normals.length; i ++ ) {\n\n geometry.normals[i] = normals[i];\n\n }\n\n }\n\n if (colors) {\n\n for ( i = 0; i < colors.length; i ++ ) {\n\n geometry.colors[i] = colors[i];\n\n }\n\n }\n\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\ttype = faces[ offset ++ ];\n\n\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\thasFaceColor = isBitSet( type, 6 );\n\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\toffset += 4;\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\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 ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface = new Face3();\n\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\tface.c = faces[ offset ++ ];\n\n //A hack to get things going\n if (!face.b) face.b = face.a;\n if (!face.c) face.c = face.b;\n\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\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 ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseSkin( json, geometry ) {\n\n\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.bones = json.bones;\n\n\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseMorphing( json, geometry ) {\n\n\t\t\tvar scale = json.scale;\n\n\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.morphNormals !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.morphNormals.length; i < l; i ++ ) {\n\n if (geometry.morphTargets[ i ]) {\n\n geometry.morphTargets[ i ].normals = [];\n\n var dstNormals = geometry.morphTargets[ i ].normals;\n var srcNormals = json.morphNormals[ i ].normals;\n\n for ( var v = 0, vl = srcNormals.length; v < vl; v += 3 ) {\n\n var normals = new Vector3();\n normals.x = srcNormals[ v ];\n normals.y = srcNormals[ v + 1 ] ;\n normals.z = srcNormals[ v + 2 ] ;\n\n dstNormals.push( normals );\n\n }\n\n geometry.morphNormalsReady = true;\n\n }\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.morphColors !== undefined ) {\n\n\t\t\t\tvar i, l, c, cl, dstColors, srcColors, color;\n\n\t\t\t\tfor ( i = 0, l = json.morphColors.length; i < l; i ++ ) {\n\n\t\t\t\t\tgeometry.morphColors[ i ] = {};\n\t\t\t\t\tgeometry.morphColors[ i ].name = json.morphColors[ i ].name;\n\t\t\t\t\tgeometry.morphColors[ i ].colors = [];\n\n\t\t\t\t\tdstColors = geometry.morphColors[ i ].colors;\n\t\t\t\t\tsrcColors = json.morphColors[ i ].colors;\n\n\t\t\t\t\tfor ( c = 0, cl = srcColors.length; c < cl; c += 3 ) {\n\n\t\t\t\t\t\tcolor = new THREE.Color( 0xffaa00 );\n\t\t\t\t\t\tcolor.setRGB( srcColors[ c ], srcColors[ c + 1 ], srcColors[ c + 2 ] );\n\t\t\t\t\t\tdstColors.push( color );\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 parseAnimations( json, geometry ) {\n\n\t\t\tvar outputAnimations = [];\n\n\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\tvar animations = [];\n\n\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\tanimations.push( json.animation );\n\n\t\t\t}\n\n\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t}\n\n\t\t\t// parse implicit morph animations\n\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t}\n\n\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t}\n\n\t\treturn function parse( json, texturePath ) {\n\n\t\t\tif ( json.data !== undefined ) {\n\n\t\t\t\t// Geometry 4.0 spec\n\t\t\t\tjson = json.data;\n\n\t\t\t}\n\n\t\t\tif ( json.scale !== undefined ) {\n\n\t\t\t\tjson.scale = 1.0 / json.scale;\n\n\t\t\t} else {\n\n\t\t\t\tjson.scale = 1.0;\n\n\t\t\t}\n\n\t\t\tvar geometry = new Geometry();\n\t\t\tgeometry.morphColors = [];\n\t\t\tparseModel( json, geometry );\n\t\t\tparseSkin( json, geometry );\n\t\t\tparseMorphing( json, geometry );\n\t\t\tparseAnimations( json, geometry );\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, 'Anonymous' );\n\n\n\t\t\t\tif (json.materials[0].video) {\n\n\t\t\t\t\tvar fullPath = texturePath + json.materials[0].video;\n\n if (this.paramsString) {\n\n fullPath = fullPath + `?${this.paramsString}`;\n\n }\n\n\t\t\t\t\tconst videoHandler = new VideoHandler(fullPath);\n\n\t\t\t\t\tgeometry._video = videoHandler;\n\n\t\t\t\t}\n\n\t\t\t\tif (materials && materials.length > 0) {\n\t\t\t\t\tif (json.materials[0].singleSided) {\n\t\t\t\t\t\tmaterials[0].side = THREE.FrontSide;\n\t\t\t\t\t} else if (json.materials[0].flipSided){\n\t\t\t\t\t\tmaterials[0].side = THREE.BackSide;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmaterials[0].side = THREE.DoubleSide;\n }\n if (json.materials[0].specularCoef) {\n materials[0].shininess = Math.floor(json.materials[0].specularCoef / 3);\n }\n\t\t\t\t}\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n} );\n\n\nexport { JSONLoader };\n","import * as THREE from 'three';\nimport { Glyph } from './glyph';\nimport { ZincObject } from './zincObject';\nimport { JSONLoader } from '../loaders/JSONLoader';\n\n/**\n * This is a container of {@link Glyph} and their graphical properties\n * including transformations, colors, number of time steps, duration of animations\n * and group name. Please note that all glyphs in the glyphset share the same geometry\n * however they may have different transformations.\n *\n * @class\n * @author Alan Wu\n * @return {Glyphset}\n */\nconst Glyphset = function () {\n ZincObject.call(this);\n const glyphList = [];\n let axis1s = undefined;\n let axis2s = undefined;\n let axis3s = undefined;\n let positions = undefined;\n let scales = undefined;\n let colors = undefined;\n let labels = undefined;\n let numberOfTimeSteps = 0;\n let numberOfVertices = 0;\n let baseSize = [0, 0, 0];\n let offset = [0, 0, 0];\n let scaleFactors = [0, 0, 0];\n let repeat_mode = \"NONE\";\n this.ready = false;\n let morphColours = false;\n let morphVertices = false;\n this.isGlyphset = true;\n let _transformMatrix = new THREE.Matrix4();\n const _bot_colour = new THREE.Color();\n const _top_colour = new THREE.Color();\n const _boundingBox1 = new THREE.Box3();\n const _boundingBox2 = new THREE.Box3();\n const _boundingBox3 = new THREE.Box3();\n const _points = [];\n const _current_positions = [];\n const _current_axis1s = [];\n const _current_axis2s = [];\n const _current_axis3s = [];\n const _current_scales = [];\n const _current_colors = [];\n const _glyph_axis_array = [];\n this.globalScale = 1;\n for (let i = 0; i < 8; i++) {\n _points[i] = new THREE.Vector3();\n }\n\n /**\n * Copy glyphset data into this glyphset then load the glyph's geoemtry\n * with the provided glyphURL. FinishCallback will be called once\n * glyph is loaded.\n *\n * @param {Array} glyphsetData - contains the informations about the glyphs.\n * @param {String} glyphURL - URL to the geometry which will be applied to all\n * all the glyphs in the glyphset once loaded.\n * @param {Function} finishCallback - User's function to be called once glyph's\n * geometry is loaded.\n */\n this.load = (glyphsetData, glyphURL, finishCallback, isInline, displayLabels) => {\n axis1s = glyphsetData.axis1;\n axis2s = glyphsetData.axis2;\n axis3s = glyphsetData.axis3;\n positions = glyphsetData.positions;\n scales = glyphsetData.scale;\n colors = glyphsetData.colors;\n labels = glyphsetData.label;\n morphColours = glyphsetData.metadata.MorphColours;\n morphVertices = glyphsetData.metadata.MorphVertices;\n numberOfTimeSteps = glyphsetData.metadata.number_of_time_steps;\n repeat_mode = glyphsetData.metadata.repeat_mode;\n numberOfVertices = glyphsetData.metadata.number_of_vertices;\n if (repeat_mode == \"AXES_2D\" || repeat_mode == \"MIRROR\")\n numberOfVertices = numberOfVertices * 2;\n else if (repeat_mode == \"AXES_3D\")\n numberOfVertices = numberOfVertices * 3;\n baseSize = glyphsetData.metadata.base_size;\n offset = glyphsetData.metadata.offset;\n scaleFactors = glyphsetData.metadata.scale_factors;\n const loader = new JSONLoader();\n this.geometry = new THREE.BufferGeometry();\n const instancedMesh = new THREE.InstancedMesh(this.geometry, undefined, numberOfVertices);\n this.setMorph(instancedMesh);\n if (isInline) {\n var object = loader.parse(glyphURL);\n (meshloader(finishCallback, displayLabels))(object.geometry, object.materials);\n object.geometry.dispose();\n } else {\n loader.crossOrigin = \"Anonymous\";\n loader.load(glyphURL, meshloader(finishCallback, displayLabels));\n }\n }\n\n /**\n * Calculate the actual transformation value that can be applied\n * to the transformation matrix.\n *\n * @returns {Array}\n */\n const resolve_glyph_axes = (point, axis1, axis2, axis3, scale, return_arrays) => {\n if (repeat_mode == \"NONE\" || repeat_mode == \"MIRROR\") {\n let axis_scale = [0.0, 0.0, 0.0];\n let final_axis1 = [0.0, 0.0, 0.0];\n let final_axis2 = [0.0, 0.0, 0.0];\n let final_axis3 = [0.0, 0.0, 0.0];\n let final_point = [0.0, 0.0, 0.0];\n const mirrored_axis1 = [0.0, 0.0, 0.0];\n const mirrored_axis2 = [0.0, 0.0, 0.0];\n const mirrored_axis3 = [0.0, 0.0, 0.0];\n const mirrored_point = [0.0, 0.0, 0.0];\n for (var j = 0; j < 3; j++) {\n var sign = (scale[j] < 0.0) ? -1.0 : 1.0;\n axis_scale[j] = (sign * baseSize[j] + scale[j] * scaleFactors[j]) * this.globalScale;\n }\n for (var j = 0; j < 3; j++) {\n final_axis1[j] = axis1[j] * axis_scale[0];\n final_axis2[j] = axis2[j] * axis_scale[1];\n final_axis3[j] = axis3[j] * axis_scale[2];\n final_point[j] = point[j]\n + offset[0] * final_axis1[j]\n + offset[1] * final_axis2[j]\n + offset[2] * final_axis3[j];\n if (repeat_mode == \"MIRROR\") {\n mirrored_axis1[j] = -final_axis1[j];\n mirrored_axis2[j] = -final_axis2[j];\n mirrored_axis3[j] = -final_axis3[j];\n mirrored_point[j] = final_point[j];\n if (scale[0] < 0.0) {\n // shift glyph origin to end of axis1\n final_point[j] -= final_axis1[j];\n mirrored_point[j] -= mirrored_axis1[j];\n }\n }\n }\n /* if required, reverse axis3 to maintain right-handed coordinate system */\n if (0.0 > (\n final_axis3[0] * (final_axis1[1] * final_axis2[2] -\n final_axis1[2] * final_axis2[1]) +\n final_axis3[1] * (final_axis1[2] * final_axis2[0] -\n final_axis1[0] * final_axis2[2]) +\n final_axis3[2] * (final_axis1[0] * final_axis2[1] -\n final_axis1[1] * final_axis2[0]))) {\n final_axis3[0] = -final_axis3[0];\n final_axis3[1] = -final_axis3[1];\n final_axis3[2] = -final_axis3[2];\n }\n return_arrays[0] = [final_point, final_axis1, final_axis2, final_axis3];\n if (repeat_mode == \"MIRROR\") {\n if (0.0 > (\n mirrored_axis3[0] * (mirrored_axis1[1] * mirrored_axis2[2] -\n mirrored_axis1[2] * mirrored_axis2[1]) +\n mirrored_axis3[1] * (mirrored_axis1[2] * mirrored_axis2[0] -\n mirrored_axis1[0] * mirrored_axis2[2]) +\n mirrored_axis3[2] * (mirrored_axis1[0] * mirrored_axis2[1] -\n mirrored_axis1[1] * mirrored_axis2[0]))) {\n mirrored_axis3[0] = -mirrored_axis3[0];\n mirrored_axis3[1] = -mirrored_axis3[1];\n mirrored_axis3[2] = -mirrored_axis3[2];\n }\n return_arrays[1] = [mirrored_point, mirrored_axis1, mirrored_axis2, mirrored_axis3];\n }\n }\n else if (repeat_mode == \"AXES_2D\" || repeat_mode == \"AXES_3D\") {\n let axis_scale = [0.0, 0.0, 0.0];\n let final_point = [0.0, 0.0, 0.0];\n for (var j = 0; j < 3; j++) {\n var sign = (scale[j] < 0.0) ? -1.0 : 1.0;\n axis_scale[j] = (sign * baseSize[0] + scale[j] * scaleFactors[0]) * this.globalScale;\n }\n for (var j = 0; j < 3; j++) {\n final_point[j] = point[j]\n + offset[0] * axis_scale[0] * axis1[j]\n + offset[1] * axis_scale[1] * axis2[j]\n + offset[2] * axis_scale[2] * axis3[j];\n }\n const number_of_glyphs = (glyph_repeat_mode == \"AXES_2D\") ? 2 : 3;\n for (let k = 0; k < number_of_glyphs; k++) {\n let use_axis1, use_axis2;\n const use_scale = scale[k];\n let final_axis1 = [0.0, 0.0, 0.0];\n let final_axis2 = [0.0, 0.0, 0.0];\n let final_axis3 = [0.0, 0.0, 0.0];\n if (k == 0) {\n use_axis1 = axis1;\n use_axis2 = axis2;\n }\n else if (k == 1) {\n use_axis1 = axis2;\n use_axis2 = (glyph_repeat_mode == \"AXES_2D\") ? axis1 : axis3;\n }\n else // if (k == 2)\n {\n use_axis1 = axis3;\n use_axis2 = axis1;\n }\n const final_scale1 = (baseSize[0] + use_scale * scaleFactors[0]) * this.globalScale;\n final_axis1[0] = use_axis1[0] * final_scale1;\n final_axis1[1] = use_axis1[1] * final_scale1;\n final_axis1[2] = use_axis1[2] * final_scale1;\n final_axis3[0] = final_axis1[1] * use_axis2[2] - use_axis2[1] * final_axis1[2];\n final_axis3[1] = final_axis1[2] * use_axis2[0] - use_axis2[2] * final_axis1[0];\n final_axis3[2] = final_axis1[0] * use_axis2[1] - final_axis1[1] * use_axis2[0];\n let magnitude = Math.sqrt(final_axis3[0] * final_axis3[0] + final_axis3[1] * final_axis3[1] + final_axis3[2] * final_axis3[2]);\n if (0.0 < magnitude) {\n let scaling = (baseSize[2] + use_scale * scaleFactors[2]) * this.globalScale / magnitude;\n if ((repeat_mode == \"AXES_2D\") && (k > 0)) {\n scaling *= -1.0;\n }\n final_axis3[0] *= scaling;\n final_axis3[1] *= scaling;\n final_axis3[2] *= scaling;\n }\n\n final_axis2[0] = final_axis3[1] * final_axis1[2] - final_axis1[1] * final_axis3[2];\n final_axis2[1] = final_axis3[2] * final_axis1[0] - final_axis1[2] * final_axis3[0];\n final_axis2[2] = final_axis3[0] * final_axis1[1] - final_axis3[1] * final_axis1[0];\n magnitude = Math.sqrt(final_axis2[0] * final_axis2[0] + final_axis2[1] * final_axis2[1] + final_axis2[2] * final_axis2[2]);\n if (0.0 < magnitude) {\n var scaling = (baseSize[1] + use_scale * scaleFactors[1]) * this.globalScale / magnitude;\n final_axis2[0] *= scaling;\n final_axis2[1] *= scaling;\n final_axis2[2] *= scaling;\n }\n return_arrays[k] = [final_point, final_axis1, final_axis2, final_axis3];\n }\n }\n return return_arrays;\n };\n\n /**\n * Update transformation for each of the glyph in this glyphset.\n */\n const updateGlyphsetTransformation = (\n current_positions,\n current_axis1s,\n current_axis2s,\n current_axis3s,\n current_scales\n ) => {\n let numberOfGlyphs = 1;\n if (repeat_mode == \"AXES_2D\" || repeat_mode == \"MIRROR\")\n numberOfGlyphs = 2;\n else if (repeat_mode == \"AXES_3D\")\n numberOfGlyphs = 3;\n const numberOfPositions = current_positions.length / 3;\n let current_glyph_index = 0;\n _glyph_axis_array.length = numberOfGlyphs;\n for (let i = 0; i < numberOfPositions; i++) {\n const current_index = i * 3;\n const current_position = [current_positions[current_index], current_positions[current_index + 1],\n current_positions[current_index + 2]];\n const current_axis1 = [current_axis1s[current_index], current_axis1s[current_index + 1],\n current_axis1s[current_index + 2]];\n const current_axis2 = [current_axis2s[current_index], current_axis2s[current_index + 1],\n current_axis2s[current_index + 2]];\n const current_axis3 = [current_axis3s[current_index], current_axis3s[current_index + 1],\n current_axis3s[current_index + 2]];\n const current_scale = [current_scales[current_index], current_scales[current_index + 1],\n current_scales[current_index + 2]];\n const arrays = resolve_glyph_axes(current_position, current_axis1, current_axis2,\n current_axis3, current_scale, _glyph_axis_array);\n if (arrays.length == numberOfGlyphs) {\n for (let j = 0; j < numberOfGlyphs; j++) {\n _transformMatrix.elements[0] = arrays[j][1][0];\n _transformMatrix.elements[1] = arrays[j][1][1];\n _transformMatrix.elements[2] = arrays[j][1][2];\n _transformMatrix.elements[3] = 0.0;\n _transformMatrix.elements[4] = arrays[j][2][0];\n _transformMatrix.elements[5] = arrays[j][2][1];\n _transformMatrix.elements[6] = arrays[j][2][2];\n _transformMatrix.elements[7] = 0.0;\n _transformMatrix.elements[8] = arrays[j][3][0];\n _transformMatrix.elements[9] = arrays[j][3][1];\n _transformMatrix.elements[10] = arrays[j][3][2];\n _transformMatrix.elements[11] = 0.0;\n _transformMatrix.elements[12] = arrays[j][0][0];\n _transformMatrix.elements[13] = arrays[j][0][1];\n _transformMatrix.elements[14] = arrays[j][0][2];\n _transformMatrix.elements[15] = 1.0;\n this.morph.setMatrixAt(current_glyph_index, _transformMatrix);\n const glyph = glyphList[current_glyph_index];\n if (glyph) {\n glyph.setTransformation(arrays[j][0], arrays[j][1],\n arrays[j][2], arrays[j][3]);\n }\n current_glyph_index++;\n }\n }\n }\n this.morph.instanceMatrix.needsUpdate = true;\n };\n\n /**\n * Update colour for each of the glyph in this glyphset.\n */\n const updateGlyphsetHexColors = current_colors => {\n let numberOfGlyphs = 1;\n if (repeat_mode == \"AXES_2D\" || repeat_mode == \"MIRROR\")\n numberOfGlyphs = 2;\n else if (repeat_mode == \"AXES_3D\")\n numberOfGlyphs = 3;\n const numberOfColours = current_colors.length;\n let current_glyph_index = 0;\n for (let i = 0; i < numberOfColours; i++) {\n const hex_values = current_colors[i];\n for (let j = 0; j < numberOfGlyphs; j++) {\n _bot_colour.setHex(hex_values)\n this.morph.setColorAt(current_glyph_index, _bot_colour);\n const glyph = glyphList[current_glyph_index];\n if (glyph)\n glyph.setColour(_bot_colour);\n current_glyph_index++;\n }\n }\n this.morph.instanceColor.needsUpdate = true;\n };\n\n /**\n * Update the current states of the glyphs in this glyphset, this includes transformation and\n * colour for each of them. This is called when glyphset and glyphs are initialised and whenever\n * the internal time has been updated.\n */\n const updateMorphGlyphsets = () => {\n let current_positions = _current_positions;\n let current_axis1s = _current_axis1s;\n let current_axis2s = _current_axis2s;\n let current_axis3s = _current_axis3s;\n let current_scales = _current_scales;\n let current_colors = _current_colors;\n\n const current_time = this.inbuildTime / this.duration * (numberOfTimeSteps - 1);\n const bottom_frame = Math.floor(current_time);\n const proportion = 1 - (current_time - bottom_frame);\n const top_frame = Math.ceil(current_time);\n if (morphVertices) {\n const bottom_positions = positions[bottom_frame.toString()];\n const top_positions = positions[top_frame.toString()];\n const bottom_axis1 = axis1s[bottom_frame.toString()];\n const top_axis1 = axis1s[top_frame.toString()];\n const bottom_axis2 = axis2s[bottom_frame.toString()];\n const top_axis2 = axis2s[top_frame.toString()];\n const bottom_axis3 = axis3s[bottom_frame.toString()];\n const top_axis3 = axis3s[top_frame.toString()];\n const bottom_scale = scales[bottom_frame.toString()];\n const top_scale = scales[top_frame.toString()];\n _current_positions.length = bottom_positions.length;\n _current_axis1s.length = bottom_positions.length;\n _current_axis2s.length = bottom_positions.length;\n _current_axis3s.length = bottom_positions.length;\n _current_scales.length = bottom_positions.length;\n\n for (let i = 0; i < bottom_positions.length; i++) {\n current_positions[i] = proportion * bottom_positions[i] + (1.0 - proportion) * top_positions[i];\n current_axis1s[i] = proportion * bottom_axis1[i] + (1.0 - proportion) * top_axis1[i];\n current_axis2s[i] = proportion * bottom_axis2[i] + (1.0 - proportion) * top_axis2[i];\n current_axis3s[i] = proportion * bottom_axis3[i] + (1.0 - proportion) * top_axis3[i];\n current_scales[i] = proportion * bottom_scale[i] + (1.0 - proportion) * top_scale[i];\n }\n } else {\n current_positions = positions[\"0\"];\n current_axis1s = axis1s[\"0\"];\n current_axis2s = axis2s[\"0\"];\n current_axis3s = axis3s[\"0\"];\n current_scales = scales[\"0\"];\n }\n updateGlyphsetTransformation(current_positions, current_axis1s, current_axis2s, current_axis3s,\n current_scales);\n this.boundingBoxUpdateRequired = true;\n if (colors != undefined) {\n if (morphColours) {\n const bottom_colors = colors[bottom_frame.toString()];\n const top_colors = colors[top_frame.toString()];\n current_colors.length = bottom_colors.length;\n for (let i = 0; i < bottom_colors.length; i++) {\n _bot_colour.setHex(bottom_colors[i]);\n _top_colour.setHex(top_colors[i]);\n _bot_colour.setRGB(_bot_colour.r * proportion + _top_colour.r * (1 - proportion),\n _bot_colour.g * proportion + _top_colour.g * (1 - proportion),\n _bot_colour.b * proportion + _top_colour.b * (1 - proportion));\n current_colors[i] = _bot_colour.getHex();\n }\n /*\n for (var i = 0; i < bottom_colors.length; i++) {\n current_colors.push(proportion * bottom_colors[i] + (1.0 - proportion) * top_colors[i]);\n }\n */\n } else {\n current_colors = colors[\"0\"];\n }\n updateGlyphsetHexColors(current_colors);\n }\n };\n\n /**\n * Get the assigned label for instance at index\n */\n this.getLabel = (index) => {\n if (labels && labels.length > index) {\n return labels[index];\n }\n return undefined;\n }\n\n\n /**\n * Display the label of the glyphs in the glyphset.\n */\n this.showLabel = () => {\n for (let i = 0; i < glyphList.length; i++) {\n glyphList[i].showLabel(this.morph.material ? this.morph.material.color : undefined);\n }\n }\n\n /**\n * Hide label with the choosen colour.\n */\n this.hideLabel = () => {\n for (let i = 0; i < glyphList.length; i++) {\n glyphList[i].hideLabel();\n }\n }\n\n /**\n * Create the glyphs in the glyphset.\n *\n * @param {Boolean} displayLabels -Flag to determine either the labels should be display or not.\n */\n const createGlyphs = (displayLabels) => {\n for (let i = 0; i < numberOfVertices; i++) {\n const glyph = new Glyph(undefined, undefined, i, this);\n let label = labels ? labels[i] : undefined;\n label = label ? label : this.groupName;\n if (label) {\n glyph.setLabel(label);\n }\n if (numberOfTimeSteps > 0) {\n glyph.setFrustumCulled(false);\n }\n glyphList[i] = glyph;\n this.morph.add(glyph.getGroup());\n }\n if (displayLabels) {\n this.showLabel();\n }\n //Update the transformation of the glyphs.\n updateGlyphsetTransformation(positions[\"0\"], axis1s[\"0\"],\n axis2s[\"0\"], axis3s[\"0\"], scales[\"0\"]);\n //Update the color of the glyphs.\n if (colors != undefined) {\n updateGlyphsetHexColors(colors[\"0\"]);\n }\n this.ready = true;\n this.boundingBoxUpdateRequired = true;\n };\n\n /**\n * Add a custom {@link Glyph} to this {@link Glyphset}.\n *\n * @param {Glyph} Glyph to be added.\n */\n this.addCustomGlyph = glyph => {\n if (glyph.isGlyph)\n glyphList.push(glyph);\n this.ready = true;\n this.boundingBoxUpdateRequired = true;\n }\n\n /**\n * Add a THREE.Mesh object to be displayed as glyph in this {@link Glyphset}.\n *\n * @param {THREE.Mesh} Mesh to be added.\n * @param {Number} id of the mesh.\n */\n this.addMeshAsGlyph = (mesh, id) => {\n if (mesh.isMesh) {\n const glyph = new Glyph(undefined, undefined, id, this);\n glyph.fromMesh(mesh);\n glyphList.push(glyph);\n this.morph.add(glyph.getGroup())\n this.ready = true;\n this.boundingBoxUpdateRequired = true;\n return glyph;\n }\n return undefined;\n }\n\n /**\n * A function which iterates through the list of glyphs and call the callback\n * function with the glyph as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the glyph\n * as an argument.\n */\n this.forEachGlyph = callbackFunction => {\n for (let i = 0; i < glyphList.length; i++) {\n callbackFunction(glyphList[i]);\n }\n }\n\n var meshloader = (finishCallback, displayLabels) => {\n return (geometry, materials) => {\n const tempGeometry = geometry.toBufferGeometry();\n this.geometry.copy(tempGeometry);\n this.geometry.computeBoundingSphere();\n this.geometry.computeBoundingBox();\n tempGeometry.dispose();\n if (materials && materials[0])\n this.morph.material = materials[0];\n createGlyphs(displayLabels);\n this.morph.name = this.groupName;\n this.morph.userData = this;\n this.setMorph(this.morph);\n geometry.dispose();\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(this);\n };\n }\n\n /**\n * Get the index of the closest vertex to centroid.\n */\n this.getClosestVertexIndex = function () {\n let closestIndex = -1;\n if (this.morph && this.ready) {\n this.getBoundingBox().getCenter(this._v1);\n let current_positions = positions[\"0\"];\n const numberOfPositions = current_positions.length / 3;\n let distance = -1;\n let currentDistance = 0;\n for (let i = 0; i < numberOfPositions; i++) {\n const current_index = i * 3;\n this._v2.set(current_positions[current_index],\n current_positions[current_index + 1],\n current_positions[current_index + 2]);\n currentDistance = this._v1.distanceTo(this._v2);\n if (distance == -1) {\n distance = currentDistance;\n closestIndex = i;\n } else if (distance > currentDistance) {\n distance = currentDistance;\n closestIndex = i;\n }\n }\n }\n return closestIndex;\n }\n\n /**\n * Get the closest vertex to centroid.\n */\n this.getClosestVertex = function () {\n\n if (this.closestVertexIndex == -1) {\n this.closestVertexIndex = this.getClosestVertexIndex();\n }\n if (this.closestVertexIndex >= 0) {\n /*\n if (glyphList && glyphList[this.closestVertexIndex]) {\n glyphList[this.closestVertexIndex].getBoundingBox().getCenter(position);\n }\n */\n if (this.morph) {\n let position = new THREE.Vector3();\n this.morph.getMatrixAt(this.closestVertexIndex, _transformMatrix);\n position.setFromMatrixPosition(_transformMatrix);\n return position;\n }\n }\n\n return undefined;\n }\n\n /**\n * Get the bounding box for the whole set of glyphs.\n *\n * @return {Three.Box3};\n */\n this.getBoundingBox = () => {\n if (this.morph && this.ready && this.morph.visible) {\n if (this.boundingBoxUpdateRequired) {\n _boundingBox1.setFromBufferAttribute(\n this.morph.geometry.attributes.position);\n for (let i = 0; i < numberOfVertices; i++) {\n this.morph.getMatrixAt(i, _transformMatrix);\n _boundingBox2.copy(_boundingBox1).applyMatrix4(_transformMatrix);\n if (i == 0) {\n _boundingBox3.copy(_boundingBox2);\n } else {\n _boundingBox3.union(_boundingBox2);\n }\n }\n if (_boundingBox3) {\n this.cachedBoundingBox.copy(_boundingBox3);\n this.morph.updateWorldMatrix(true, true);\n this.cachedBoundingBox.applyMatrix4(this.morph.matrixWorld);\n this.boundingBoxUpdateRequired = false;\n } else\n return undefined;\n }\n return this.cachedBoundingBox;\n }\n return undefined;\n }\n\n /**\n * Set the local time of this glyphset.\n *\n * @param {Number} time - Can be any value between 0 to duration.\n */\n this.setMorphTime = time => {\n if (time > this.duration)\n this.inbuildTime = this.duration;\n else if (0 > time)\n this.inbuildTime = 0;\n else\n this.inbuildTime = time;\n if (morphColours || morphVertices) {\n updateMorphGlyphsets();\n if (morphVertices)\n this.markerUpdateRequired = true;\n }\n }\n\n /**\n * Check if the glyphset is time varying.\n *\n * @return {Boolean}\n */\n this.isTimeVarying = () => {\n if (((this.ready === false) || (numberOfTimeSteps > 0)) &&\n (morphColours || morphVertices))\n return true;\n return false;\n }\n\n /**\n * Get the current inbuild time of the\n *\n * @return {Number}\n */\n this.getCurrentTime = () => {\n return this.inbuildTime;\n }\n\n /**\n * Set the objects scale.\n *\n * @return {THREE.Box3}.\n */\n this.setScaleAll = function(scale) {\n this.globalScale = scale;\n updateMorphGlyphsets();\n }\n\n /**\n * Clear this glyphset and its list of glyphs which will release them from the memory.\n */\n this.dispose = () => {\n for (let i = glyphList.length - 1; i >= 0; i--) {\n glyphList[i].dispose();\n }\n if (this.geometry)\n this.geometry.dispose();\n if (this.morph)\n this.morph.material.dispose();\n axis1s = undefined;\n axis2s = undefined;\n axis3s = undefined;\n positions = undefined;\n scales = undefined;\n colors = undefined;\n this.ready = false;\n this.groupName = undefined;\n }\n\n /**\n * Update the glyphsets if required the render.\n */\n this.render = (delta, playAnimation, options) => {\n if (playAnimation == true) {\n let targetTime = this.inbuildTime + delta;\n if (targetTime > this.duration)\n targetTime = targetTime - this.duration;\n this.inbuildTime = targetTime;\n if (morphColours || morphVertices) {\n updateMorphGlyphsets();\n }\n }\n this.updateMarker(playAnimation, options);\n }\n}\n\nGlyphset.prototype = Object.create(ZincObject.prototype);\nexport { Glyphset };\n","import {\n\tBufferGeometry,\n\tMatrix4,\n Object3D,\n PointsMaterial,\n Ray,\n\tSphere,\n\tVector3\n} from 'three';\n\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _tempA = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\t\tthis.sizePerPixel = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n const drawRange = geometry.drawRange;\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\t\t_sphere.radius += threshold;\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\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ) * this.material.size * this.sizePerPixel;\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 const morphPosition = geometry.morphAttributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\n calculatePosition( this, positionAttribute, morphPosition, a );\n\n\t\t\t\t\ttestPoint( _position, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n calculatePosition( this, positionAttribute, morphPosition, i );\n\n\t\t\t\t\ttestPoint( _position, 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\tconsole.error( 'THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\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\nPoints.prototype.isPoints = true;\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.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 calculatePosition( object, position, morphPosition, a )\t{\n\n _position.fromBufferAttribute( position, a );\n\n const morphInfluences = object.morphTargetInfluences;\n\n if ( object.material.morphTargets && morphPosition && morphInfluences ) {\n\n _morphA.set( 0, 0, 0 );\n\n for ( var i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n const influence = morphInfluences[ i ];\n const morphAttribute = morphPosition[ i ];\n\n if ( influence === 0 ) continue;\n\n _tempA.fromBufferAttribute( morphAttribute, a );\n\n _morphA.addScaledVector( _tempA.sub( _position ), influence );\n\n }\n\n _position.add( _morphA );\n\n }\n\n}\n\nexport { Points };","import * as THREE from 'three';\nimport { Label } from './label';\nimport { Points } from '../three/Points';\nimport { ZincObject } from './zincObject';\nimport { getCircularTexture, toBufferGeometry } from '../utilities';\n\n/**\n * Provides an object which stores points and provides method which controls its position.\n * This is created when a valid json file containing point is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Pointset}\n */\nconst Pointset = function () {\n ZincObject.call(this);\n this.isPointset = true;\n const labelSets = [];\n let labelSize = 1.0;\n let labelDepthTest = false;\n let fontWeight = 500;\n let labelVisibility = true;\n\n /**\n * Create the pointsets using geometry and material.\n *\n * @param {THREE.Geomtry} geometryIn - Geometry of points to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n this.createMesh = (geometryIn, materialIn, options) => {\n if (geometryIn && materialIn) {\n let geometry = toBufferGeometry(geometryIn, options);\n const texture = getCircularTexture();\n materialIn.map = texture;\n let point = new Points(geometry, materialIn);\n this.setMesh(point, options.localTimeEnabled,\n options.localMorphColour);\n }\n }\n\n const addLabel = (index, coord, labelText, colourHex) => {\n if (labelText) {\n const colour = new THREE.Color(colourHex);\n const label = new Label(labelText, colour);\n label.setPosition(coord[0], coord[1], coord[2]);\n const sprite = label.getSprite();\n sprite.material.sizeAttenuation = false;\n sprite.material.alphaTest = 0.5;\n sprite.material.transparent = true;\n sprite.material.depthWrite = false;\n sprite.material.depthTest = labelDepthTest;\n label.setFontWeight(fontWeight);\n label.setSize(labelSize);\n label.setVisibility(labelVisibility);\n this.group.add(sprite);\n labelSets[index] = label;\n }\n }\n\n const removeLabel = (index) => {\n const label = labelSets[index];\n if (label) {\n const sprite = label.getSprite();\n this.group.remove(sprite);\n label.dispose();\n labelSets.splice(index, 1);\n }\n }\n\n /**\n * Add points to existing mesh if it exists, otherwise\n * create a new one and add to it.\n * @param {Array} coords -An array of three components coordinates.\n * @param {Array|String} labels - An array of strings, these are only added\n * if the number of coords equals to the number labels provided.\n * @param {Number} colour - A hex value of the colour for the points\n */\n this.addPoints = (coords, labels, colour) => {\n if (coords && coords.length > 0) {\n let current = this.drawRange;\n if (current === -1) {\n current = 0;\n }\n const geometry = this.addVertices(coords);\n let mesh = this.getMorph();\n if (!mesh) {\n let material = new THREE.PointsMaterial({ alphaTest: 0.5, size: 10,\n color: colour, sizeAttenuation: false });\n const options = { localTimeEnabled: false, localMorphColour: false};\n geometry.colorsNeedUpdate = true;\n this.createMesh(geometry, material, options);\n }\n\n let end = current + coords.length;\n let index = 0;\n if ((Array.isArray(labels) && labels.length === coords.length) ||\n (typeof labels === \"string\")) {\n const size = labelSets.length;\n for (current; current + index < end;) {\n const labelText = typeof labels === \"string\" ? labels : labels[index];\n addLabel(current + index, coords[index], labelText, this._lod._material.color);\n index++;\n }\n }\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n }\n\n /**\n * Set the colour of the pointset and its label using the hex value\n *\n * @param {Number} hex - hex value of color to be set\n */\n this.setColourHex = function(hex) {\n this._lod._material.color.setHex(hex);\n if (this._lod._secondaryMaterial) {\n this._lod._secondaryMaterial.color.setHex(hex);\n }\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setColour(this._lod._material.color);\n }\n }\n }\n\n /**\n * Set the colour of the pointset and its label\n *\n * @param {THREE.Color} colour - colour to be set\n */\n this.setColour = (colour) => {\n this._lod.setColour(colour);\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setColour(this._lod._material.color);\n }\n }\n }\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Boolean} flag - Determin either size attenuation\n * should be on or off.\n */\n this.setLabelDepthTest = (flag) => {\n labelDepthTest = flag;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setDepthTest(flag);\n }\n }\n }\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Number} fontWeightIn - Default value is 700\n */\n this.setLabelFontWeight = (fontWeightIn) => {\n fontWeight = fontWeightIn;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setFontWeight(fontWeightIn);\n }\n }\n }\n\n /**\n * Set the size of the label\n *\n * @param {Number} size - Size to set, default\n * value is 1.\n */\n this.setLabelSize = (size) => {\n labelSize = size;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setSize(labelSize);\n }\n }\n }\n\n /**\n * Set visibility of Labels\n *\n * @param {boolean} flag - default value is true\n */\n this.displayLabels = (flag) => {\n labelVisibility = flag;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setVisibility(labelVisibility);\n }\n }\n }\n /**\n * Set the size of the points.\n *\n * @param {Number} size - size to be set.\n */\n this.setSize = size => {\n if (this.morph && this.morph.material) {\n this.morph.material.size = size;\n this.morph.material.needsUpdate = true;\n }\n }\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Boolean} flag - Determin either size attenuation\n * should be on or off.\n */\n this.setSizeAttenuation = flag => {\n if (this.morph && this.morph.material) {\n this.morph.material.sizeAttenuation = flag;\n this.morph.material.needsUpdate = true;\n }\n }\n\n /**\n * Get vertices at index\n */\n this.getVerticesByIndex = function(index) {\n if (index >= 0 && this.drawRange > index) {\n const positionAttribute = this.getMorph().geometry.getAttribute( 'position' );\n return [\n positionAttribute.getX(index),\n positionAttribute.getY(index),\n positionAttribute.getZ(index)\n ];\n }\n return undefined;\n }\n\n /**\n * Edit Vertice in index.\n */\n this.editVertices = function(coords, i) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n const maxIndex = i + coords.length - 1;\n if (!mesh || 0 > i || maxIndex >= this.drawRange) {\n return;\n } else {\n const positionAttribute = mesh.geometry.getAttribute( 'position' );\n let index = i;\n coords.forEach(coord => {\n const label = labelSets[index];\n if (label) {\n label.setPosition(coord[0], coord[1], coord[2]);\n }\n positionAttribute.setXYZ(index++, coord[0], coord[1], coord[2]);\n\n });\n positionAttribute.needsUpdate = true;\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n }\n\n /**\n * Delete a vertex in index.\n */\n this.deleteVertices = function(index) {\n let removed = Pointset.prototype.deleteVertices.call(this, index);\n if (removed) {\n removeLabel(index);\n }\n return this.drawRange;\n }\n\n /**\n * Set the name for this ZincObject.\n *\n * @param {String} groupNameIn - Name to be set.\n */\n this.setName = function(groupNameIn) {\n const oldName = this.groupName;\n Pointset.prototype.setName.call(this, groupNameIn);\n labelSets.forEach(label => {\n if (label.getString() === oldName) {\n label?.setText(groupNameIn);\n }\n })\n }\n\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Boolean} flag - Determin either size attenuation\n * should be on or off.\n */\n this.render = (delta, playAnimation, cameraControls, options) => {\n if (this.morph && cameraControls) {\n this.morph.sizePerPixel = cameraControls.pixelHeight;\n }\n Pointset.prototype.render.call(this, delta, playAnimation, cameraControls, options);\n }\n\n}\n\nPointset.prototype = Object.create(ZincObject.prototype);\nexport { Pointset };\n","import * as THREE from 'three';\nimport { toBufferGeometry } from '../utilities';\nimport { augmentMorphColor } from './augmentShader';\nimport { LineSegments } from '../three/line/LineSegments';\nimport { ZincObject } from './zincObject';\n\n/**\n * Provides an object which stores lines.\n * This is created when a valid json file containing lines is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Lines}\n */\nconst Lines = function () {\n ZincObject.call(this);\n\tthis.isLines = true;\n\n /**\n * Create the line segements using geometry and material.\n *\n * @param {THREE.Geomtry} geometryIn - Geometry of lines to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n\tthis.createLineSegment = (geometryIn, materialIn, options) => {\n\t\tif (geometryIn && materialIn) {\n\t\t\tlet geometry = toBufferGeometry(geometryIn, options);\n\t\t\tif (options.localMorphColour && geometry.morphAttributes[ \"color\" ])\n\t\t\t\tmaterialIn.onBeforeCompile = augmentMorphColor();\n let line = new LineSegments(geometry, materialIn);\n this.setMesh(line, options.localTimeEnabled, options.localMorphColour);\n\t\t}\n\t}\n\n /**\n * Set the width for the lines.\n *\n * @param {Number} width - Width of the lines.\n */\n\tthis.setWidth = width => {\n\t\tif (this.morph && this.morph.material) {\n\t\t\tthis.morph.material.linewidth = width;\n\t\t\tthis.morph.material.needsUpdate = true;\n\t\t}\n\t}\n\n /**\n * Add new lines to existing lines if it exists, otherwise\n * create a new one and add to it.\n * @param {Array} coords -An array of three components coordinates.\n\n * @param {Number} colour - A hex value of the colour for the points\n */\n\tthis.addLines = (coords, colour) => {\n if (coords && coords.length > 0) {\n const geometry = this.addVertices(coords);\n let mesh = this.getMorph();\n if (!mesh) {\n let material = new THREE.LineBasicMaterial({color:colour});\n const options = { localTimeEnabled: false, localMorphColour: false};\n geometry.colorsNeedUpdate = true;\n this.createLineSegment(geometry, material, options);\n }\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n\t}\n}\n\nLines.prototype = Object.create(ZincObject.prototype);\nexport { Lines };\n","import * as THREE from 'three';\n\n/**\n * Base texture object for importing images and turning them into\n * texures unit that can be used by other texture primitives.\n *\n * @class\n * @author Alan Wu\n * @return {Texture}\n */\nconst Texture = function () {\n this.isTexture = true;\n this.impl = undefined;\n this.isLoading = false;\n this.size = {\n width: 1,\n height: 1,\n depth: 0\n };\n}\n\n/**\n * Read an image from src.\n *\n * @async\n * @param {Image} img - An image object.\n * @param {String} src - Source location of the image.\n *\n * @return {Promise} img on resolve.\n */\nTexture.prototype.loadImage = function (img, src) {\n return new Promise((resolve, reject) => {\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n })\n}\n\n/**\n @typedef IMAGE_UINT8_RETURN\n @type {Set}\n @property {Uint8Array} array - Array containing the uint8 image value.\n @property {Number} width - Phyiscal image width.\n @property {Number} height - Phyiscal image height.\n */\n/**\n * Read an image from src and turn it into Uint8Array.\n *\n * @async\n * @param {Image} img - An image object.\n * @param {String} src - Source location of the image.\n * @param {Canvas} canvas - Canvas html element used for the conversion.\n *\n * @return {IMAGE_UNIT8_RETURN}\n */\nTexture.prototype.imageToUint8Array = async function (instance, img, src, canvas) {\n await instance.loadImage(img, src);\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n return {\n array: new Uint8Array(ctx.getImageData(0, 0, canvas.width, canvas.height).data.buffer),\n width: canvas.width,\n height: canvas.height\n };\n}\n\nTexture.prototype.loadFromImages = async function (srcArrays) {\n return\n}\n\n/**\n * Return true if the texture is ready for consumption.\n *\n * @return {Boolean}\n */\nTexture.prototype.isReady = function () {\n if (this.impl && !this.isLoading)\n return true;\n return false;\n}\n\n/**\n * Return true if the texture is ready for consumption, otherwise false.\n *\n * @return {Boolean}\n */\nTexture.prototype.getMaterial = function () {\n if (this.impl) {\n return new THREE.MeshBasicMaterial({\n color: new THREE.Color(1, 1, 1),\n transparent: false,\n opacity: 1.0,\n map: this.impl,\n side: THREE.DoubleSide\n });\n }\n}\n\nexport { Texture };\n","import * as THREE from 'three';\nimport { Texture } from './texture';\n\n/**\n * Texture array object for holding array of images into\n * texures unit that can be used by other texture primitives.\n *\n * @class\n * @author Alan Wu\n * @return {TextureArray}\n */\nconst TextureArray = function () {\n Texture.call(this);\n this.isTextureArray = true;\n\n\n /**\n * Read images from an array containg src locations.\n *\n * @async\n * @param {Array} srcArrays - List of source location of the images.\n */\n this.loadFromImages = async (srcArrays) => {\n let w = 1;\n let h = 1;\n let d = 0;\n if (srcArrays && srcArrays.length) {\n this.isLoading = true;\n const image = new Image();\n image.crossOrigin = \"Anonymous\";\n const canvas = document.createElement(\"canvas\");\n let length = 0;\n const dataStacks = new Array(srcArrays.length);\n for (let i = 0; i < srcArrays.length; i++) {\n const data = await this.imageToUint8Array(this, image, srcArrays[i], canvas);\n if (data && data.array) {\n w = data.width;\n h = data.height;\n dataStacks[d] = data.array;\n length += dataStacks[d].length;\n d++;\n }\n }\n const fullArray = new Uint8Array(length);\n length = 0;\n dataStacks.forEach(data => {\n fullArray.set(data, length);\n length += data.length;\n });\n\n this.impl = new THREE.DataTexture2DArray(fullArray, w, h, d);\n this.size = {\n width: w,\n height: h,\n depth: d\n };\n this.isLoading = false;\n this.impl.needsUpdate = true;\n }\n }\n\n /**\n * Get and create the material containing shaders and the textures.\n * The texture must be read and ready before calling this function.\n *\n *\n * @param {Object} options - Customise the material with the options object.\n * @param {String} options.fs - string of the fragment shader used for\n * visualisation.\n * @param {String} options.vs - string of the vertex shader used for\n * visualisation.\n * @param {Object} options.uniforms - Containing the data to be passed into the shaders.\n * @param {String} options.glslVersion - Version of glsl used for compile this shader.\n *\n */\n this.getMaterial = (options) => {\n if (this.impl) {\n let material = undefined;\n if (options) {\n if (options.vs && options.fs) {\n let transparent = true;\n if (\"transparent\" in options) {\n transparent = options.transparent;\n }\n let side = THREE.FrontSide;\n if (options.side)\n side = options.side;\n material = new THREE.ShaderMaterial({\n transparent,\n uniforms: options.uniforms,\n vertexShader: options.vs,\n fragmentShader: options.fs,\n side\n });\n if (options.glslVersion) {\n material.glslVersion = options.glslVersion;\n }\n }\n } else {\n material = new THREE.MeshBasicMaterial({\n color: new THREE.Color(1, 1, 1),\n transparent: false,\n opacity: 1.0,\n map: this.impl,\n side: THREE.DoubleSide\n });\n }\n if (material) {\n material.needsUpdate = true;\n return material;\n }\n }\n }\n}\n\nTextureArray.prototype = Object.create(Texture.prototype);\nexport { TextureArray };\n","import * as THREE from 'three';\nconst glslVersion = THREE.GLSL3;\n\nconst fs =\n`\nprecision highp float;\nprecision highp int;\nprecision highp sampler2DArray;\n\nuniform sampler2DArray diffuse0;\nuniform sampler2DArray diffuse1;\nuniform sampler2DArray mask;\nuniform bool discardAlpha;\nuniform bool maskEnabled;\nuniform float brightness;\nuniform float contrast;\nuniform float time;\nuniform int nChannels;\nin vec3 vUw;\n\nout vec4 outColor;\n\nvoid main() {\n\n float color0 = texture( diffuse0, vUw ).r;\n float color1 = texture( diffuse1, vUw ).r;\n float color = mix(color0, color1, time);\n // discard if alpha is zero\n if (maskEnabled && discardAlpha) {\n float mask = texture(mask, vUw).r;\n if (mask == 0.0) discard;\n }\n\n // discard if alpha is zero\n //if (discardAlpha && color.a == 0.0) discard;\n // Apply brightness\n vec3 brightenedColor = vec3(color) + vec3(brightness);\n // Apply contrast\n vec3 contrastedColor = (brightenedColor - vec3(0.5)) * contrast + vec3(0.5);\n outColor = vec4(contrastedColor, 1.0);\n}\n`;\n\nconst vs =\n`\nout vec3 vUw;\nuniform float depth;\nuniform vec3 slide;\nuniform int direction;\nuniform bool flipY;\nuniform bool flipZ;\n\nvoid main() {\n\n vec3 slidePos = position.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position.xyz, 1.0 );\n\n if (direction == 1)\n slidePos = vec3(slide.x, position.y, position.x);\n if (direction == 2)\n slidePos = vec3(position.x, slide.y, position.y);\n if (direction == 3)\n slidePos = vec3(position.x, position.y, slide.z);\n\n if (flipY)\n slidePos.y = 1.0 - slidePos.y;\n if (flipZ)\n slidePos.z = 1.0 - slidePos.z;\n\n vUw.xyz = vec3(slidePos.x, slidePos.y, slidePos.z * depth);\n\n}\n`;\n\nconst getUniforms = function() {\n return {\n brightness: { value: 0},\n contrast: { value: 1},\n depth: { value: 1 },\n discardAlpha: {value: true},\n diffuse0: { value: undefined },\n diffuse1: { value: undefined },\n direction: { value: 1 },\n flipY: { value: true },\n flipZ: { value: false },\n nChannels: { value: 1 },\n mask: { value: undefined },\n maskEnabled: { value: false },\n slide: { value: new THREE.Vector3( 0, 0, 1 ) },\n time: { value: 0 }\n };\n}\n\nexport {\n fs,\n vs,\n glslVersion,\n getUniforms\n}\n","import { resolveURL } from '../utilities';\nimport { TextureArray } from '../texture/textureArray';\nimport { ZincObject } from './zincObject';\n/**\n * Provides a base class object which stores textures and rendering object.\n *\n * @class\n * @author Alan Wu\n * @return {TexturePrimitive}\n */\nconst TexturePrimitive = function (textureIn) {\n ZincObject.call(this);\n this.isTexturePrimitive = true;\n this.texture = textureIn;\n //List of textureArray object, which is used for\n //time variation for textureSlides object\n this.textureList = [];\n if (this.texture) {\n this.textureList.push(this.texture);\n }\n\n /**\n * Load texture data into this primitves.\n *\n * @param {Object} textureData - contains the informations about the textures.\n * @param {Function} finishCallback - User's function to be called once texture's\n * is loaded.\n */\n this.load = (textureData, finishCallback, isInline) => {\n if (textureData) {\n if (textureData.images && textureData.images.source) {\n const texture = new TextureArray();\n const imgArray = [];\n textureData.images.source.forEach(img => {\n imgArray.push(resolveURL(img));\n });\n const _this = this;\n texture.loadFromImages(imgArray).then(() => {\n _this.texture = texture;\n _this.textureList.push(this.texture);\n _this.initialise(textureData, finishCallback);\n });\n }\n }\n }\n\n this.addTextureArray = (tArray) => {\n if (this.textureList.length === 0 && this.texture) {\n this.textureList.push(this.texture);\n }\n if (tArray && tArray.isTextureArray) {\n this.textureList.push(tArray);\n }\n }\n\n /**\n * Initialise a texture based on the provided textureData, this should be used\n * internally only.\n *\n * @param {Object} textureData - contains the informations about the textures.\n * @param {Function} finishCallback - User's function to be called once texture's\n * is loaded.\n */\n this.initialise = (textureData, finishCallback) => {\n if (finishCallback != undefined && (typeof finishCallback == 'function')) {\n finishCallback(this);\n }\n }\n}\n\nTexturePrimitive.prototype = Object.create(ZincObject.prototype);\nTexturePrimitive.prototype.constructor = TexturePrimitive;\nexport { TexturePrimitive };\n","import * as THREE from 'three';\nimport * as shader from '../shaders/textureSlide.js';\nimport { TexturePrimitive } from './texturePrimitive';\n\n/**\n * Provides a class which create a texture stacks in a block\n * with shaders allowing slices of texture to be displayed.\n *\n * @param {TextureArray} textureIn - An object of texture array\n * holding texture information.\n *\n * @class\n * @author Alan Wu\n * @return {TextureSlides}\n */\nconst TextureSlides = function (textureIn) {\n TexturePrimitive.call(this, textureIn);\n this.isTextureSlides = true;\n const textureSettings = [];\n const idTextureMap = {};\n this.morph = new THREE.Group();\n this.group = this.morph;\n this.morph.userData = this;\n let edgesLine = undefined;\n let flipY = true;\n let flipZ = false;\n let brightness = 0.0;\n let contrast = 1.0;\n let nChannels = 1;\n let maskTexture = undefined;\n let maskEnabled = false;\n let discardAlpha = true;\n let lt0 = 0;\n let lt1 = 0;\n let prevTime = -0.1;\n\n /**\n @typedef SLIDE_SETTINGS\n @type {Set}\n @property {String} direction - the value must be x, y or z, specify the\n direction the slide should be facing.\n @property {Number} value - Normalised value of the location on direction.\n @property {String} id - ID of the mesh, it is only available if the settings\n is returned from {@link TextureSlides.createSlide} or\n {@link TextureSlides.getTextureSettings}.\n */\n /**\n * Create the slides required for visualisation based on the slide settings.\n * The slides themselves are {THREE.PlanGeometry} objects.\n *\n * @param {SLIDE_SETTINGS} slideSettings - An array to each slide settings.\n */\n this.createSlides = slideSettings => {\n slideSettings.forEach(slide => this.createSlide(slide));\n }\n\n /**\n * Set the value of the uniforms for a specific mesh in this\n * texture slide object.\n *\n * @param {THREE.Mesh} mesh - Mesh to be modified\n * @param {SLIDE_SETTINGS} slideSettings - Slide settings.\n */\n const setUniformSlideSettingsOfMesh = (mesh, settings) => {\n const material = mesh.material;\n const uniforms = material.uniforms;\n mesh.rotation.x = 0;\n mesh.rotation.y = 0;\n mesh.rotation.z = 0;\n mesh.position.x = 0;\n mesh.position.y = 0;\n mesh.position.z = 0;\n switch (settings.direction) {\n case \"x\":\n const rotation = -Math.PI / 2;\n mesh.rotation.y = rotation;\n uniforms.direction.value = 1;\n uniforms.slide.value.set(settings.value, 0, 0);\n mesh.position.x = settings.value;\n break;\n case \"y\":\n mesh.rotation.x = Math.PI / 2;\n uniforms.direction.value = 2;\n uniforms.slide.value.set(0, settings.value, 0);\n mesh.position.y = settings.value;\n break;\n case \"z\":\n uniforms.direction.value = 3;\n uniforms.slide.value.set(0, 0, settings.value);\n mesh.position.z = settings.value;\n break;\n default:\n break;\n }\n material.needsUpdate = true;\n this.boundingBoxUpdateRequired = true;\n }\n\n /**\n * Modify the mesh based on a setting\n *\n * @param {SLIDE_SETTINGS} settings - s.\n */\n this.modifySlideSettings = (settings) => {\n if (settings && settings.id &&\n settings.id in idTextureMap &&\n idTextureMap[settings.id]) {\n setUniformSlideSettingsOfMesh(idTextureMap[settings.id], settings);\n }\n }\n\n /**\n * Create a slide required for visualisation based on the slide settings.\n * The slide itself is an {THREE.PlanGeometry} object.\n *\n * @param {SLIDE_SETTINGS} settings -settings of the slide to be created.\n * @return {SLIDE_SETTINGS} - Returned settings, it includes the newly\n * created mesh's id.\n */\n this.createSlide = settings => {\n if (this.texture && this.texture.isTextureArray && this.texture.isReady()) {\n if (settings && settings.direction && settings.value !== undefined) {\n const geometry = new THREE.PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n const uniforms = shader.getUniforms();\n uniforms.brightness.value = brightness;\n uniforms.contrast.value = contrast;\n uniforms.diffuse0.value = this.texture.impl;\n uniforms.diffuse1.value = this.texture.impl;\n uniforms.discardAlpha.value = discardAlpha;\n uniforms.depth.value = this.texture.size.depth;\n uniforms.flipY.value = flipY;\n uniforms.flipZ.value = flipZ;\n uniforms.mask.value = maskTexture;\n uniforms.maskEnabled.value = maskEnabled;\n uniforms.nChannels.value = nChannels;\n const options = {\n fs: shader.fs,\n vs: shader.vs,\n uniforms: uniforms,\n glslVersion: shader.glslVersion,\n side: THREE.DoubleSide,\n transparent: false\n };\n const material = this.texture.getMaterial(options);\n material.needsUpdate = true;\n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = this.groupName;\n mesh.userData = this;\n const slideSettings = {\n value: settings.value,\n direction: settings.direction,\n id: mesh.id,\n };\n textureSettings.push(slideSettings);\n setUniformSlideSettingsOfMesh(mesh, slideSettings);\n idTextureMap[mesh.id] = mesh;\n this.morph.add(mesh);\n this.boundingBoxUpdateRequired = true;\n this.updateTimeTexture();\n return slideSettings;\n }\n }\n }\n\n /**\n * Return a copy of texture settings used by this object.\n *\n * @return {SLIDE_SETTINGS} - Returned the list of settings.\n */\n this.getTextureSettings = () => {\n return [...textureSettings];\n }\n\n /**\n * Return a copy of texture settings with corresponding id used by this object.\n *\n * @return {SLIDE_SETTINGS} - Returned a copy of settings with corresponding id.\n */\n this.getTextureSettingsWithId = (id) => {\n for (let i = 0; i < textureSettings.length; i++) {\n if (id === textureSettings[i].id) {\n return {...textureSettings[i]};\n }\n }\n }\n\n /**\n * Get the array of slides, return them in an array\n *\n * @return {Array} - Return an array of {@link THREE.Object)\n */\n this.getSlides = () => {\n if (this.morph) return [...this.morph.children];\n return [];\n }\n\n /**\n * Remove a slide, this will dispose the slide and its material.\n *\n * @param {Slide} slide - Slide to be remvoed\n */\n this.removeSlide = slide => {\n if (slide) {\n this.removeSlideWithId(slide.id);\n }\n }\n\n /**\n * Remove a slide, this will dispose the slide and its material.\n *\n * @param {Number} id - id of slide to be remvoed\n */\n this.removeSlideWithId = id => {\n if (this.morph && id in idTextureMap && idTextureMap[id]) {\n if (this.morph.getObjectById(id)) {\n const slide = idTextureMap[id];\n this.morph.remove(slide);\n slide.clear();\n if (slide.geometry)\n slide.geometry.dispose();\n if (slide.material)\n slide.material.dispose();\n this.boundingBoxUpdateRequired = true;\n }\n const index = textureSettings.findIndex(item => item.id === id);\n if (index > -1) {\n textureSettings.splice(index, 1);\n }\n }\n }\n\n /**\n * Clean up all internal objects.\n */\n this.dispose = () => {\n this.morph.children.forEach(slide => {\n if (slide.geometry)\n slide.geometry.dispose();\n if (slide.material)\n slide.material.dispose();\n });\n TexturePrimitive.prototype.dispose.call(this);\n this.boundingBoxUpdateRequired = true;\n }\n\n //Expand the boundingbox with slide settings\n const expandBoxWithSettings = (box, settings, vector) => {\n if (settings) {\n switch (settings.direction.value) {\n case 1:\n vector.copy(settings.slide.value);\n box.expandByPoint(vector);\n vector.setY(1.0);\n vector.setZ(1.0);\n box.expandByPoint(vector);\n break;\n case 2:\n vector.copy(settings.slide.value);\n box.expandByPoint(vector);\n vector.setX(1.0);\n vector.setZ(1.0);\n box.expandByPoint(vector);\n break;\n case 3:\n vector.copy(settings.slide.value);\n box.expandByPoint(vector);\n vector.setX(1.0);\n vector.setY(1.0);\n box.expandByPoint(vector);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Get the bounding box of this slides.\n * It uses the max and min of the slides position and the\n * transformation to calculate the position of the box.\n *\n * @return {THREE.Box3}.\n */\n this.getBoundingBox = () => {\n if (this.morph && this.morph.children && this.morph.visible &&\n this.boundingBoxUpdateRequired) {\n this.cachedBoundingBox.makeEmpty();\n const vector = new THREE.Vector3(0, 0, 0);\n this.morph.children.forEach(slide => {\n expandBoxWithSettings(this.cachedBoundingBox, slide.material.uniforms,\n vector);\n });\n this.morph.updateMatrixWorld (true, true);\n this.cachedBoundingBox.applyMatrix4(this.morph.matrixWorld);\n this.boundingBoxUpdateRequired = false;\n }\n return this.cachedBoundingBox;\n }\n\n this.applyTransformation = (rotation, position, scale) => {\n const matrix = new THREE.Matrix4();\n matrix.set(\n rotation[0],\n rotation[1],\n rotation[2],\n 0,\n rotation[3],\n rotation[4],\n rotation[5],\n 0,\n rotation[6],\n rotation[7],\n rotation[8],\n 0,\n 0,\n 0,\n 0,\n 0\n );\n const quaternion = new THREE.Quaternion().setFromRotationMatrix(matrix);\n this.morph.position.set(...position);\n this.morph.quaternion.copy( quaternion );\n this.morph.scale.set(...scale);\n this.morph.updateMatrix();\n this.boundingBoxUpdateRequired = true;\n }\n\n this.setRenderOrder = (order) => {\n //multiilayers\n this.morph.renderOrder = order;\n }\n\n this.initialise = (textureData, finishCallback) => {\n if (textureData) {\n const locations = textureData.locations;\n if (locations && locations.length > 0) {\n this.applyTransformation(locations[0].orientation,\n locations[0].position, locations[0].scale);\n if (\"flipY\" in locations[0]) {\n flipY = locations[0].flipY;\n }\n if (\"flipZ\" in locations[0]) {\n flipZ = locations[0].flipZ;\n }\n }\n this.createSlides(textureData.settings.slides);\n if (finishCallback != undefined && (typeof finishCallback == 'function')) {\n finishCallback(this);\n }\n }\n }\n\n this.showEdges = (color) => {\n if (!edgesLine) {\n const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n geometry.translate(0.5, 0.5, 0.5);\n const edges = new THREE.EdgesGeometry( geometry );\n edgesLine = new THREE.LineSegments(edges, new THREE.LineBasicMaterial( { color } ) );\n this.group.add( edgesLine );\n } else {\n edgesLine.material.color = color;\n }\n edgesLine.visible = true;\n }\n\n\n this.setUniformsValue = (name, val) => {\n this.morph.children.forEach((mesh) => {\n const material = mesh.material;\n if (material.type === \"ShaderMaterial\") {\n const uniforms = material.uniforms;\n uniforms[name].value = val;\n material.needsUpdate = true;\n }\n });\n }\n\n this.isAlphaPixelDiscarded = () => {\n return discardAlpha;\n }\n\n this.discardAlphaPixel = (flag) => {\n discardAlpha = flag;\n this.setUniformsValue(\"discardAlpha\", discardAlpha);\n }\n\n this.getBrightness = () => {\n return brightness;\n }\n\n this.setBrightness = (brightnessIn) => {\n brightness = brightnessIn;\n this.setUniformsValue(\"brightness\", brightness);\n }\n\n this.getContrast = () => {\n return contrast;\n }\n\n this.setContrast = (contrastIn) => {\n if (contrast >= 0 ) {\n contrast = contrastIn;\n this.setUniformsValue(\"contrast\", contrast);\n }\n }\n\n this.getNumberOfChannels = () => {\n return nChannels;\n }\n\n this.setNumberOfChannels = (numbersIn) => {\n nChannels = numbersIn;\n this.setUniformsValue(\"nChannels\", nChannels);\n }\n\n this.getMask = () => {\n return maskTexture;\n }\n\n this.setMask = (maskTextureIn) => {\n maskTexture = maskTextureIn;\n this.setUniformsValue(\"mask\", maskTexture);\n this.setUniformsValue(\"maskEnabled\", maskTexture ? true : false);\n }\n\n this.hideEdges = () => {\n if (edgesLine) {\n edgesLine.visible = false;\n }\n }\n\n this.updateTimeTexture = () => {\n const maxIndex = this.textureList.length - 1;\n const normalisedTime = this.inbuildTime / this.duration;\n if (this.timeEnabled && maxIndex > 0 && prevTime !== normalisedTime) {\n const iTime = normalisedTime * maxIndex;\n const t0 = Math.floor(iTime);\n const t1 = Math.ceil(iTime);\n const ratio = iTime - t0;\n this.morph.children.forEach((mesh) => {\n const material = mesh.material;\n if (material.type === \"ShaderMaterial\") {\n const uniforms = material.uniforms;\n if (lt0 !== t0) {\n uniforms.diffuse0.value = this.textureList[t0].impl;\n }\n if (lt1 !== t1) {\n uniforms.diffuse1.value = this.textureList[t1].impl;\n }\n uniforms.time.value = ratio;\n material.needsUpdate = true;\n }\n });\n lt0 = t0;\n lt1 = t1;\n prevTime = normalisedTime;\n }\n }\n\n /**\n * Update the glyphsets if required the render.\n */\n this.setMorphTime = (time) => {\n let newTime = time;\n if (time > this.duration)\n newTime = this.duration;\n else if (0 > time)\n newTime = 0;\n else\n newTime = time;\n if (newTime != this.inbuildTime) {\n this.inbuildTime = newTime;\n this.updateTimeTexture();\n }\n }\n\n /**\n * Update the glyphsets if required the render.\n */\n this.render = (delta, playAnimation, options) => {\n //console.log(\"render\", delta, playAnimation, this.textureList)\n if (playAnimation == true && this.timeEnabled &&\n this.textureList.length > 1) {\n let targetTime = this.inbuildTime + delta;\n if (targetTime > this.duration)\n targetTime = targetTime - this.duration;\n this.inbuildTime = targetTime;\n this.updateTimeTexture();\n }\n }\n\n}\n\nTextureSlides.prototype = Object.create(TexturePrimitive.prototype);\nTextureSlides.prototype.constructor = TextureSlides;\nexport { TextureSlides };\n","import * as THREE from 'three';\nimport { resolveURL } from './utilities';\n\n/**\n * Object with containg viewport information used in ZincJS.\n *\n * @class\n * @author Alan Wu\n * @return {Viewport}\n */\nconst Viewport = function () {\n /** @property {Number} */\n\tthis.nearPlane = 0.168248;\n /** @property {Number} */\n\tthis.farPlane = 6.82906;\n /**@property {Array} */\n\tthis.eyePosition = [0.5, -2.86496, 0.5];\n /** @property {Array} */\n\tthis.targetPosition = [0.5, 0.5, 0.5];\n /** @property {Array} */\n\tthis.upVector = [ 0.0, 0.0, 1.0];\n\tconst _this = this;\n\n this.setFromObject = ({ nearPlane, farPlane, eyePosition, targetPosition, upVector }) => {\n _this.nearPlane = nearPlane;\n _this.farPlane = farPlane;\n _this.eyePosition = eyePosition;\n _this.targetPosition = targetPosition;\n _this.upVector = upVector;\n }\n};\n\n/**\n * Provides the basic controls for a scene.\n *\n * @class\n * @author Alan Wu\n * @return {CameraControls}\n */\nconst CameraControls = function ( object, domElement, renderer, scene ) {\n\tconst MODE = { NONE: -1, DEFAULT: 0, PATH: 1, SMOOTH_CAMERA_TRANSITION: 2, AUTO_TUMBLE: 3, ROTATE_TRANSITION: 4, MINIMAP: 5, SYNC_CONTROL: 6 };\n /**\n * Actions states.\n * Available states are NONE, ROTATE, ZOOM, PAN, TOUCH_ROTATE, TOUCH_ZOOM, TOUCH_PAN and SCROLL.\n * @property {Object}\n */\n\tconst STATE = { NONE: -1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM: 4, TOUCH_PAN: 5, SCROLL: 6, KEYBOARD_ZOOM: 7, KEYBOARD_ROTATE: 8, KEYBOARD_PAN: 9 };\n const ROTATE_DIRECTION = { NONE: -1, FREE: 1, HORIZONTAL: 2, VERTICAL: 3 };\n\tconst KEYBOARD = { ARROWLEFT: 37, ARROWUP: 38, ARROWRIGHT: 39, ARROWDOWN: 40, NUMPADADD: 107, NUMPADSUBTRACT: 109, EQUAL: 187, MINUS: 189 };\n /**\n * Available click actions are MAIN, AUXILIARY and SECONARY.\n * @property {Object}\n */\n\tconst CLICK_ACTION = {};\n\tCLICK_ACTION.MAIN = STATE.ROTATE;\n\tCLICK_ACTION.AUXILIARY = STATE.ZOOM;\n\tCLICK_ACTION.SECONDARY = STATE.PAN;\n\tthis.cameraObject = object;\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\tthis.renderer = renderer;\n\tthis.scene = scene ;\n\tthis.tumble_rate = 1.5;\n\tthis.pointer_x = 0;\n\tthis.pointer_y = 0;\n\tthis.pointer_x_start = 0;\n\tthis.pointer_y_start = 0;\n\tthis.previous_pointer_x = 0;\n\tthis.previous_pointer_y = 0;\n\tthis.near_plane_fly_debt = 0.0;\n\tthis.touchZoomDistanceStart = 0;\n\tthis.touchZoomDistanceEnd = 0;\n\tthis.directionalLight = 0;\n\tthis.zoomRate = 50;\n\tthis.rotateRate = 50;\n\tthis.panRate = 100;\n\tthis.pixelHeight = 1;\n\tlet duration = 6000;\n let enabled = true;\n\tlet inbuildTime = 0;\n\tlet cameraPath = undefined;\n\tlet numberOfCameraPoint = undefined;\n\tlet updateLightWithPathFlag = false;\n\tlet playRate = 500;\n\tlet deviceOrientationControl = undefined;\n\tlet defaultViewport = \"default\";\n\tlet currentMode = MODE.DEFAULT;\n\tlet smoothCameraTransitionObject = undefined;\n\tlet rotateCameraTransitionObject = undefined;\n\tlet cameraAutoTumbleObject = undefined;\n\tlet zoomSize = 0;\n let rotateMode = ROTATE_DIRECTION.FREE;\n\tthis._state = STATE.NONE;\n\tlet zincRayCaster = undefined;\n\tthis.targetTouchId = -1;\n let rect = undefined;\n const _a = new THREE.Vector3();\n const _b = new THREE.Vector3();\n const _c = new THREE.Vector3();\n const _new_b = new THREE.Vector3();\n const _new_c = new THREE.Vector3();\n const _axis = new THREE.Vector3();\n const _v = new THREE.Vector3();\n const _rel_eye = new THREE.Vector3();\n const sceneSphere = new THREE.Sphere();\n const _tempEye = new THREE.Vector3();\n let hasUpdated = false;\n let ndcControl = undefined;\n let maxDist = 0;\n const viewports = {\n \"default\" : new Viewport()\n };\n viewports.default.nearPlane = 0.1;\n\tviewports.default.farPlane = 2000;\n\tviewports.default.eyePosition = [0, 0, 0];\n\tviewports.default.targetPosition = [0, 0, -1.0];\n\tviewports.default.upVector = [ 0.0, 1.0, 0.0];\n\n //Add the target property\n\tif (this.cameraObject.target === undefined)\n\t\tthis.cameraObject.target = new THREE.Vector3( ...viewports.default.targetPosition );\n\n //Calculate the max distanc allowed, it is the longer\n //of 6 times the radius of the current scene and\n //the current distance between scene centroid and the postion\n //of the camera.\n this.calculateMaxAllowedDistance = (scene) => {\n const box = scene.getBoundingBox();\n if (box) {\n box.getBoundingSphere(sceneSphere);\n maxDist = sceneSphere.radius * 6;\n let currentDist = 0;\n if (this.cameraObject) {\n currentDist = this.cameraObject.position.distanceTo(sceneSphere.center);\n }\n maxDist = currentDist > maxDist ? currentDist * 1.5: maxDist;\n } else {\n maxDist = 0;\n }\n }\n\n const updateNearAndFarPlane = (travalDist) => {\n const ratio = 0.001;\n _a.copy(this.cameraObject.position);\n const length = _a.sub(this.cameraObject.target).length();\n this.cameraObject.near = Math.max(0.0001, length * ratio);\n this.cameraObject.far = this.cameraObject.near * 10000;\n /*\n const near_far_minimum_ratio = 0.0001;\n //const minNear = near_far_minimum_ratio * this.cameraObject.far;\n const minNear = 0.0001;\n if (minNear < (this.cameraObject.near + travalDist + this.near_plane_fly_debt)) {\n if (this.near_plane_fly_debt != 0.0)\t{\n this.near_plane_fly_debt += travalDist;\n if (this.near_plane_fly_debt > 0.0) {\n this.cameraObject.near += this.near_plane_fly_debt;\n this.cameraObject.far += this.near_plane_fly_debt;\n this.near_plane_fly_debt = 0.0;\n }\n else {\n this.cameraObject.near += travalDist;\n this.cameraObject.far += travalDist;\n }\n }\n }\n else {\n //if (this.near_plane_fly_debt == 0.0 ) {\n if (this.cameraObject.near !== 0.0001) {\n const diff = this.cameraObject.near - minNear;\n this.cameraObject.near = minNear;\n this.cameraObject.far -= diff;\n this.near_plane_fly_debt -= diff;\n } else {\n this.near_plane_fly_debt += travalDist;\n }\n }\n */\n }\n\n /**\n * Add a viewport to the list of available named viewports.\n *\n * @param {String} name - Name of the viewport\n * @param {Viewport} viewportName - Viewport to be added\n */\n this.addViewport = (viewportName, viewport) => {\n if (viewportName && viewport)\n viewports[viewportName] = viewport;\n }\n\n /**\n * Set the default viewport for this {@link CameraControls}.\n *\n * @param {String} defaultName - Name of the viewport\n *\n * @return {Boolean} true if set successfully, false otherwise.\n */\n this.setDefaultViewport = defaultName => {\n\t\tif (defaultName && (defaultName in viewports)) {\n defaultViewport = defaultName;\n return true;\n }\n return false\n\t}\n\n /**\n * Get the name of the default viewport.\n *\n *\n * @return {String}\n */\n this.getDefaultViewport = () => {\n\t\treturn defaultViewport;\n\t}\n\n /**\n * Get the viewport with the provied name stored in this object.\n * @param {String} name - Name of the viewport\n *\n * @return {Viewport}\n */\n\tthis.getViewportOfName = name => {\n\t\treturn viewports[name];\n\t}\n\n /**\n * Set the viewport with a name if it is found in the list.\n * @param {String} name - Name of the viewport\n *\n * @return {Boolean} if viewport is found and set, otherwise false.\n */\n this.setCurrentViewport = name => {\n if (name in viewports) {\n this.setCurrentCameraSettings(viewports[name])\n return true;\n }\n return false;\n\t}\n\n /**\n * Set the direction of rotation allowed with this control.\n *\n * @param {String} mode - available options are none, horizontal,\n * vertical and free.\n */\n this.setRotationMode = mode => {\n switch (mode) {\n case \"none\":\n rotateMode = ROTATE_DIRECTION.NONE;\n break;\n case \"horizontal\":\n rotateMode = ROTATE_DIRECTION.HORIZONTAL;\n break;\n case \"vertical\":\n rotateMode = ROTATE_DIRECTION.VERTICAL;\n break;\n case \"free\":\n default:\n rotateMode = ROTATE_DIRECTION.FREE;\n }\n }\n\n\tthis.onResize = () => {\n\t\tif (rect)\n\t\t\trect = undefined;\n if (ndcControl)\n ndcControl.setCurrentCameraSettings(this.cameraObject,\n viewports[defaultViewport]);\n\t}\n\n\tthis.getVisibleHeightAtZDepth = ( depth ) => {\n\t\t// compensate for cameras not positioned at z=0\n\n\t\tconst cameraOffset = this.cameraObject.position.distanceTo(this.cameraObject.target);\n\t\tif ( depth < cameraOffset ) depth -= cameraOffset;\n\t\telse depth += cameraOffset;\n\n\t\t// vertical fov in radians\n\t\tconst vFOV = this.cameraObject.fov * Math.PI / 180;\n\n\t\t// Math.abs to ensure the result is always positive\n\t\treturn 2 * Math.tan( vFOV / 2 ) * Math.abs( depth );\n\t};\n\n\tthis.calculateHeightPerPixelAtZeroDepth = ( wHeight ) => {\n\t\tconst height = this.getVisibleHeightAtZDepth(0);\n\t\tthis.pixelHeight = height / wHeight;\n\t\treturn this.pixelHeight;\n\t}\n\n /**\n * Get normalised coordinates from windows coordinates.\n *\n * @param {String} x\n * @param {String} y\n * @param {THREE.Vector2} positionIn - Optional, write the value into\n * this object if it is provided, otherwise a new object will\n * be created and returned.\n *\n * @return {THREE.Vector2} containing the normalised x and y coordinates.\n */\n this.getNDCFromDocumentCoords = (x, y, positionIn) => {\n updateRect(false);\n const position = positionIn ? positionIn : new THREE.Vector2();\n const out_x = ((x - rect.left) / rect.width) * 2 - 1;\n const out_y = -((y - rect.top) / rect.height) * 2 + 1;\n return position.set(out_x, out_y);\n }\n\n /**\n * Get the relative windows coordinates from normalised coordiantes.\n *\n * @param {String} x\n * @param {String} y\n * @param {THREE.Vector2} positionIn - Optional, write the value into\n * this object if it is provided, otherwise a new object will\n * be created and returned.\n *\n * @return {THREE.Vector2} containing the relative x and y coordinates.\n */\n this.getRelativeCoordsFromNDC = (x, y, positionIn) => {\n updateRect(false);\n const position = positionIn ? positionIn : new THREE.Vector2();\n position.x = (x + 1) * rect.width / 2.0;\n position.y = (1 - y) * rect.height / 2.0;\n return position;\n }\n\n /**\n * Map a mouse click to the specified action.\n *\n * @param {String} buttonName - please see {@link CLICK_ACTION}\n * @param {String} actionName - please see {@link STATE}\n */\n\tthis.setMouseButtonAction = (buttonName, actionName) => {\n\t\tCLICK_ACTION[buttonName] = STATE[actionName];\n }\n\n\t/**\n\t *\n\t * @param {HTML} element\n\t * @param {Number} index\n\t */\n\tconst setCanvasTabindex = (element, index) => {\n\t\tif (element instanceof HTMLCanvasElement)\n\t\t\telement.tabIndex = index\n\t}\n\n //Make sure the camera does not travel beyond limit\n const checkTravelDistance = () => {\n if (maxDist > 0) {\n const newDist = _tempEye.distanceTo(sceneSphere.center);\n return (maxDist > newDist ||\n this.cameraObject.position.distanceTo(sceneSphere.center) > newDist );\n }\n return true;\n }\n\n const translateViewport = translation => {\n _tempEye.copy(this.cameraObject.position).add(translation);\n if (checkTravelDistance()) {\n this.cameraObject.target.add(translation);\n this.cameraObject.position.add(translation);\n this.updateDirectionalLight();\n }\n }\n\n\tconst onDocumentMouseDown = event => {\n updateRect(false);\n // Check if mouse event hapens inside the minimap\n let minimapCoordinates = undefined;\n if (currentMode === MODE.DEFAULT)\n minimapCoordinates = this.scene.getNormalisedMinimapCoordinates(\n this.renderer, event);\n if (!minimapCoordinates) {\n if (event.button == 0) {\n if (event.ctrlKey)\n this._state = CLICK_ACTION.AUXILIARY;\n else if (event.shiftKey)\n this._state = CLICK_ACTION.SECONDARY;\n else\n this._state = CLICK_ACTION.MAIN;\n } else if (event.button == 1) {\n event.preventDefault();\n this._state = CLICK_ACTION.AUXILIARY;\n }\n else if (event.button == 2) {\n this._state = CLICK_ACTION.SECONDARY;\n }\n this.pointer_x = event.clientX - rect.left;\n this.pointer_y = event.clientY - rect.top;\n this.pointer_x_start = this.pointer_x;\n this.pointer_y_start = this.pointer_y;\n this.previous_pointer_x = this.pointer_x;\n this.previous_pointer_y= this.pointer_y;\n } else {\n currentMode = MODE.MINIMAP;\n let translation = this.scene.getMinimapDiffFromNormalised(\n minimapCoordinates.x, minimapCoordinates.y);\n translateViewport(translation);\n }\n }\n\n\tconst onDocumentMouseMove = event => {\n updateRect(false);\n\t\tif (rect) {\n\t\t\tthis.pointer_x = event.clientX - rect.left;\n\t\t\tthis.pointer_y = event.clientY - rect.top;\n\t\t\tif (currentMode === MODE.MINIMAP) {\n\t\t\t\tlet minimapCoordinates = this.scene.getNormalisedMinimapCoordinates(this.renderer, event);\n\t\t\t\tif (minimapCoordinates) {\n\t\t\t\t\tlet translation = this.scene.getMinimapDiffFromNormalised(\n\t\t\t\t\t\tminimapCoordinates.x, minimapCoordinates.y);\n\t\t\t\t\ttranslateViewport(translation);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((this._state === STATE.NONE) && (zincRayCaster !== undefined)) {\n\t\t\t\t\tzincRayCaster.move(this, event.clientX, event.clientY, this.renderer);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst onDocumentMouseUp = event => {\n this._state = STATE.NONE;\n if (currentMode == MODE.MINIMAP)\n currentMode = MODE.DEFAULT;\n\t\tif (zincRayCaster !== undefined) {\n\t\t\tif (this.pointer_x_start==(event.clientX - rect.left) && this.pointer_y_start==(event.clientY- rect.top)) {\n\t\t\t\tzincRayCaster.pick(this, event.clientX, event.clientY, this.renderer);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst onDocumentMouseLeave = event => {\n\t\tthis._state = STATE.NONE;\n\t}\n\n\tconst onDocumentTouchStart = event => {\n updateRect(false);\n\t\tconst len = event.touches.length;\n\t\tif (len == 1) {\n\t\t\tthis._state = STATE.TOUCH_ROTATE;\n\t\t\tthis.pointer_x = event.touches[0].clientX - rect?.left;\n\t\t\tthis.pointer_y = event.touches[0].clientY - rect?.top;\n\t\t\tthis.pointer_x_start = this.pointer_x;\n\t\t\tthis.pointer_y_start = this.pointer_y;\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y= this.pointer_y;\n\t\t} else if (len == 2) {\n\t\t\tthis._state = STATE.TOUCH_ZOOM;\n\t\t\tconst dx = event.touches[ 0 ].clientX - event.touches[ 1 ].clientX;\n\t\t\tconst dy = event.touches[ 0 ].clientY - event.touches[ 1 ].clientY;\n\t\t\tthis.touchZoomDistanceEnd = this.touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy );\n\t\t} else if (len == 3) {\n\t\t\tthis._state = STATE.TOUCH_PAN;\n\t\t\tthis.targetTouchId = event.touches[0].identifier;\n\t\t\tthis.pointer_x = event.touches[0].clientX - rect?.left;\n\t\t\tthis.pointer_y = event.touches[0].clientY - rect?.top;\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y= this.pointer_y;\n\t\t}\n\t}\n\n\tconst onDocumentTouchMove = event => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tconst len = event.touches.length;\n\t\tif (len == 1) {\n\t\t\tthis.pointer_x = event.touches[0].clientX - rect.left;\n\t\t\tthis.pointer_y = event.touches[0].clientY - rect.top;\n\t\t} else if (len == 2) {\n\t\t\tif (this._state === STATE.TOUCH_ZOOM) {\n\t\t\t\tconst dx = event.touches[ 0 ].clientX - event.touches[ 1 ].clientX;\n\t\t\t\tconst dy = event.touches[ 0 ].clientY - event.touches[ 1 ].clientY;\n\t\t\t\tthis.touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy );\n\t\t\t}\n\t\t} else if (len == 3) {\n\t\t\tif (this._state === STATE.TOUCH_PAN) {\n\t\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t\tif (event.touches[i].identifier == this.targetTouchId) {\n\t\t\t\t\t\tthis.pointer_x = event.touches[0].clientX - rect.left;\n\t\t\t\t\t\tthis.pointer_y = event.touches[0].clientY - rect.top;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst onDocumentTouchEnd = event => {\n\t\tconst len = event.touches.length;\n\t\tthis.touchZoomDistanceStart = this.touchZoomDistanceEnd = 0;\n\t\tthis.targetTouchId = -1;\n\t\tthis._state = STATE.NONE;\n\t\tif (len == 1) {\n\t\t\tif (zincRayCaster !== undefined) {\n\t\t\t\tif (this.pointer_x_start==(event.touches[0].clientX- rect.left) && this.pointer_y_start==(event.touches[0].clientY- rect.top)) {\n\t\t\t\t\tzincRayCaster.pick(this.cameraObject, event.touches[0].clientX, event.touches[0].clientY, this.renderer);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n const onDocumentEnter = () => {\n\t\tupdateRect(true);\n\t}\n\n const updateRect = forced => {\n //Use intersectionObserver to reset the rect for ray tracing.\n if (forced || rect === undefined) {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n rect = entry.boundingClientRect;\n }\n observer.disconnect();\n });\n\n observer.observe(this.domElement);\n }\n }\n\n\tconst onDocumentWheelEvent = event => {\n updateRect(false);\n\t\tthis._state = STATE.SCROLL;\n\t\tlet changes = 0;\n\t\tif (event.deltaY > 0)\n\t\t\tchanges = this.zoomRate;\n\t\telse if (event.deltaY < 0)\n\t\t\tchanges = this.zoomRate * -1;\n\t\tzoomSize = zoomSize + changes;\n\t\tevent.preventDefault();\n\t\tevent.stopImmediatePropagation();\n\t}\n\n\tconst onDocumentKeydownEvent = event => {\n\t\tupdateRect(false);\n\t\tlet changes = 0;\n\t\tif (\n\t\t\t(event.keyCode === KEYBOARD.EQUAL) ||\n\t\t\t(event.keyCode === KEYBOARD.MINUS) ||\n\t\t\t(event.keyCode === KEYBOARD.NUMPADADD) ||\n\t\t\t(event.keyCode === KEYBOARD.NUMPADSUBTRACT)\n\t\t) {\n\t\t\tthis._state = STATE.KEYBOARD_ZOOM\n\t\t\tlet unit = 1;\n\t\t\tif (event.shiftKey) {\n\t\t\t\tunit = unit * 2\n\t\t\t}\n\t\t\tif (\n\t\t\t\t(event.keyCode === KEYBOARD.EQUAL) ||\n\t\t\t\t(event.keyCode === KEYBOARD.NUMPADADD)\n\t\t\t) {\n\t\t\t\tchanges = this.zoomRate * unit * -1;\n\t\t\t} else if (\n\t\t\t\t(event.keyCode === KEYBOARD.MINUS) ||\n\t\t\t\t(event.keyCode === KEYBOARD.NUMPADSUBTRACT)\n\t\t\t) {\n\t\t\t\tchanges = this.zoomRate * unit;\n\t\t\t}\n\t\t\tzoomSize = zoomSize + changes;\n\t\t} else if (\n\t\t\t(event.keyCode === KEYBOARD.ARROWLEFT) ||\n\t\t\t(event.keyCode === KEYBOARD.ARROWUP) ||\n\t\t\t(event.keyCode === KEYBOARD.ARROWRIGHT) ||\n\t\t\t(event.keyCode === KEYBOARD.ARROWDOWN)\n\t\t) {\n\t\t\tif (event.shiftKey) {\n\t\t\t\tthis._state = STATE.KEYBOARD_ROTATE\n\t\t\t\tthis.pointer_x_start = this.pointer_x;\n\t\t\t\tthis.pointer_y_start = this.pointer_y;\n\t\t\t\tchanges = this.rotateRate\n\t\t\t} else {\n\t\t\t\tthis._state = STATE.KEYBOARD_PAN\n\t\t\t\tchanges = this.panRate\n\t\t\t}\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y = this.pointer_y;\n\t\t\tif (event.keyCode === KEYBOARD.ARROWLEFT) {\n\t\t\t\tthis.pointer_x = this.pointer_x - changes;\n\t\t\t} else if (event.keyCode === KEYBOARD.ARROWUP) {\n\t\t\t\tthis.pointer_y = this.pointer_y - changes;\n\t\t\t} else if (event.keyCode === KEYBOARD.ARROWRIGHT) {\n\t\t\t\tthis.pointer_x = this.pointer_x + changes;\n\t\t\t} else if (event.keyCode === KEYBOARD.ARROWDOWN) {\n\t\t\t\tthis.pointer_y = this.pointer_y + changes;\n\t\t\t}\n\t\t}\n\t\tif (Object.values(KEYBOARD).includes(event.keyCode)) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tconst onDocumentKeyupEvent = event => {\n\t\tthis._state = STATE.NONE;\n\t}\n\n\tconst translate = () => {\n\t\tif (typeof this.cameraObject !== \"undefined\")\n\t\t{\n\t\t\tconst height = rect.height;\n\t\t\tconst distance = this.cameraObject.position.distanceTo(this.cameraObject.target);\n\t\t\tlet fact = 0.0;\n\t\t\tif ((this.cameraObject.far > this.cameraObject.near) && (distance >= this.cameraObject.near) &&\n\t\t\t\t(distance <= this.cameraObject.far))\n\t\t\t{\n\t\t\t\t fact = (distance-this.cameraObject.near)/(this.cameraObject.far-this.cameraObject.near);\n }\n //_b == old_near, _c = old_far, _new_b = new_near, _new_c = new_far\n\t\t\t_b.set(this.previous_pointer_x,height - this.previous_pointer_y,0.0);\n\t\t\t_c.set(this.previous_pointer_x, height - this.previous_pointer_y,1.0);\n\t\t\t_new_b.set(this.pointer_x,height - this.pointer_y,0.0);\n\t\t\t_new_c.set(this.pointer_x,height - this.pointer_y,1.0);\n\t\t\t_b.unproject(this.cameraObject);\n\t\t\t_c.unproject(this.cameraObject);\n\t\t\t_new_b.unproject(this.cameraObject);\n\t\t\t_new_c.unproject( this.cameraObject);\n const translate_rate = -0.002;\n _new_b.sub(_b).multiplyScalar(1.0-fact);\n _new_c.sub(_c).multiplyScalar(fact);\n _new_b.add(_new_c).multiplyScalar(translate_rate);\n translateViewport(_new_b);\n\t\t}\n\t\tthis.previous_pointer_x = this.pointer_x;\n\t\tthis.previous_pointer_y = this.pointer_y;\n\t}\n\n\tthis.getVectorsFromRotateAboutLookAtPoints = (axis, angle) => {\n axis.normalize();\n\t _v.copy(this.cameraObject.position).sub(this.cameraObject.target);\n\t _rel_eye.copy(_v);\n\t _v.normalize()\n\t if (0.8 < Math.abs(_v.dot(axis))) {\n\t _v.copy(this.cameraObject.up);\n }\n _b.crossVectors(axis, _v).normalize();\n _c.crossVectors(axis, _b);\n\t const rel_eyea = axis.dot(_rel_eye);\n\t const rel_eyeb = _b.dot(_rel_eye);\n\t const rel_eyec = _c.dot(_rel_eye);\n\t const upa = axis.dot(this.cameraObject.up);\n\t const upb = _b.dot(this.cameraObject.up);\n\t const upc = _c.dot(this.cameraObject.up);\n\t const cos_angle = Math.cos(angle);\n\t const sin_angle = Math.sin(angle);\n _new_b.set(cos_angle*_b.x+sin_angle*_c.x,\n\t cos_angle*_b.y+sin_angle*_c.y,\n\t cos_angle*_b.z+sin_angle*_c.z);\n\t _new_c.set(cos_angle*_c.x-sin_angle*_b.x,\n\t cos_angle*_c.y-sin_angle*_b.y,\n\t cos_angle*_c.z-sin_angle*_b.z);\n _v.copy(this.cameraObject.target);\n\t _v.x = _v.x + axis.x*rel_eyea + _new_b.x*rel_eyeb+_new_c.x*rel_eyec;\n\t _v.y = _v.y + axis.y*rel_eyea + _new_b.y*rel_eyeb+_new_c.y*rel_eyec;\n\t _v.z = _v.z + axis.z*rel_eyea + _new_b.z*rel_eyeb+_new_c.z*rel_eyec;\n\t _a.set(axis.x*upa+_new_b.x*upb+_new_c.x*upc,\n axis.y*upa+_new_b.y*upb+_new_c.y*upc,\n axis.z*upa+_new_b.z*upb+_new_c.z*upc);\n\t return {position: _v, up: _a};\n\t}\n\n /**\n * Rotate around the axis with the amount specified by angle.\n *\n * @param {THREE.Vector3} axis - The rotational axis.\n * @param {Number} Angle - Specify how much the camera shoudl rotate by.\n */\n\tthis.rotateAboutLookAtpoint = (axis, angle) => {\n\t const returned_values = this.getVectorsFromRotateAboutLookAtPoints(axis, angle);\n\t this.cameraObject.position.copy(returned_values.position);\n\t this.updateDirectionalLight();\n\t this.cameraObject.up.copy(returned_values.up);\n\t}\n\n\tconst tumble = () => {\n\t\tif (typeof this.cameraObject !== \"undefined\")\n\t\t{\n\t\t\tconst width = rect?.width;\n\t\t\tconst height = rect?.height;\n\t\t\tif ((0<width)&&(0<height))\n\t\t\t{\n\t\t\t\tconst radius=0.25*(width+height);\n\t\t\t\tlet delta_x = 0;\n\t\t\t\tlet delta_y = 0;\n if (rotateMode === ROTATE_DIRECTION.FREE ||\n rotateMode === ROTATE_DIRECTION.HORIZONTAL)\n\t\t\t\t delta_x=this.pointer_x-this.previous_pointer_x;\n if (rotateMode === ROTATE_DIRECTION.FREE ||\n rotateMode === ROTATE_DIRECTION.VERTICAL)\n\t\t\t\t delta_y=this.previous_pointer_y-this.pointer_y;\n\t\t\t\tconst tangent_dist = Math.sqrt(delta_x*delta_x + delta_y*delta_y);\n\t\t\t\tif (tangent_dist > 0)\n\t\t\t\t{\n\t\t\t\t\tconst dx=-delta_y*1.0/tangent_dist;\n\t\t\t\t\tconst dy=delta_x*1.0/tangent_dist;\n let d = 0;\n // Do not allow rotation on other direction around the origin if rotateMode is not free\n if (rotateMode === ROTATE_DIRECTION.FREE) {\n let d=dx*(this.pointer_x-0.5*(width-1))+dy*(0.5*(height-1)-this.pointer_y);\n if (d > radius)\t{\n d = radius;\n }\n else {\n if (d < -radius) {\n d = -radius;\n }\n }\n }\n\t\t\t\t\tconst phi=Math.acos(d/radius)-0.5*Math.PI;\n\t\t\t\t\tconst angle=this.tumble_rate*tangent_dist/radius;\n\t\t\t\t\t_a.copy(this.cameraObject.position).sub(this.cameraObject.target).normalize();\n\t\t\t\t\t_b.copy(this.cameraObject.up).normalize();\n _c.copy(_b).cross(_a).normalize().multiplyScalar(dx);\n _b.multiplyScalar(dy);\n _axis.addVectors(_c, _b).multiplyScalar(Math.cos(phi));\n _a.multiplyScalar(Math.sin(phi));\n _axis.add(_a);\n\t\t\t\t\tthis.rotateAboutLookAtpoint(_axis, -angle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.previous_pointer_x = this.pointer_x;\n\t\tthis.previous_pointer_y = this.pointer_y;\n\t}\n\n\tconst calculateZoomDelta = () => {\n\t\tlet delta = 0;\n\t\tif (this._state === STATE.ZOOM)\n\t\t{\n\t\t\tdelta = this.previous_pointer_y-this.pointer_y;\n\t\t} else if ((this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)) {\n\t\t\tdelta = zoomSize;\n\t\t} else {\n\t\t\tdelta = -1.0 * (this.touchZoomDistanceEnd - this.touchZoomDistanceStart);\n\t\t\tthis.touchZoomDistanceStart = this.touchZoomDistanceEnd;\n\t\t}\n\t\treturn delta;\n }\n\n this.changeZoomByScrollRateUnit = unit => {\n const delta_y = unit * this.zoomRate;\n this.changeZoomByValue(delta_y);\n }\n\n this.changeZoomByValue = delta_y => {\n\t\tif (typeof this.cameraObject !== \"undefined\")\n\t\t{\n const height = rect.height;\n\t\t\tconst a = this.cameraObject.position.clone();\n\t\t\ta.sub(this.cameraObject.target);\n\t\t\tconst dist = a.length();\n\t\t\tconst dy = 1.5 * delta_y/height;\n const travalDist = dist * dy;\n\t\t\tif ((dist + travalDist) > 0.01) {\n\t\t\t\ta.normalize()\n _tempEye.copy(this.cameraObject.position);\n\t\t\t\t_tempEye.x += a.x*travalDist;\n\t\t\t\t_tempEye.y += a.y*travalDist;\n\t\t\t\t_tempEye.z += a.z*travalDist;\n if (checkTravelDistance()) {\n this.cameraObject.position.copy(_tempEye);\n this.updateDirectionalLight();\n updateNearAndFarPlane(travalDist);\n hasUpdated = true;\n }\n\t\t\t}\n\t\t}\n }\n\n\tconst flyZoom = () => {\n const delta_y = calculateZoomDelta();\n this.changeZoomByValue(delta_y);\n\n\t\tif (this._state === STATE.ZOOM) {\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y = this.pointer_y;\n\t\t}\n\t\tif ((this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)) {\n\t\t\tzoomSize = 0;\n this._state = STATE.NONE;\n\t\t}\n\t}\n\n\tthis.setDirectionalLight = directionalLightIn => {\n\t\tthis.directionalLight = directionalLightIn;\n\t};\n\n /**\n * Force an update to the position of the directional light.\n */\n\tthis.updateDirectionalLight = () => {\n\t\tif (this.directionalLight != 0) {\n\t\t\tthis.directionalLight.position.set(this.cameraObject.position.x,\n\t\t\t\t\tthis.cameraObject.position.y,\n\t\t\t\t\tthis.cameraObject.position.z);\n\t\t}\n\t}\n\n\t/**\n * Enable the camera control.\n */\n\tthis.enable = function () {\n\t\tenabled = true;\n\t\tif (this.domElement && this.domElement.addEventListener) {\n\t\t\tsetCanvasTabindex(this.domElement, 0)\n\t\t\tthis.domElement.addEventListener( 'mousedown', onDocumentMouseDown, false );\n\t\t\tthis.domElement.addEventListener( 'mousemove', onDocumentMouseMove, false );\n\t\t\tthis.domElement.addEventListener( 'mouseup', onDocumentMouseUp, false );\n\t\t\tthis.domElement.addEventListener( 'mouseleave', onDocumentMouseLeave, false );\n\t\t\tthis.domElement.addEventListener( 'touchstart', onDocumentTouchStart, false);\n\t\t\tthis.domElement.addEventListener( 'touchmove', onDocumentTouchMove, false);\n\t\t\tthis.domElement.addEventListener( 'touchend', onDocumentTouchEnd, false);\n\t\t\tthis.domElement.addEventListener( 'wheel', onDocumentWheelEvent, false);\n\t\t\tthis.domElement.addEventListener( 'mouseenter', onDocumentEnter, false );\n\t\t\tthis.domElement.addEventListener( 'contextmenu', event => { event.preventDefault(); }, false );\n\t\t\tthis.domElement.addEventListener( 'keydown', onDocumentKeydownEvent, false );\n\t\t\tthis.domElement.addEventListener( 'keyup', onDocumentKeyupEvent, false );\n\t }\n\t}\n\n /**\n * Disable the camera control.\n */\n\tthis.disable = function () {\n\t\tenabled = false;\n\t\tif (this.domElement && this.domElement.removeEventListener) {\n\t\t\tthis.domElement.removeEventListener( 'mousedown', onDocumentMouseDown, false );\n\t\t\tthis.domElement.removeEventListener( 'mousemove', onDocumentMouseMove, false );\n\t\t\tthis.domElement.removeEventListener( 'mouseup', onDocumentMouseUp, false );\n\t\t\tthis.domElement.removeEventListener( 'mouseleave', onDocumentMouseLeave, false );\n\t\t\tthis.domElement.removeEventListener( 'touchstart', onDocumentTouchStart, false);\n\t\t\tthis.domElement.removeEventListener( 'touchmove', onDocumentTouchMove, false);\n\t\t\tthis.domElement.removeEventListener( 'touchend', onDocumentTouchEnd, false);\n\t\t\tthis.domElement.removeEventListener( 'wheel', onDocumentWheelEvent, false);\n\t\t\tthis.domElement.removeEventListener( 'mouseenter', onDocumentEnter, false );\n\t\t\tthis.domElement.removeEventListener( 'contextmenu', event => { event.preventDefault(); }, false );\n\t\t\tthis.domElement.removeEventListener( 'keydown', onDocumentKeydownEvent, false );\n\t\t\tthis.domElement.removeEventListener( 'keyup', onDocumentKeyupEvent, false );\n\t\t\tsetCanvasTabindex(this.domElement, -1)\n\t }\n\t}\n\n\tthis.loadPath = pathData => {\n\t\tcameraPath = pathData.CameraPath;\n\t\tnumberOfCameraPoint = pathData.NumberOfPoints;\n\t}\n\n /**\n * This is an experimental feature. It loads a path - point to point which\n * the camera will travel.\n *\n * @param {String} path_url - The path.\n * @param {requestCallback} finishCallback - The callback once the path is load.\n */\n\tthis.loadPathURL = (path_url, finishCallback) => {\n\t\tconst xmlhttp = new XMLHttpRequest();\n\t\txmlhttp.onreadystatechange = () => {\n\t\t if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {\n\t\t const pathData = JSON.parse(xmlhttp.responseText);\n\t\t this.loadPath(pathData);\n\t if (finishCallback != undefined && (typeof finishCallback == 'function'))\n\t finishCallback();\n\t\t }\n\t\t}\n\t\tconst requestURL = resolveURL(path_url);\n\t\txmlhttp.open(\"GET\", requestURL, true);\n\t\txmlhttp.send();\n\t}\n\n /**\n * Set the duration for the camera to travel along the path.\n *\n * @param {Number} durationIn - the duration for the path.\n */\n\tthis.setPathDuration = durationIn => {\n duration = durationIn;\n if (smoothCameraTransitionObject)\n smoothCameraTransitionObject.setDuration(duration);\n if (rotateCameraTransitionObject)\n rotateCameraTransitionObject.setDuration(duration);\n\t}\n\n /**\n * Get the playRate - this determines how fast it takes to\n * finish one duration.\n *\n * @return {Number}\n */\n\t this.getPlayRate = () => {\n\t return playRate;\n\t }\n\n /**\n * Set the playRate - this determines how fast it takes to\n * finish one duration.\n *\n * @param {Number} playRateIn - The play rate speed.\n */\n\tthis.setPlayRate = playRateIn => {\n\t\tplayRate = playRateIn;\n\t}\n\n /**\n * Update the internal timer by the set amount, this can\n * be used to force a time update by setting delta to zero.\n *\n * @param {Number} delta - The amount of time to increment\n * the time by.\n */\n\tconst updateTime = delta => {\n\t\tlet targetTime = inbuildTime + delta;\n\t\tif (targetTime > duration)\n\t\t\ttargetTime = targetTime - duration\n\t\tinbuildTime = targetTime;\n\t};\n\n /**\n * Get the current inbuild time,\n *\n * @return {Number}\n */\n\t this.getTime = () => {\n\t return inbuildTime;\n\t }\n\n /**\n * Set the current inbuild time,\n *\n * @param {Number} timeIn - this will be used as the current time,\n * it should be between the range of zero and the set duration.\n */\n\tthis.setTime = timeIn => {\n\t if (timeIn > duration)\n\t inbuildTime = duration;\n\t else if (timeIn < 0.0)\n\t inbuildTime = 0.0;\n\t else\n\t inbuildTime = timeIn;\n\t}\n\n /**\n * Get the number of frame which is determine by number of points\n * in the camera path.\n *\n * @return {Number}\n */\n\tthis.getNumberOfTimeFrame = () => {\n\t\treturn numberOfCameraPoint;\n\t}\n\n /**\n * Get the current time frame and it will return three values in\n * an array.\n *\n * @return {Array} - bottom frame, top frame and the proportion.\n */\n\tthis.getCurrentTimeFrame = () => {\n\t if (numberOfCameraPoint > 2) {\n \t\tconst current_time = inbuildTime/duration * (numberOfCameraPoint - 1);\n \t\tconst bottom_frame = Math.floor(current_time);\n \t\tconst proportion = 1 - (current_time - bottom_frame);\n \t\tconst top_frame = Math.ceil(current_time);\n \t\tif (bottom_frame == top_frame) {\n \t\t\tif (bottom_frame == numberOfCameraPoint - 1) {\n \t\t\t\treturn [bottom_frame - 1, top_frame, 0];\n \t\t\t} else {\n \t\t\t\treturn [bottom_frame, top_frame + 1, 1.0];\n \t\t\t}\n \t\t}\n \t\treturn [bottom_frame, top_frame, proportion];\n\t } else if (numberOfCameraPoint == 1) {\n\t return [0, 0, 0];\n\t }\n\n\t return undefined;\n\t}\n\n /**\n * Set the current time frame.\n *\n * @param {Number} targetTimeFrame - bottom frame, top frame and the proportion.\n */\n\tthis.setCurrentTimeFrame = targetTimeFrame => {\n\t if (numberOfCameraPoint > 2) {\n \t\tinbuildTime = duration * targetTimeFrame / (numberOfCameraPoint - 1);\n \t\tif (inbuildTime < 0.0)\n \t\t\tinbuildTime = 0.0;\n \t\tif (inbuildTime > duration)\n \t\t\tinbuildTime = duration;\n\t }\n\t}\n\n /**\n * Update the progress on the path by the specified amount - delta.\n *\n * @param {Number} delta - The amount of time to increment\n */\n\tconst updatePath = delta => {\n\t\tif (currentMode === MODE.PATH) {\n\t\t\tupdateTime(delta);\n\t\t\tif (cameraPath) {\n\t\t\t\tconst time_frame = this.getCurrentTimeFrame();\n\t\t\t\tconst bottom_frame = time_frame[0];\n\t\t\t\tconst top_frame = time_frame[1];\n\t\t\t\tconst proportion = time_frame[2];\n\t\t\t\tconst bot_pos = [cameraPath[bottom_frame*3], cameraPath[bottom_frame*3+1], cameraPath[bottom_frame*3+2]];\n\t\t\t\tconst top_pos = [cameraPath[top_frame*3], cameraPath[top_frame*3+1], cameraPath[top_frame*3+2]];\n\t\t\t\tconst current_positions = [];\n\t\t\t\tfor (let i = 0; i < bot_pos.length; i++) {\n\t\t\t\t\tcurrent_positions.push(proportion * bot_pos[i] + (1.0 - proportion) * top_pos[i]);\n\t\t\t\t}\n\t\t\t\tthis.cameraObject.position.set(current_positions[0], current_positions[1], current_positions[2]);\n\t\t\t\tthis.cameraObject.target.set(top_pos[0], top_pos[1], top_pos[2]);\n\t\t\t\tif (deviceOrientationControl)\n\t\t\t\t\tthis.cameraObject.lookAt( this.cameraObject.target );\n\t\t\t\tif (updateLightWithPathFlag) {\n\t\t\t\t\tthis.directionalLight.position.set(current_positions[0], current_positions[1], current_positions[2]);\n\t\t\t\t\tthis.directionalLight.target.position.set(top_pos[0], top_pos[1], top_pos[2]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n /**\n * Force recalculation of the current path.\n */\n\tthis.calculatePathNow = () => {\n\t updatePath(0.0);\n\t}\n\n // handle synchronised control based on information in the idc\n const handleSyncControl = () => {\n if ((this._state === STATE.ROTATE) || (this._state === STATE.TOUCH_ROTATE) || (this._state === STATE.KEYBOARD_ROTATE)){\n //rotateion does not trigger callback\n tumble();\n } else if ((this._state === STATE.PAN) || (this._state === STATE.TOUCH_PAN) || (this._state === STATE.KEYBOARD_PAN)){\n translate();\n ndcControl.triggerCallback();\n } else if ((this._state === STATE.ZOOM) || (this._state === STATE.TOUCH_ZOOM) || (this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)){\n ndcControl.zoom(calculateZoomDelta());\n this.previous_pointer_x = this.pointer_x;\n this.previous_pointer_y = this.pointer_y;\n if ((this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)) {\n this._state = STATE.NONE;\n }\n zoomSize = 0;\n ndcControl.triggerCallback();\n }\n }\n\n /**\n * Update all controls related changes - including calculation of the viewport.\n *\n * @param {Number} timeChanged - Time eclipse since last called.\n */\n\tthis.update = timeChanged => {\n\t\tconst delta = timeChanged * playRate;\n\t\tlet controlEnabled = enabled;\n\t\tlet updated = true;\n\t\tif (currentMode === MODE.PATH) {\n\t\t\tupdatePath(delta);\n\t\t} else if (currentMode === MODE.SMOOTH_CAMERA_TRANSITION && smoothCameraTransitionObject) {\n\t\t\tsmoothCameraTransitionObject.update(delta);\n\t\t\tif (smoothCameraTransitionObject.isTransitionCompleted()) {\n\t\t\t\tsmoothCameraTransitionObject == undefined;\n\t\t\t\tcurrentMode = MODE.DEFAULT;\n\t\t\t}\n\t\t\tcontrolEnabled = false;\n\t\t} else if (currentMode === MODE.ROTATE_CAMERA_TRANSITION && rotateCameraTransitionObject) {\n\t\t\trotateCameraTransitionObject.update(delta);\n\t\t\tif (rotateCameraTransitionObject.isTransitionCompleted()) {\n\t\t\t\trotateCameraTransitionObject == undefined;\n\t\t\t\tcurrentMode = MODE.DEFAULT;\n\t\t\t}\n\t\t\tcontrolEnabled = false;\n\t\t} else if (currentMode === MODE.AUTO_TUMBLE && cameraAutoTumbleObject) {\n\t\t\tcameraAutoTumbleObject.update(delta);\n\t\t} else if (currentMode === MODE.SYNC_CONTROL && ndcControl) {\n handleSyncControl();\n controlEnabled = false;\n } else {\n\t\t\tupdated = false;\n\t\t}\n\t\tif (controlEnabled) {\n\t\t\tif (this._state !== STATE.NONE) {\n\t\t\t\tupdated = true;\n\t\t\t}\n\t\t\tif ((this._state === STATE.ROTATE) || (this._state === STATE.TOUCH_ROTATE) || (this._state === STATE.KEYBOARD_ROTATE)){\n\t\t\t\ttumble();\n\t\t\t} else if ((this._state === STATE.PAN) || (this._state === STATE.TOUCH_PAN) || (this._state === STATE.KEYBOARD_PAN)){\n\t\t\t\ttranslate();\n\t\t\t} else if ((this._state === STATE.ZOOM) || (this._state === STATE.TOUCH_ZOOM) || (this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)){\n\t\t\t\tflyZoom();\n\t\t\t}\n\t\t\tif (this._state !== STATE.NONE) {\n\t\t\t\tif (currentMode === MODE.AUTO_TUMBLE && cameraAutoTumbleObject &&\n\t\t\t\t\t\tcameraAutoTumbleObject.stopOnCameraInput) {\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._state === STATE.SCROLL)\n\t\t\t\tthis._state = STATE.NONE;\n\t\t}\n\t\tif (deviceOrientationControl) {\n\t\t\tupdated = true;\n\t\t\tdeviceOrientationControl.update();\n\t\t\t//this.directionalLight.target.position.set(this.cameraObject.target.x,\n\t\t\t//\tthis.cameraObject.target.y, this.cameraObject.target.z);\n\t\t} else {\n\t\t\tthis.cameraObject.lookAt( this.cameraObject.target );\n\t\t}\n\n\t\tupdated = updated || hasUpdated;\n\t\thasUpdated = false;\n\n\t\treturn updated;\n\t};\n\n /**\n * Switch to path mode and begin traveling through the camera path.\n */\n\tthis.playPath = () => {\n\t\tcurrentMode = MODE.PATH;\n\t}\n\n /**\n * Stop playing path and switch back to normal control.\n */\n\tthis.stopPath = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t}\n\n /**\n * Check rather the control is currently in path mode.\n *\n * @return {Boolean}\n */\n\tthis.isPlayingPath = () => {\n\t\treturn (currentMode === MODE.PATH);\n\t}\n\n /**\n * Enable directional light update as the camera\n * is traveling through path.\n *\n * @param {Boolean} flag\n */\n\tthis.enableDirectionalLightUpdateWithPath = flag => {\n\t\tupdateLightWithPathFlag = flag;\n\t}\n\n /**\n * Enable rotation using the devices's accelerometer.\n */\n\tthis.enableDeviceOrientation = () => {\n\t\tif (!deviceOrientationControl)\n\t\t\tdeviceOrientationControl = new ModifiedDeviceOrientationControls(this.cameraObject);\n\t}\n\n /**\n * Disable rotation using the devices's accelerometer.\n */\n\tthis.disableDeviceOrientation = () => {\n\t\tif (deviceOrientationControl) {\n\t\t\tdeviceOrientationControl.dispose();\n\t\t\tdeviceOrientationControl = undefined;\n\t\t}\n\t}\n\n /**\n * Check rather device orientation based on accelerometer is on.\n */\n\tthis.isDeviceOrientationEnabled = () => {\n\t\tif (deviceOrientationControl) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n /**\n * Reset the viewport settings to the one provided by default viewport.\n */\n\tthis.resetView = () => {\n const viewport = viewports[defaultViewport];\n\t\tthis.cameraObject.near = viewport.nearPlane;\n\t\tthis.cameraObject.far = viewport.farPlane;\n\t\tthis.cameraObject.position.set( viewport.eyePosition[0], viewport.eyePosition[1],\n viewport.eyePosition[2]);\n\t\tthis.cameraObject.target.set( viewport.targetPosition[0],\n viewport.targetPosition[1], viewport.targetPosition[2] );\n\t\tthis.cameraObject.up.set( viewport.upVector[0], viewport.upVector[1],\n viewport.upVector[2]);\n\t\tthis.cameraObject.updateProjectionMatrix();\n\t\tthis.updateDirectionalLight();\n\t}\n\n /**\n * Set the current camera settings with the provided viewport.\n *\n * @param {Viewport} newViewport - viewport settings.\n */\n\tthis.setCurrentCameraSettings = newViewport => {\n\t\tif (newViewport.nearPlane)\n\t\t\tthis.cameraObject.near = newViewport.nearPlane;\n\t\tif (newViewport.farPlane)\n\t\t\tthis.cameraObject.far = newViewport.farPlane;\n\t\tif (newViewport.eyePosition)\n\t\t\tthis.cameraObject.position.set( newViewport.eyePosition[0],\n\t\t\t\t\tnewViewport.eyePosition[1], newViewport.eyePosition[2]);\n\t\tif (newViewport.targetPosition)\n\t\t\tthis.cameraObject.target.set( newViewport.targetPosition[0],\n\t\t\t\t\tnewViewport.targetPosition[1], newViewport.targetPosition[2] );\n\t\tif (newViewport.upVector)\n\t\t\tthis.cameraObject.up.set( newViewport.upVector[0], newViewport.upVector[1],\n\t\t\t\t\tnewViewport.upVector[2]);\n\t\tthis.cameraObject.updateProjectionMatrix();\n\t\tthis.updateDirectionalLight();\n\t\thasUpdated = true;\n\t}\n\n /**\n * Get the viewport based on centre, radius, view_angle and clip distance.\n *\n * @param {Number} centreX - x coordinate of the centre.\n * @param {Number} centreY - y coordinate of the centre.\n * @param {Number} centreZ - z coordinate of the centre.\n * @param {Number} radius - radius if the viewport.\n * @param {Number} view_angle - view angle.\n * @param {Number} clip_distance - clip_distance between the near and far plane.\n *\n * @return {Viewport}\n */\n\tthis.getViewportFromCentreAndRadius = (centreX, centreY, centreZ, radius, view_angle, clip_distance) => {\n _a.copy(this.cameraObject.position);\n _a.sub(this.cameraObject.target);\n _a.normalize();\n\t\t/* look at the centre of the sphere */\n\t\tconst localTargetPosition = [centreX, centreY, centreZ];\n\t\t/* shift the eye position to achieve the desired view_angle */\n\t\tconst eye_distance = radius/Math.tan(view_angle*Math.PI/360.0);\n\t\tconst localEyePosition = [ centreX + _a.x*eye_distance, centreY + _a.y*eye_distance,\n\t\t centreZ + _a.z*eye_distance];\n\t\tconst localFarPlane = eye_distance+clip_distance;\n\t\tlet localNearPlane = 0.0;\n\t\tconst nearClippingFactor = 0.95;\n\t\tif (clip_distance > nearClippingFactor*eye_distance)\n\t\t{\n\t\t\tlocalNearPlane = (1.0 - nearClippingFactor)*eye_distance;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlocalNearPlane = eye_distance - clip_distance;\n\t\t}\n\t\tconst newViewport = new Viewport();\n\t\tnewViewport.nearPlane = localNearPlane;\n\t\tnewViewport.farPlane = localFarPlane;\n\t\tnewViewport.eyePosition = localEyePosition;\n\t\tnewViewport.targetPosition = localTargetPosition;\n\t\tnewViewport.upVector = [this.cameraObject.up.x, this.cameraObject.up.y,\n\t\t this.cameraObject.up.z];\n\n\t\treturn newViewport;\n\t}\n\n\t /**\n * Get the viewport for the boudning box\n *\n * @param {Number} boundingBox - y coordinate of the centre.\n * @return {Viewport}\n */\n\tthis.getViewportFromBoundingBox = (boundingBox, radiusScale) => {\n\t\tconst radius = boundingBox.min.distanceTo(boundingBox.max) / 2.0 * radiusScale;\n\t\tconst centreX = (boundingBox.min.x + boundingBox.max.x) / 2.0;\n\t\tconst centreY = (boundingBox.min.y + boundingBox.max.y) / 2.0;\n\t\tconst centreZ = (boundingBox.min.z + boundingBox.max.z) / 2.0;\n\t\tconst clip_factor = 4.0;\n\t\tconst viewport = this.getViewportFromCentreAndRadius(\n\t\t\tcentreX, centreY, centreZ, radius, 40, radius * clip_factor);\n\t\treturn viewport;\n\t}\n\n /**\n * Get the current camera viewport.\n *\n * @return {Viewport}\n */\n\tthis.getCurrentViewport = () => {\n\t\tconst currentViewport = new Viewport();\n\t\tcurrentViewport.nearPlane = this.cameraObject.near;\n\t\tcurrentViewport.farPlane = this.cameraObject.far;\n\t\tcurrentViewport.eyePosition[0] = this.cameraObject.position.x;\n\t\tcurrentViewport.eyePosition[1] = this.cameraObject.position.y;\n\t\tcurrentViewport.eyePosition[2] = this.cameraObject.position.z;\n\t\tcurrentViewport.targetPosition[0] = this.cameraObject.target.x;\n\t\tcurrentViewport.targetPosition[1] = this.cameraObject.target.y;\n\t\tcurrentViewport.targetPosition[2] = this.cameraObject.target.z;\n\t\tcurrentViewport.upVector[0] = this.cameraObject.up.x;\n\t\tcurrentViewport.upVector[1] = this.cameraObject.up.y;\n\t\tcurrentViewport.upVector[2] = this.cameraObject.up.z;\n\t\treturn currentViewport;\n\t}\n\n\tthis.getDefaultEyePosition = () => {\n\t\treturn eyePosition;\n\t}\n\n\tthis.getDefaultTargetPosition = () => {\n\t\treturn targetPosition;\n\t}\n\n /**\n * Setup a smooth transition object which transition the camera from one\n * viewport to the other in the specified duration. This will not work if\n * {@link rotateCameraTransition} is active.\n * To use this object, the transition must be enabled using\n * {@link enableCameraTransition}.\n *\n * @param {Viewport} startingViewport - the starting viewport\n * @param {Viewport} endingViewport - the viewport ti end the transistion with.\n * @param {Number} durationIn - duration of the smooth transition.\n */\n\tthis.cameraTransition = (startingViewport, endingViewport, durationIn) => {\n\t if (rotateCameraTransitionObject == undefined)\n\t smoothCameraTransitionObject = new SmoothCameraTransition(startingViewport, endingViewport,\n\t this, durationIn);\n\t}\n\n /**\n * Setup a rotate camera transition object which rotate the\n * camera by the specified the angle in the specified\n * duration. This will not work if {@link cameraTransition}\n * is active.\n * To use this object, the transition must be enabled using\n * {@link enableCameraTransition}.\n *\n * @param {THREE.Vector3} axis - the starting viewport\n * @param {Number} angle - the viewport ti end the transistion with.\n * @param {Number} duration - duration of the smooth transition.\n */\n\tthis.rotateCameraTransition = (axis, angle, duration) => {\n\t if (smoothCameraTransitionObject == undefined)\n\t rotateCameraTransitionObject = new RotateCameraTransition(axis, angle,\n\t this, duration);\n\t}\n\n /**\n * Enable camera transition, {@link rotateCameraTransition} amd\n * {@link cameraTransition} must be called before camera transition can\n * be enabled.\n */\n\tthis.enableCameraTransition = () => {\n\t if (smoothCameraTransitionObject)\n\t currentMode = MODE.SMOOTH_CAMERA_TRANSITION;\n\t if (rotateCameraTransitionObject)\n\t currentMode = MODE.ROTATE_CAMERA_TRANSITION;\n\t}\n\n /**\n * Pause the camera transition.\n */\n\tthis.pauseCameraTransition = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t}\n\n /**\n * Stop the camera transition and remove camera transition\n * and rotate camera transition.\n */\n\tthis.stopCameraTransition = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t\tsmoothCameraTransitionObject = undefined;\n\t\trotateCameraTransitionObject = undefined;\n\t}\n\n /**\n * Check if camera transition is active.\n */\n\tthis.isTransitioningCamera = () => {\n\t\treturn (currentMode === MODE.SMOOTH_CAMERA_TRANSITION ||\n\t\t currentMode === MODE.ROTATE_CAMERA_TRANSITION);\n\t}\n\n /**\n * Setup auto tumble object of the camera which will rotate the camera\n * around the target as if the user is rotating the camera by mouse/touch\n * interaction.\n * The tumbling will only be enabled with {@link enabelAutoTumble}.\n *\n * @param {Array} tumbleDirectionIn - direction of the mouse/touch.\n * @param {Number} tumbleRateIn - Speed of the tumbling.\n * @param {Boolean} stopOnCameraInputIn - Disable the tumbling once the user\n * start interacting with the scene.\n */\n\tthis.autoTumble = (tumbleDirectionIn, tumbleRateIn, stopOnCameraInputIn) => {\n\t\tcameraAutoTumbleObject = new CameraAutoTumble(tumbleDirectionIn, tumbleRateIn, stopOnCameraInputIn, this);\n\t}\n\n /**\n * Enable autotumble.\n */\n\tthis.enableAutoTumble = () => {\n\t\tcurrentMode = MODE.AUTO_TUMBLE;\n\t}\n\n /**\n * Disable the autotumble.\n */\n\tthis.stopAutoTumble = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t\tcameraAutoTumbleObject = undefined;\n\t}\n\n /**\n * Update the autotumble object.\n */\n\tthis.updateAutoTumble = () => {\n\t\tif (cameraAutoTumbleObject)\n\t\t\tcameraAutoTumbleObject.requireUpdate = true;\n\t}\n\n /**\n * Check rather autotumble is active.\n *\n * @return {Boolean}\n */\n\tthis.isAutoTumble = () => {\n\t\treturn (currentMode === MODE.AUTO_TUMBLE);\n\t}\n\n /**\n * Create an internal raycaster object and enable it for picking.\n *\n * @param {Scene} sceneIn - The scene to pick from, it can be different from the\n * camera's scene.\n * @param {requestCallback} callbackFunctionIn - The callback for pick event.\n * @param {requestCallback} hoverCallbackFunctionIn - The callback for hover\n * over event.\n */\n this.enableRaycaster = (sceneIn, callbackFunctionIn, hoverCallbackFunctionIn) => {\n if (zincRayCaster == undefined)\n zincRayCaster = new RayCaster(sceneIn, this.scene, callbackFunctionIn, hoverCallbackFunctionIn, this.renderer);\n }\n\n /**\n * Disable raycaster and remove the internal ray caster object.\n */\n this.disableRaycaster = () => {\n zincRayCaster.disable();\n zincRayCaster = undefined;\n }\n\n /**\n * Check rather the camera is in syncControl mode.\n *\n * @return {Boolean}\n */\n this.isSyncControl = () => {\n return currentMpde === MODE.SYNC_CONTROL;\n }\n\n /**\n * Enable syncControl.\n */\n this.enableSyncControl = () => {\n currentMode = MODE.SYNC_CONTROL;\n if (!ndcControl)\n ndcControl = new NDCCameraControl();\n ndcControl.setCurrentCameraSettings(this.cameraObject,\n viewports[defaultViewport]);\n return ndcControl;\n }\n\n /**\n * Disable syncControl.\n */\n this.disableSyncControl = () => {\n currentMode = MODE.DEFAULT;\n this.cameraObject.zoom = 1;\n this.cameraObject.updateProjectionMatrix();\n }\n\n\tthis.enable();\n\n};\n\nconst SmoothCameraTransition = function(startingViewport, endingViewport, targetCameraIn, durationIn) {\n\tconst startingEyePosition = startingViewport.eyePosition;\n\tconst startingTargetPosition = startingViewport.targetPosition;\n\tconst startingUp = startingViewport.upVector;\n\tconst endingEyePosition = endingViewport.eyePosition;\n\tconst endingTargetPosition = endingViewport.targetPosition;\n\tconst endingUp = endingViewport.upVector;\n\tconst targetCamera = targetCameraIn;\n\tlet duration = durationIn;\n\tlet inbuildTime = 0;\n\tconst enabled = true;\n\tconst updateLightWithPathFlag = true;\n\tlet completed = false;\n\ttargetCamera.near = Math.min(startingViewport.nearPlane, endingViewport.nearPlane);\n\ttargetCamera.far = Math.max(startingViewport.farPlane, endingViewport.farPlane);\n\ttargetCamera.cameraObject.up.set( endingViewport.upVector[0], endingViewport.upVector[1],\n endingViewport.upVector[2]);\n\n this.setDuration = newDuration => {\n duration = newDuration;\n }\n\n\tconst updateTime = delta => {\n\t\tlet targetTime = inbuildTime + delta;\n\t\tif (targetTime > duration)\n\t\t\ttargetTime = duration;\n\t\tinbuildTime = targetTime;\n\t};\n\n\tconst updateCameraSettings = () => {\n\t\tconst ratio = inbuildTime / duration;\n\t\tconst eyePosition = [startingEyePosition[0] * (1.0 - ratio) + endingEyePosition[0] * ratio,\n\t\t startingEyePosition[1] * (1.0 - ratio) + endingEyePosition[1] * ratio,\n\t\t startingEyePosition[2] * (1.0 - ratio) + endingEyePosition[2] * ratio];\n\t\tconst targetPosition = [startingTargetPosition[0] * (1.0 - ratio) + endingTargetPosition[0] * ratio,\n\t\t startingTargetPosition[1] * (1.0 - ratio) + endingTargetPosition[1] * ratio,\n\t\t startingTargetPosition[2] * (1.0 - ratio) + endingTargetPosition[2] * ratio];\n const upVector = [startingUp[0] * (1.0 - ratio) + endingUp[0] * ratio,\n startingUp[1] * (1.0 - ratio) + endingUp[1] * ratio,\n startingUp[2] * (1.0 - ratio) + endingUp[2] * ratio];\n\t\ttargetCamera.cameraObject.position.set( eyePosition[0], eyePosition[1], eyePosition[2]);\n\t\ttargetCamera.cameraObject.target.set( targetPosition[0], targetPosition[1], targetPosition[2] );\n\t};\n\n\tthis.update = delta => {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tupdateTime(delta);\n\n\t\tupdateCameraSettings();\n\n\t\tif (inbuildTime == duration) {\n\t\t\tcompleted = true;\n\t\t}\n\n\t}\n\n\tthis.isTransitionCompleted = () => {\n\t\treturn completed;\n\t}\n\n};\n\nconst RotateCameraTransition = function(axisIn, angleIn, targetCameraIn, durationIn) {\n const axis = axisIn;\n const angle = angleIn;\n const targetCamera = targetCameraIn;\n let duration = durationIn;\n let inbuildTime = 0;\n const enabled = true;\n const ratio = inbuildTime / duration;\n let completed = false;\n\n this.setDuration = newDuration => {\n duration = newDuration;\n }\n\n const updateCameraSettings = delta => {\n const previousTime = inbuildTime;\n let targetTime = inbuildTime + delta;\n if (targetTime > duration)\n targetTime = duration;\n inbuildTime = targetTime;\n const actualDelta = inbuildTime - previousTime;\n const ratio = actualDelta / duration;\n const alpha = ratio * angle;\n targetCamera.rotateAboutLookAtpoint(axis, alpha);\n };\n\n this.update = delta => {\n\n if ( this.enabled === false ) return;\n\n updateCameraSettings(delta);\n\n if (inbuildTime == duration) {\n completed = true;\n }\n\n }\n\n this.isTransitionCompleted = () => {\n return completed;\n }\n}\n\nconst RayCaster = function (sceneIn, hostSceneIn, callbackFunctionIn, hoverCallbackFunctionIn, rendererIn) {\n const scene = sceneIn;\n const hostScene = hostSceneIn;\n\tconst renderer = rendererIn;\n\tconst callbackFunction = callbackFunctionIn;\n\tconst hoverCallbackFunction = hoverCallbackFunctionIn;\n\tconst enabled = true;\n\tconst raycaster = new THREE.Raycaster();\n\traycaster.params.Line.threshold = 0.1;\n\traycaster.params.Points.threshold = 1;\n const mouse = new THREE.Vector2();\n let awaiting = false;\n let lastHoveredDate = new Date();\n let lastHoveredEmpty = false;\n let timeDiff = 0;\n let pickedObjects = new Array();\n let lastPosition = { zincCamera: undefined, x: -1 ,y: -1};\n\tlet pickableObjects = undefined;\n\n\tthis.enable = () => {\n\t\tenable = true;\n\t}\n\n\tthis.disable = () => {\n\t\tenable = false;\n\t}\n\n\tthis.getIntersectsObject = (zincCamera) => {\n if (hostScene !== scene) {\n const threejsScene = scene.getThreeJSScene();\n renderer.render(threejsScene, zincCamera.cameraObject);\n }\n let objects = pickableObjects ? pickableObjects : scene.getPickableThreeJSObjects();\n //Reset pickedObjects array\n pickedObjects.length = 0;\n\t\treturn raycaster.intersectObjects( objects, true, pickedObjects );\n\t}\n\n\tthis.setPickableObjects = (zincObjects) => {\n\t\tif (zincObjects === undefined) {\n\t\t\tpickableObjects = undefined;\n\t\t} else {\n\t\t\tpickableObjects = [];\n\t\t\tzincObjects.forEach(zincObject => {\n\t\t\t\tif (zincObject.getGroup() && zincObject.getGroup().visible) {\n\t\t\t\t\tpickableObjects.push(zincObject.getGroup());\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tthis.getIntersectsObjectWithOrigin = (zincCamera, origin, direction) => {\n\t\traycaster.set(origin, direction);\n\t\treturn this.getIntersectsObject(zincCamera);\n\t}\n\n\tthis.getIntersectsObjectWithCamera = (zincCamera, x, y) => {\n zincCamera.getNDCFromDocumentCoords(x, y, mouse);\n\t\traycaster.setFromCamera(mouse, zincCamera.cameraObject);\n\t\treturn this.getIntersectsObject(zincCamera);\n\t};\n\n\tthis.pick = (zincCamera, x, y) => {\n\t\tif (enabled && renderer && scene && zincCamera && callbackFunction) {\n\t\t\tthis.getIntersectsObjectWithCamera(zincCamera, x, y);\n\t\t\tconst length = pickedObjects.length;\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tlet zincObject = pickedObjects[i].object ? pickedObjects[i].object.userData : undefined;\n\t\t\t\tif (zincObject && zincObject.isMarkerCluster && zincObject.visible\n\t\t\t\t\t&& zincObject.clusterIsVisible(pickedObjects[i].object.clusterIndex)) {\n\t\t\t\t\t//Can zoom into cluster\n\t\t\t\t\tif (zincObject.zoomToCluster(pickedObjects[i].object.clusterIndex)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcallbackFunction(pickedObjects, x, y);\n\t\t}\n }\n\n let hovered = (zincCamera, x, y) => {\n if (enabled && renderer && scene && zincCamera && hoverCallbackFunction) {\n this.getIntersectsObjectWithCamera(zincCamera, x, y);\n lastHoveredDate.setTime(Date.now());\n if (pickedObjects.length === 0) {\n //skip hovered callback if the previous one is empty\n if (lastHoveredEmpty)\n return\n lastHoveredEmpty = true;\n } else {\n lastHoveredEmpty = false;\n }\n hoverCallbackFunction(pickedObjects, x, y);\n }\n }\n\n\tthis.move = (zincCamera, x, y) => {\n if (enabled && renderer && scene && zincCamera && hoverCallbackFunction) {\n if (scene.displayMarkers) {\n hovered(zincCamera, x, y);\n } else {\n lastPosition.zincCamera = zincCamera;\n lastPosition.x = x;\n lastPosition.y = y;\n if (!awaiting) {\n timeDiff = lastHoveredDate ? Date.now() - lastHoveredDate.getTime() : 250;\n if (timeDiff >= 250) {\n hovered(zincCamera, x, y);\n } else {\n awaiting = true;\n setTimeout(awaitMove(lastPosition), timeDiff);\n }\n }\n }\n }\n }\n\n let awaitMove = (lastPosition) => {\n return function() {\n awaiting = false;\n hovered(lastPosition.zincCamera, lastPosition.x, lastPosition.y);\n }\n }\n};\n\nconst CameraAutoTumble = function (tumbleDirectionIn, tumbleRateIn, stopOnCameraInputIn, targetCameraIn) {\n\tconst tumbleAxis = new THREE.Vector3();\n\tconst angle = -tumbleRateIn;\n\tconst targetCamera = targetCameraIn;\n\tconst enabled = true;\n\tconst updateLightWithPathFlag = true;\n\tconst tumbleDirection = tumbleDirectionIn;\n\tthis.stopOnCameraInput = stopOnCameraInputIn;\n this.requireUpdate = true;\n const b = new THREE.Vector3();\n const c = new THREE.Vector3();\n\n\tconst computeTumbleAxisAngle = tumbleDirection => {\n\t\tconst tangent_dist = Math.sqrt(tumbleDirection[0]*tumbleDirection[0] +\n\t\t\ttumbleDirection[1]*tumbleDirection[1]);\n\t\tconst width = Math.abs(tumbleDirection[0]) * 4.0;\n\t\tconst height = Math.abs(tumbleDirection[1]) * 4.0;\n\t\tconst radius = 0.25 * (width + height);\n\t\tconst dx = -tumbleDirection[1]/tangent_dist;\n\t\tconst dy = tumbleDirection[0]/tangent_dist;\n\t\tlet d = dx*(tumbleDirection[0])+dy*(-tumbleDirection[1]);\n\n\t\tif (d > radius)\n\t\t{\n\t\t\td = radius;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (d < -radius)\n\t\t\t{\n\t\t\t\td = -radius;\n\t\t\t}\n\t\t}\n\n\t\tconst phi=Math.acos(d/radius)-0.5*Math.PI;\n\t\t/* get axis to rotate about */\n\t\ttumbleAxis.copy(targetCamera.cameraObject.position).sub(\n targetCamera.cameraObject.target).normalize();\n\t\tb.copy(targetCamera.cameraObject.up).normalize();\n c.crossVectors(b, tumbleAxis).normalize().multiplyScalar(dx);\n b.multiplyScalar(dy);\n b.add(c).multiplyScalar(Math.cos(phi));\n tumbleAxis.multiplyScalar(Math.sin(phi)).add(b);\n\t};\n\n\tthis.update = delta => {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tif (this.requireUpdate) {\n\t\t\tcomputeTumbleAxisAngle(tumbleDirection);\n\t\t\tthis.requireUpdate = false;\n\t\t}\n\t\ttargetCamera.rotateAboutLookAtpoint(tumbleAxis, angle * delta/1000);\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\nconst StereoCameraZoomFixed = function () {\n\n\tthis.type = 'StereoCamera';\n\n\tthis.aspect = 1;\n\n\tthis.cameraL = new THREE.PerspectiveCamera();\n\tthis.cameraL.layers.enable( 1 );\n\tthis.cameraL.matrixAutoUpdate = false;\n\n\tthis.cameraR = new THREE.PerspectiveCamera();\n\tthis.cameraR.layers.enable( 2 );\n\tthis.cameraR.matrixAutoUpdate = false;\n\n};\n\nObject.assign( StereoCameraZoomFixed.prototype, {\n\n\tupdate: (() => {\n\n\t\tlet focus, fov, aspect, near, far, zoom;\n\n\t\tconst eyeRight = new THREE.Matrix4();\n\t\tconst eyeLeft = new THREE.Matrix4();\n\n\t\treturn function update( camera ) {\n\n\t\t\tconst needsUpdate = focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\tif ( needsUpdate ) {\n\n\t\t\t\tfocus = camera.focus;\n\t\t\t\tfov = camera.fov;\n\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\tnear = camera.near;\n\t\t\t\tfar = camera.far;\n\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\tconst projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\tconst eyeSep = 0.064 / 2;\n\t\t\t\tconst eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\tconst ymax = near * Math.tan( THREE.Math.DEG2RAD * fov * 0.5 ) / camera.zoom;\n\t\t\t\tlet xmin, xmax;\n\n\t\t\t\t// translate xOffset\n\n\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t// for left eye\n\n\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t// for right eye\n\n\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t}\n\n\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t};\n\n\t})()\n\n} );\n\n/** the following StereoEffect is written by third party */\n/**\n * @author alteredq / http://alteredqualia.com/\n * @authod mrdoob / http://mrdoob.com/\n * @authod arodic / http://aleksandarrodic.com/\n * @authod fonserbc / http://fonserbc.github.io/\n*/\nconst StereoEffect = function ( renderer ) {\n\n\tconst _stereo = new StereoCameraZoomFixed();\n\t_stereo.aspect = 0.5;\n\n\tthis.setSize = (width, height) => {\n\n\t\trenderer.setSize( width, height );\n\n\t};\n\n\tthis.render = (scene, camera) => {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t_stereo.update( camera );\n\n\t\tconst size = renderer.getSize();\n\n\t\trenderer.setScissorTest( true );\n\t\trenderer.clear();\n\n\t\trenderer.setScissor( 0, 0, size.width / 2, size.height );\n\t\trenderer.setViewport( 0, 0, size.width / 2, size.height );\n\t\trenderer.render( scene, _stereo.cameraL );\n\n\t\trenderer.setScissor( size.width / 2, 0, size.width / 2, size.height );\n\t\trenderer.setViewport( size.width / 2, 0, size.width / 2, size.height );\n\t\trenderer.render( scene, _stereo.cameraR );\n\n\t\trenderer.setScissorTest( false );\n\n\t};\n\n};\n\n\n/**\n * @author richt / http://richt.me\n * @author WestLangley / http://github.com/WestLangley\n *\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nconst ModifiedDeviceOrientationControls = function ( object ) {\n\n\tconst scope = this;\n\n\tthis.object = object;\n\tthis.object.rotation.reorder( \"YXZ\" );\n\n\tthis.enabled = true;\n\n\tthis.deviceOrientation = {};\n\tthis.screenOrientation = 0;\n\n\tconst onDeviceOrientationChangeEvent = event => {\n\n\t\tscope.deviceOrientation = event;\n\n\t};\n\n\tconst onScreenOrientationChangeEvent = () => {\n\t if (typeof(window) !== 'undefined')\n\t scope.screenOrientation = window.orientation || 0;\n\n\t};\n\n\t// The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\n\n\tconst setObjectQuaternion = (() => {\n\n\t\tconst zee = new THREE.Vector3( 0, 0, 1 );\n\n\t\tconst euler = new THREE.Euler();\n\n\t\tconst q0 = new THREE.Quaternion();\n\n\t\tconst q1 = new THREE.Quaternion( - Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ); // - PI/2 around the x-axis\n\n\t\treturn (cameraObject, alpha, beta, gamma, orient) => {\n\n\t\t\tconst vector = new THREE.Vector3(0, 0, 1);\n\n\t\t\tvector.subVectors(cameraObject.target, cameraObject.position);\n\n\t\t\teuler.set( beta, alpha, - gamma, 'YXZ' ); // 'ZXY' for the device, but 'YXZ' for us\n\n\t\t\tconst quaternion = new THREE.Quaternion();\n\n\t\t\tquaternion.setFromEuler( euler ); // orient the device\n\n\t\t\tquaternion.multiply( q1 ); // camera looks out the back of the device, not the top\n\n\t\t\tquaternion.multiply( q0.setFromAxisAngle( zee, - orient ) ); // adjust for screen orientation\n\n\t\t\tvector.applyQuaternion(quaternion);\n\n\t\t\tvector.addVectors(cameraObject.position, vector);\n\n\t\t\tcameraObject.lookAt(vector);\n\n\t\t};\n\n\t})();\n\n\tthis.connect = () => {\n\n\t\tonScreenOrientationChangeEvent(); // run once on load\n\t\tif (typeof(window) !== 'undefined') {\n\t\t window.addEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\n\t\t window.addEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\n\t\t}\n\t\tscope.enabled = true;\n\n\t};\n\n\tthis.disconnect = () => {\n\t if (typeof(window) !== 'undefined') {\n\t window.removeEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\n\t\t window.removeEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\n\t }\n\t\tscope.enabled = false;\n\n\t};\n\n\tthis.update = () => {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tconst alpha = scope.deviceOrientation.alpha ? THREE.Math.degToRad( scope.deviceOrientation.alpha ) : 0; // Z\n\t\tconst beta = scope.deviceOrientation.beta ? THREE.Math.degToRad( scope.deviceOrientation.beta ) : 0; // X'\n\t\tconst gamma = scope.deviceOrientation.gamma ? THREE.Math.degToRad( scope.deviceOrientation.gamma ) : 0; // Y''\n\t\tconst orient = scope.screenOrientation ? THREE.Math.degToRad( scope.screenOrientation ) : 0; // O\n\n\t\tsetObjectQuaternion( scope.object, alpha, beta, gamma, orient );\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\tthis.disconnect();\n\n\t};\n\n\tthis.connect();\n\n};\n\nconst NDCCameraControl = function () {\n\tlet camera = undefined;\n let targetCamera = undefined;\n let defaultViewport = undefined;\n const position = new THREE.Vector3();\n const target = new THREE.Vector3();\n const v1 = new THREE.Vector3();\n const v2 = new THREE.Vector3();\n let eventCallback = undefined;\n\n this.setCurrentCameraSettings = (cameraIn, defaultViewportIn) => {\n this.near_plane_fly_debt == 0.0;\n camera = cameraIn.clone();\n targetCamera = cameraIn;\n defaultViewport = defaultViewportIn;\n camera.near = defaultViewport.nearPlane;\n if (defaultViewport.farPlane)\n camera.far = defaultViewport.farPlane;\n if (defaultViewport.eyePosition)\n camera.position.set(defaultViewport.eyePosition[0],\n defaultViewport.eyePosition[1], defaultViewport.eyePosition[2]);\n if (defaultViewport.upVector)\n camera.up.set(defaultViewport.upVector[0], defaultViewport.upVector[1],\n defaultViewport.upVector[2]);\n if (defaultViewport.targetPosition) {\n camera.target = new THREE.Vector3(defaultViewport.targetPosition[0],\n defaultViewport.targetPosition[1], defaultViewport.targetPosition[2]);\n camera.lookAt(camera.target);\n }\n camera.updateProjectionMatrix();\n position.copy(camera.position).project(camera);\n target.copy(camera.target).project(camera);\n }\n\n this.getCurrentPosition = () => {\n target.copy(targetCamera.target).project(camera);\n return [target.x, target.y];\n }\n\n this.zoom = delta => {\n let scaledDelta = delta * 0.002;\n let zoom = Math.max(targetCamera.zoom - scaledDelta, 1.0);\n targetCamera.zoom = zoom;\n targetCamera.updateProjectionMatrix();\n }\n\n this.zoomToBox = (box, zoom) => {\n box.getCenter(v1);\n v1.project(camera);\n this.setCenterZoom([v1.x, v1.y], zoom);\n }\n\n //return top left and size\n this.getPanZoom = () => {\n return {target: this.getCurrentPosition(), zoom: targetCamera.zoom };\n }\n\n this.setCenterZoom = (center, zoom) => {\n v1.set(center[0], center[1], target.z).unproject(camera);\n v2.copy(v1).sub(targetCamera.target);\n targetCamera.target.copy(v1);\n targetCamera.lookAt(targetCamera.target);\n targetCamera.position.add(v2);\n targetCamera.zoom = zoom;\n targetCamera.updateProjectionMatrix();\n }\n\n this.setEventCallback = (callback) => {\n if (callback === undefined || (typeof callback == 'function'))\n eventCallback = callback;\n }\n\n this.triggerCallback = () => {\n if (eventCallback !== undefined && (typeof eventCallback == 'function'))\n eventCallback();\n }\n};\n\nexport {\n Viewport,\n CameraControls,\n SmoothCameraTransition,\n RotateCameraTransition,\n RayCaster,\n CameraAutoTumble,\n StereoEffect,\n NDCCameraControl\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'%20?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20version='1.1'%20width='365'%20height='560'%20viewBox='0%200%20365%20560'%20xml:space='preserve'%3e%3cdesc%3eCreated%20with%20Fabric.js%205.2.4%3c/desc%3e%3cdefs%3e%3c/defs%3e%3crect%20x='0'%20y='0'%20width='100%25'%20height='100%25'%20fill='transparent'%3e%3c/rect%3e%3cg%20transform='matrix(0%200%200%200%200%200)'%20id='808ed283-2524-440f-88ae-3bdb47bb5749'%20%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%20182.5%20280)'%20id='db30413d-5bff-4b98-ab59-464497ee199e'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-182.5'%20y='-280'%20rx='0'%20ry='0'%20width='365'%20height='560'%20/%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0.99%200%200%200.99%20182.5%20280)'%20%3e%3cg%20style=''%20vector-effect='non-scaling-stroke'%20%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-540'%20y='-540'%20rx='0'%20ry='0'%20width='1080'%20height='1080'%20/%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3cpath%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,165,0);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20transform='%20translate(-182.9,%20-279.85)'%20d='M%20182.9%20551.7%20C%20182.9%20551.8000000000001%20183.1%20552%20183.1%20552%20C%20183.1%20552%20358.3%20283%20358.3%20194.6%20C%20358.3%2064.5%20269.5%207.900000000000006%20182.9%207.699999999999989%20C%2096.3%207.9%207.5%2064.5%207.5%20194.6%20C%207.5%20283%20182.8%20552%20182.8%20552%20C%20182.8%20552%20182.9%20551.7%20182.9%20551.7%20z%20M%20122.2%20187.2%20C%20122.2%20153.6%20149.4%20126.39999999999999%20183%20126.39999999999999%20C%20216.6%20126.39999999999999%20243.8%20153.6%20243.8%20187.2%20C%20243.8%20220.79999999999998%20216.5%20248%20182.9%20248%20C%20149.4%20248%20122.2%20220.8%20122.2%20187.2%20z'%20stroke-linecap='round'%20/%3e%3c/g%3e%3cg%20transform='matrix(3.82%200%200%203.82%200%20-100.77)'%20%3e%3ccircle%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20cx='0'%20cy='0'%20r='35'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","import * as THREE from 'three';\nimport { ZincObject } from './zincObject';\nconst markerImage = new Image(128, 128);\nimport mapMarkerOrange from '../assets/mapMarkerOrange.svg';\nmarkerImage.src = mapMarkerOrange;\nconst texture = new THREE.Texture();\ntexture.image = markerImage;\ntexture.needsUpdate = true;\nconst size = [0.02, 0.03, 1];\nconst spriteMaterial = new THREE.SpriteMaterial({\n map: texture,\n alphaTest: 0.5,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n sizeAttenuation: false\n});\nimport { createNewSpriteText } from '../utilities';\n\n/**\n * A special graphics type with a tear drop shape.\n * It forms a cluster a marker based on distance.\n *\n * @class\n * @author Alan Wu\n * @return {Marker}\n */\nconst MarkerCluster = function(sceneIn) {\n ZincObject.call(this);\n this.texture = texture;\n let sprite = undefined;\n let scene = sceneIn;\n this.morph = new THREE.Group();\n this.group = this.morph;\n this.isMarkerCluster = true;\n let enabled = true;\n let sprites = [];\n this.markers = {};\n let _v21 = new THREE.Vector2();\n let _v22 = new THREE.Vector2();\n let _radius = 0.1;\n let start = Date.now();\n\n /**\n * Set the size of the marker.\n *\n * @param {Number} size - size to be set.\n */\n this.setSpriteSize = size => {\n sprite.scale.set(0.015, 0.02, 1);\n sprite.scale.multiplyScalar(size);\n }\n\n this.clear = () => {\n this.group.clear();\n this.markers = {};\n }\n\n /**\n * Clean up this object,\n */\n this.dispose = () => {\n this.clear();\n if (this.morph) {\n this.morph.clear();\n }\n }\n\n const createNewSprite = (index) => {\n //Group is needed to set the position after scaling\n //the sprite\n const localGroup = new THREE.Group();\n const sprite = new THREE.Sprite(spriteMaterial);\n sprite.clusterIndex = index;\n sprite.center.set(0.5, 0);\n sprite.position.set(0, 0, 0);\n sprite.renderOrder = 10000;\n sprite.scale.set(size[0], size[1], size[2]);\n sprite.userData = this;\n localGroup.add(sprite);\n this.group.add(localGroup);\n return {\n \"group\": localGroup,\n \"marker\": sprite,\n \"label\": undefined,\n \"number\": 0,\n \"min\": [0, 0, 0],\n \"max\": [1, 1, 1],\n };\n }\n\n const activateSpriteForCluster = (sprite, cluster, number) => {\n sprite.group.visible = true;\n sprite.group.position.set(\n cluster.coords[0], cluster.coords[1], cluster.coords[2]\n );\n if (sprite.label === undefined || (number !== sprite.number)) {\n if (sprite.label) {\n sprite.group.remove(sprite.label);\n sprite.label.material.map.dispose();\n sprite.label.material.dispose();\n }\n sprite.label = createNewSpriteText(number, 0.012, \"black\", \"Asap\", 120, 700);\n sprite.number = number;\n sprite.group.add(sprite.label);\n }\n sprite.min = cluster.min;\n sprite.max = cluster.max;\n }\n\n const drawClusters = (clusters) => {\n let currentIndex = 0;\n clusters.forEach((cluster) => {\n const length = cluster.members.length;\n let number = 0;\n if (length === 1) {\n cluster.members[0].setVisibility(true);\n } else {\n cluster.members.forEach((marker) => {\n number += marker.getNumber();\n marker.setVisibility(false);\n });\n if (!sprites[currentIndex]) {\n sprites.push(createNewSprite(currentIndex));\n }\n activateSpriteForCluster(sprites[currentIndex], cluster, number);\n currentIndex++;\n }\n });\n for (currentIndex; currentIndex < sprites.length; currentIndex++) {\n sprites[currentIndex].group.visible = false;\n }\n }\n\n //Get clusters based on the ndc coordinate for each cluster.\n const getCluster = (markersObj, clusters) => {\n let first = true;\n let newCluster = {members: [], coords: [0,0,0], min: [0, 0, 0], max: [1, 1, 1]};\n let dist = 0\n for (let prop in markersObj) {\n if (first) {\n _v21.set(markersObj[prop].ndc.x, markersObj[prop].ndc.y);\n this._b1.setFromPoints([markersObj[prop].morph.position]);\n first = false;\n newCluster.members.push(markersObj[prop]);\n newCluster.coords = [\n markersObj[prop].morph.position.x,\n markersObj[prop].morph.position.y,\n markersObj[prop].morph.position.z,\n ]\n clusters.push(newCluster);\n delete markersObj[prop];\n } else {\n _v22.set(markersObj[prop].ndc.x, markersObj[prop].ndc.y);\n dist = _v21.distanceTo(_v22);\n if (_radius > dist) {\n newCluster.members.push(markersObj[prop]);\n this._b1.expandByPoint(markersObj[prop].morph.position);\n delete markersObj[prop];\n }\n }\n }\n newCluster.min = [this._b1.min.x, this._b1.min.y, this._b1.min.z];\n newCluster.max = [this._b1.max.x, this._b1.max.y, this._b1.max.z];\n //this._b1.getCenter(this._v2);\n //newCluster.coords = [this._v2.x, this._v2.y, this._v2.z];\n //The following will not be called if there is object left and\n //thus finishing clustering\n if (first !== true) {\n getCluster(markersObj, clusters);\n }\n }\n\n this.calculate = () => {\n if (enabled) {\n const current = Date.now();\n if ((current - start) > 500) {\n let clusters = [];\n getCluster({...this.markers}, clusters);\n drawClusters(clusters);\n start = Date.now();\n this.markerUpdateRequired = false;\n }\n }\n }\n\n this.isEnabled = () => {\n return enabled;\n }\n\n /**\n * Enable and visualise the marker.\n */\n this.enable = () => {\n enabled = true;\n this.morph.visible = true;\n }\n\n /**\n * Disable and hide the marker.\n */\n this.disable = () => {\n enabled = false;\n this.morph.visible = false;\n //turn all markers back on\n for (let prop in this.markers) {\n if (this.markers[prop]?.isMarker &&\n this.markers[prop].isEnabled()) {\n this.markers[prop].setVisibility(true);\n }\n }\n }\n\n this.zoomToCluster = (index) => {\n if (index !== undefined && index > -1) {\n this._v1.set(...sprites[index].min);\n this._v2.set(...sprites[index].max);\n if (Math.abs(this._v1.distanceTo(this._v2) > 0.0)) {\n this._b1.set(this._v1, this._v2);\n scene.translateBoundingBoxToCameraView(this._b1, 3, 300);\n this.markerUpdateRequired = true;\n return true;\n }\n }\n return false;\n }\n\n this.clusterIsVisible = (index) => {\n if (index !== undefined && index > -1) {\n if (sprites[index]) {\n return sprites[index].group?.visible;\n }\n }\n return false;\n }\n}\n\nMarkerCluster.prototype = Object.create(ZincObject.prototype);\nexport { MarkerCluster };\n","import * as THREE from 'three';\n\n/**\n * This provide a full scale minimap. It will always\n * display the whole map.\n *\n * @class\n * @author Alan Wu\n * @return {Minimap}\n */\nconst Minimap = function (sceneIn) {\n let targetScene = sceneIn;\n this.camera = new THREE.OrthographicCamera(\n -0.5, 0.5, 0.5, -0.5, 0.01, 10);\n this.helper = undefined;\n let geometry = new THREE.BufferGeometry();\n var vertices = new Float32Array( [\n -1.0, -1.0, 1.0,\n 1.0, -1.0, 1.0,\n 1.0, 1.0, 1.0,\n 1.0, 1.0, 1.0,\n -1.0, 1.0, 1.0,\n -1.0, -1.0, 1.0\n ] );\n let positionAttributes = new THREE.BufferAttribute( vertices, 3 );\n geometry.setAttribute( 'position', positionAttributes);\n var material = new THREE.MeshBasicMaterial( { color: 0x333333,\n depthTest: false,\n depthWrite: false,\n opacity: 0.5,\n transparent: true } );\n this.mask = new THREE.Mesh( geometry, material );\n let _box = new THREE.Box3();\n let _center = new THREE.Vector3();\n\n this.getDiffFromNormalised = (x, y) => {\n _box.setFromBufferAttribute(positionAttributes).getCenter(_center);\n let coord = _center.clone().project(this.camera);\n let new_coord = new THREE.Vector3(x, y, coord.z).unproject(this.camera);\n return new_coord.sub(_center);\n }\n\n let setCurrentCameraSettings = (diameter, newViewport) => {\n if (targetScene.camera.near)\n this.camera.near = targetScene.camera.near;\n if (newViewport.farPlane)\n this.camera.far = newViewport.farPlane;\n if (newViewport.eyePosition)\n this.camera.position.set(newViewport.eyePosition[0],\n newViewport.eyePosition[1], newViewport.eyePosition[2]);\n if (newViewport.upVector)\n this.camera.up.set(newViewport.upVector[0], newViewport.upVector[1],\n newViewport.upVector[2]);\n if (newViewport.targetPosition)\n this.camera.lookAt(new THREE.Vector3(newViewport.targetPosition[0],\n newViewport.targetPosition[1], newViewport.targetPosition[2]));\n this.camera.zoom = 1 / diameter;\n this.camera.updateProjectionMatrix();\n }\n\n this.getBoundary = () => {\n let target = new THREE.Vector3().copy(\n targetScene.camera.target).project(targetScene.camera);\n let v1 = new THREE.Vector3(-1, -1, target.z).unproject(targetScene.camera);\n let v2 = new THREE.Vector3(1, -1, target.z).unproject(targetScene.camera);\n let v3 = new THREE.Vector3(1, 1, target.z).unproject(targetScene.camera);\n let v4 = new THREE.Vector3(-1, 1, target.z).unproject(targetScene.camera);\n let array = [v1, v2, v3, v3, v4, v1];\n positionAttributes.copyVector3sArray(array);\n positionAttributes.needsUpdate = true;\n }\n\n this.updateCamera = () => {\n this.getBoundary();\n let cameraControl = targetScene.getZincCameraControls();\n let boundingBox = targetScene.getBoundingBox();\n if (boundingBox) {\n // enlarge radius to keep image within edge of window\n const diameter = boundingBox.min.distanceTo(boundingBox.max);\n const radius = diameter / 2.0;\n const centreX = (boundingBox.min.x + boundingBox.max.x) / 2.0;\n const centreY = (boundingBox.min.y + boundingBox.max.y) / 2.0;\n const centreZ = (boundingBox.min.z + boundingBox.max.z) / 2.0;\n const clip_factor = 4.0;\n const viewport = cameraControl.getViewportFromCentreAndRadius(\n centreX, centreY, centreZ, radius, 40, radius * clip_factor);\n setCurrentCameraSettings(diameter, viewport);\n }\n }\n}\n\nexport { Minimap };","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from 'three';\n\nconst _box = new Box3();\nconst _vector = new Vector3();\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineSegmentsGeometry';\n\n\t\tconst 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\t\tconst uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\t\tconst index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\t\tthis.setIndex( index );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst 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( array ) {\n\n\t\tlet 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\tconst 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( array ) {\n\n\t\tlet 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\tconst 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( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromEdgesGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromMesh( 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( lineSegments ) {\n\n\t\tconst geometry = lineSegments.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.LineSegmentsGeometry no longer supports Geometry. Use THREE.BufferGeometry instead.' );\n\t\t\treturn;\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() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t_box.setFromBufferAttribute( end );\n\n\t\t\tthis.boundingBox.union( _box );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( start, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t_vector.fromBufferAttribute( end, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\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.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\t// todo\n\n\t}\n\n\tapplyMatrix( 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\nLineSegmentsGeometry.prototype.isLineSegmentsGeometry = true;\n\nexport { LineSegmentsGeometry };\n","import {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2\n} from 'three';\n\n/**\n * parameters = {\n * color: <hex>,\n * linewidth: <float>,\n * dashed: <boolean>,\n * dashScale: <float>,\n * dashSize: <float>,\n * dashOffset: <float>,\n * gapSize: <float>,\n * resolution: <Vector2>, // 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: /* glsl */`\n\t\t#include <common>\n\t\t#include <color_pars_vertex>\n\t\t#include <fog_pars_vertex>\n\t\t#include <logdepthbuf_pars_vertex>\n\t\t#include <clipping_planes_pars_vertex>\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 <logdepthbuf_vertex>\n\t\t\t#include <clipping_planes_vertex>\n\t\t\t#include <fog_vertex>\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\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 <common>\n\t\t#include <color_pars_fragment>\n\t\t#include <fog_pars_fragment>\n\t\t#include <logdepthbuf_pars_fragment>\n\t\t#include <clipping_planes_pars_fragment>\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\t#include <clipping_planes_fragment>\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\tfloat alpha = opacity;\n\n\t\t\t#ifdef ALPHA_TO_COVERAGE\n\n\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\tfloat a = vUv.x;\n\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\tfloat len2 = a * a + b * b;\n\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t}\n\n\t\t\t#else\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\t#endif\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\n\t\t\t#include <logdepthbuf_fragment>\n\t\t\t#include <color_fragment>\n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <encodings_fragment>\n\t\t\t#include <fog_fragment>\n\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t}`\n\n};\n\nclass LineMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttype: 'LineMaterial',\n\n\t\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\t\tclipping: true // required for clipping support\n\n\t\t} );\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tcolor: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.diffuse.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tlinewidth: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.linewidth.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.linewidth.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashed: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'USE_DASH' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'USE_DASH' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.USE_DASH = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_DASH;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashScale: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashScale.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashScale.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashOffset: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashOffset.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashOffset.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgapSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.gapSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.gapSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\topacity: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tresolution: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.resolution.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.resolution.value.copy( value );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\talphaToCoverage: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'ALPHA_TO_COVERAGE' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'ALPHA_TO_COVERAGE' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.ALPHA_TO_COVERAGE = '';\n\t\t\t\t\t\tthis.extensions.derivatives = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.ALPHA_TO_COVERAGE;\n\t\t\t\t\t\tthis.extensions.derivatives = 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.setValues( parameters );\n\n\t}\n\n}\n\nLineMaterial.prototype.isLineMaterial = true;\n\nexport { LineMaterial };\n","import {\n\tBox3,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tSphere,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\nimport { LineMaterial } from './LineMaterial.js';\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nconst _start4 = new Vector4();\nconst _end4 = new Vector4();\n\nconst _ssOrigin = new Vector4();\nconst _ssOrigin3 = new Vector3();\nconst _mvMatrix = new Matrix4();\nconst _line = new Line3();\nconst _closestPoint = new Vector3();\n\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _clipToWorldVector = new Vector4();\n\nclass LineSegments2 extends Mesh {\n\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments2';\n\n\t}\n\n\t// for backwards-compatability, but could be a method of LineSegmentsGeometry...\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2.' );\n\n\t\t}\n\n\t\tconst threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\tconst ray = raycaster.ray;\n\t\tconst camera = raycaster.camera;\n\t\tconst projectionMatrix = camera.projectionMatrix;\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst resolution = material.resolution;\n\t\tconst lineWidth = material.linewidth + threshold;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\n\t\t// camera forward is negative\n\t\tconst near = - camera.near;\n\n\t\t// clip space is [ - 1, 1 ] so multiply by two to get the full\n\t\t// width in clip space\n\t\tconst ssMaxWidth = 2.0 * Math.max( lineWidth / resolution.width, lineWidth / resolution.height );\n\n\t\t//\n\n\t\t// check if we intersect the sphere bounds\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( matrixWorld );\n\t\tconst distanceToSphere = Math.max( camera.near, _sphere.distanceToPoint( ray.origin ) );\n\n\t\t// get the w component to scale the world space line width\n\t\t_clipToWorldVector.set( 0, 0, - distanceToSphere, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tconst sphereMargin = Math.abs( ssMaxWidth / _clipToWorldVector.w ) * 0.5;\n\t\t_sphere.radius += sphereMargin;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\t// check if we intersect the box bounds\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\t_box.copy( geometry.boundingBox ).applyMatrix4( matrixWorld );\n\t\tconst distanceToBox = Math.max( camera.near, _box.distanceToPoint( ray.origin ) );\n\n\t\t// get the w component to scale the world space line width\n\t\t_clipToWorldVector.set( 0, 0, - distanceToBox, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tconst boxMargin = Math.abs( ssMaxWidth / _clipToWorldVector.w ) * 0.5;\n\t\t_box.max.x += boxMargin;\n\t\t_box.max.y += boxMargin;\n\t\t_box.max.z += boxMargin;\n\t\t_box.min.x -= boxMargin;\n\t\t_box.min.y -= boxMargin;\n\t\t_box.min.z -= boxMargin;\n\n\t\tif ( raycaster.ray.intersectsBox( _box ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t\t// applying the projection matrix.\n\t\tray.at( 1, _ssOrigin );\n\n\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t_ssOrigin.w = 1;\n\t\t_ssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t\t_ssOrigin.applyMatrix4( projectionMatrix );\n\t\t_ssOrigin.multiplyScalar( 1 / _ssOrigin.w );\n\n\t\t// screen space\n\t\t_ssOrigin.x *= resolution.x / 2;\n\t\t_ssOrigin.y *= resolution.y / 2;\n\t\t_ssOrigin.z = 0;\n\n\t\t_ssOrigin3.copy( _ssOrigin );\n\n\t\t_mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\t\tfor ( let i = 0, l = instanceStart.count; i < l; i ++ ) {\n\n\t\t\t_start4.fromBufferAttribute( instanceStart, i );\n\t\t\t_end4.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t_start4.w = 1;\n\t\t\t_end4.w = 1;\n\n\t\t\t// camera space\n\t\t\t_start4.applyMatrix4( _mvMatrix );\n\t\t\t_end4.applyMatrix4( _mvMatrix );\n\n\t\t\t// skip the segment if it's entirely behind the camera\n\t\t\tvar isBehindCameraNear = _start4.z > near && _end4.z > near;\n\t\t\tif ( isBehindCameraNear ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// trim the segment if it extends behind camera near\n\t\t\tif ( _start4.z > near ) {\n\n\t\t\t\tconst deltaDist = _start4.z - _end4.z;\n\t\t\t\tconst t = ( _start4.z - near ) / deltaDist;\n\t\t\t\t_start4.lerp( _end4, t );\n\n\t\t\t} else if ( _end4.z > near ) {\n\n\t\t\t\tconst deltaDist = _end4.z - _start4.z;\n\t\t\t\tconst t = ( _end4.z - near ) / deltaDist;\n\t\t\t\t_end4.lerp( _start4, t );\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\t_start4.applyMatrix4( projectionMatrix );\n\t\t\t_end4.applyMatrix4( projectionMatrix );\n\n\t\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t\t_start4.multiplyScalar( 1 / _start4.w );\n\t\t\t_end4.multiplyScalar( 1 / _end4.w );\n\n\t\t\t// screen space\n\t\t\t_start4.x *= resolution.x / 2;\n\t\t\t_start4.y *= resolution.y / 2;\n\n\t\t\t_end4.x *= resolution.x / 2;\n\t\t\t_end4.y *= resolution.y / 2;\n\n\t\t\t// create 2d segment\n\t\t\t_line.start.copy( _start4 );\n\t\t\t_line.start.z = 0;\n\n\t\t\t_line.end.copy( _end4 );\n\t\t\t_line.end.z = 0;\n\n\t\t\t// get closest point on ray to segment\n\t\t\tconst param = _line.closestPointToPointParameter( _ssOrigin3, true );\n\t\t\t_line.at( param, _closestPoint );\n\n\t\t\t// check if the intersection point is within clip space\n\t\t\tconst zPos = MathUtils.lerp( _start4.z, _end4.z, param );\n\t\t\tconst isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\t\tconst isInside = _ssOrigin3.distanceTo( _closestPoint ) < lineWidth * 0.5;\n\n\t\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\t_line.start.applyMatrix4( matrixWorld );\n\t\t\t\t_line.end.applyMatrix4( matrixWorld );\n\n\t\t\t\tconst pointOnLine = new Vector3();\n\t\t\t\tconst point = new Vector3();\n\n\t\t\t\tray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tpoint: point,\n\t\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\t\tdistance: ray.origin.distanceTo( point ),\n\n\t\t\t\t\tobject: this,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: i,\n\t\t\t\t\tuv: null,\n\t\t\t\t\tuv2: null,\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nLineSegments2.prototype.LineSegments2 = true;\n\nexport { LineSegments2 };\n","import * as THREE from 'three';\nimport { Lines } from './lines';\nimport { LineSegments2 } from '../three/line/LineSegments2';\nimport { LineMaterial } from '../three/line/LineMaterial';\nimport { LineSegmentsGeometry } from '../three/line/LineSegmentsGeometry';\n/**\n * Provides an object which stores lines.\n * This is created when a valid json file containing lines is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Lines}\n */\nconst Lines2 = function () {\n Lines.call(this);\n\tthis.isLines2 = true;\n let positions = new Array(300);\n\n /**\n * Create the line segements using geometry and material.\n *\n * @param {Array} arrayIn - Geometry of lines to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n\tthis.createLineSegment = (arrayIn, materialIn, options) => {\n\t\tif (arrayIn && materialIn) {\n const linesGeometry = new LineSegmentsGeometry();\n linesGeometry.setPositions(arrayIn);\n linesGeometry.colorsNeedUpdate = true;\n const line = new LineSegments2(linesGeometry, materialIn);\n line.scale.set(1, 1, 1);\n line.computeLineDistances();\n this.setMesh(line, options.localTimeEnabled, options.localMorphColour);\n\t\t}\n\t}\n\n /**\n * Set the width for the lines.\n *\n * @param {Number} width - Width of the lines.\n */\n\tthis.setWidth = width => {\n\t\tif (this.morph && this.morph.material) {\n\t\t\tthis.morph.material.linewidth = width;\n\t\t\tthis.morph.material.needsUpdate = true;\n\t\t}\n\t}\n\n /**\n * Add new vertices into the array\n */\n this.addVertices = function(coords) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n if (!mesh) {\n this.drawRange = 0;\n }\n let index = this.drawRange * 3;\n coords.forEach(coord => {\n positions[index++] = coord[0];\n positions[index++] = coord[1];\n positions[index++] = coord[2];\n this.drawRange++;\n });\n //fill the rest of the array.\n if (!mesh) {\n while (index < 300) {\n positions[index++] = coords[0][0];\n positions[index++] = coords[0][1];\n positions[index++] = coords[0][2];\n }\n }\n\n if (mesh) {\n mesh.geometry.setPositions(positions);\n mesh.computeLineDistances();\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n return positions;\n }\n\n /**\n * Get the vertices by face index\n */\n this.getVerticesByFaceIndex = function(faceIndex) {\n let vIndex = faceIndex * 2 * 3;\n const mesh = this.getMorph();\n if (mesh && (this.drawRange * 3) > vIndex) {\n const position = mesh.geometry.getAttribute( 'instanceStart' );\n return [\n [\n position.data.array[vIndex],\n position.data.array[++vIndex],\n position.data.array[++vIndex],\n ],\n [\n position.data.array[++vIndex],\n position.data.array[++vIndex],\n position.data.array[++vIndex],\n ],\n ];\n }\n return [];\n }\n\n /**\n * Edit Vertice in index.\n */\n this.editVertices = function(coords, i) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n const maxIndex = i + coords.length - 1;\n if (!mesh || 0 > i || maxIndex >= this.drawRange) {\n return;\n } else {\n\n let index = i * 3;\n coords.forEach(coord => {\n positions[index++] = coord[0];\n positions[index++] = coord[1];\n positions[index++] = coord[2];\n });\n index = this.drawRange * 3;\n while (index < 300) {\n positions[index++] = coords[0][0];\n positions[index++] = coords[0][1];\n positions[index++] = coords[0][2];\n }\n mesh.geometry.setPositions(positions);\n mesh.computeLineDistances();\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n return positions;\n }\n\n /**\n * Add new lines to existing lines if it exists, otherwise\n * create a new one and add to it.\n * @param {Array} coords -An array of three components coordinates.\n\n * @param {Number} colour - A hex value of the colour for the points\n */\n\tthis.addLines = (coords, colour) => {\n if (coords && coords.length > 0) {\n this.addVertices(coords);\n let mesh = this.getMorph();\n if (!mesh) {\n const material = new LineMaterial( {\n color: colour,\n linewidth:1,\n vertexColors: false,\n worldUnits: false,\n });\n material.resolution.set( window.innerWidth, window.innerHeight );\n const options = { localTimeEnabled: false, localMorphColour: false};\n this.createLineSegment(positions, material, options);\n }\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n\t}\n\n this.render = (delta, playAnimation, cameraControls, options) => {\n const material = this.getMorph().material;\n material.resolution.set( window.innerWidth, window.innerHeight );\n }\n}\n\nLines2.prototype = Object.create(Lines.prototype);\nLines2.prototype.constructor = Lines2;\nexport { Lines2 };\n","import * as THREE from 'three';\nimport { Pointset } from './primitives/pointset';\nimport { Lines2 } from './primitives/lines2';\nimport { Geometry } from './primitives/geometry';\n\nlet uniqueiId = 0;\n\nconst getUniqueId = function () {\n return \"re\" + uniqueiId++;\n}\n\n/**\n * Provides a hierachical structure to objects, Each region\n * may contain multiple child regions and {@link ZincObject}.\n *\n * @class\n * @author Alan Wu\n * @return {Region}\n */\nlet Region = function (parentIn, sceneIn) {\n let parent = parentIn;\n let group = new THREE.Group();\n group.matrixAutoUpdate = false;\n group.userData = this;\n let children = [];\n let name = \"\";\n let zincObjects = [];\n let scene = sceneIn;\n const tMatrix = new THREE.Matrix4();\n let duration = 3000;\n tMatrix.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n this.pickableUpdateRequired = true;\n this.isRegion = true;\n this.uuid = getUniqueId();\n\n\n /**\n * Hide all primitives belong to this region.\n */\n this.hideAllPrimitives = () => {\n children.forEach(child => child.hideAllPrimitives());\n zincObjects.forEach(zincObject => zincObject.setVisibility(false));\n }\n\n /**\n * Show all primitives belong to this region.\n */\n this.showAllPrimitives = () => {\n children.forEach(child => child.showAllPrimitives());\n zincObjects.forEach(zincObject => zincObject.setVisibility(true));\n }\n\n /**\n * Set the visibility and propagate it down the hierarchies\n * depending on the flag.\n *\n * @param {Boolean} flag - A flag indicating either the visibilty to be on/off.\n */\n this.setVisibility = (flag) => {\n if (flag != group.visible) {\n group.visible = flag;\n this.pickableUpdateRequired = true;\n }\n }\n\n /**\n * Get the visibility of the region and its children.\n *\n * @return {Boolean}\n */\n this.getVisibility = () => {\n return group.visible;\n }\n\n /**\n * Get the {THREE.Group} containing all child regions and their\n * primitives.\n *\n * @return {THREE.Group}\n */\n this.getGroup = () => {\n return group;\n }\n\n /**\n * Set the transformation with a {THREE.Matrix4} matrix, this will affect\n * all primitives in this and its child regions\n *\n * @param {THREE.Matrix4} transformation - The transformation matrix\n * used for the transformation.\n */\n this.setTransformation = transformation => {\n tMatrix.set(...transformation);\n group.matrix.copy(tMatrix);\n group.updateMatrixWorld();\n }\n\n /**\n * Set the name of this region.\n *\n * @param {String} nameIn - Name to be set for this region. It must be defined\n * and non-empty.\n */\n this.setName = (nameIn) => {\n if (nameIn && nameIn !== \"\") {\n name = nameIn;\n }\n }\n\n /**\n * Get the name of this region.\n *\n * @return {String}\n */\n this.getName = () => {\n return name;\n }\n\n /**\n * Get the parent region.\n *\n * @return {Region}\n */\n this.getParent = () => {\n return parent;\n }\n\n /**\n * Get the array of each hierarachy from the root region to this region.\n *\n * @return {Array}\n */\n this.getFullSeparatedPath = () => {\n const paths = [];\n if (name !== \"\") {\n paths.push(name);\n for (let p = parent; p !== undefined;) {\n const parentName = p.getName();\n if (parentName !== \"\") {\n paths.unshift(parentName);\n }\n p = p.getParent();\n }\n }\n return paths;\n }\n\n /**\n * Get the full paths from the root region to this region.\n *\n * @return {String}\n */\n this.getFullPath = () => {\n const paths = this.getFullSeparatedPath();\n if (paths.length > 0) {\n let fullPath = paths.shift();\n paths.forEach(path => {\n fullPath = fullPath.concat(\"/\", path);\n });\n return fullPath;\n }\n return \"\";\n }\n\n /**\n * Create a new child region with the provided name.\n * @param {String} nameIn - Name to be set for the new child region.\n *\n * @return {Region}\n */\n this.createChild = (nameIn) => {\n let childRegion = new Region(this, scene);\n childRegion.setName(nameIn);\n children.push(childRegion);\n group.add(childRegion.getGroup());\n return childRegion;\n }\n\n /**\n * Get the child region with matching childName.\n * @param {String} childName - Name to be matched.\n *\n * @return {Region}\n */\n this.getChildWithName = childName => {\n if (childName) {\n const lowerChildName = childName.toLowerCase();\n for (let i = 0; i < children.length; i++) {\n if (children[i].getName().toLowerCase() === lowerChildName)\n return children[i];\n }\n }\n return undefined;\n }\n\n /**\n * Find a child region using the path array.\n * @param {Array} pathArray - Array containing regions' name at each\n * hierarchy to match.\n *\n * @return {Region}\n */\n this.findChildFromSeparatedPath = pathArray => {\n if (pathArray && pathArray.length > 0) {\n if (pathArray[0] === \"\") {\n pathArray.shift();\n }\n }\n if (pathArray && pathArray.length > 0) {\n const childRegion = this.getChildWithName(pathArray[0]);\n if (childRegion) {\n pathArray.shift();\n return childRegion.findChildFromSeparatedPath(pathArray);\n } else {\n return undefined;\n }\n }\n return this;\n }\n\n /**\n * Find the region using the provided relative path.\n *\n * @param {String} path - Relative paths from this region\n * to the child region.\n *\n * @return {Region}\n */\n this.findChildFromPath = (path) => {\n const pathArray = path.split(\"/\");\n return this.findChildFromSeparatedPath(pathArray);\n }\n\n /**\n * Create a new child using the path array. All required new regions\n * down the path will be created.\n *\n * @param {Array} pathArray - Array containing regions' name, new regions\n * will be created along the path if not found.\n *\n * @return {Region}\n */\n this.createChildFromSeparatedPath = pathArray => {\n if (pathArray.length > 0) {\n if (pathArray[0] === \"\") {\n pathArray.shift();\n }\n }\n if (pathArray.length > 0) {\n let childRegion = this.getChildWithName(pathArray[0]);\n if (!childRegion) {\n childRegion = this.createChild(pathArray[0]);\n }\n pathArray.shift();\n return childRegion.createChildFromSeparatedPath(pathArray);\n }\n return this;\n }\n\n /**\n * Create a new child using the path. All required new regions\n * down the path will be created.\n *\n * @param {String} path - Relative paths from the region\n * to the child region.\n *\n * @return {Region}\n */\n this.createChildFromPath = (path) => {\n const pathArray = path.split(\"/\");\n return this.createChildFromSeparatedPath(pathArray);\n }\n\n\n /**\n * Return existing region if it exists, otherwise, create a new\n * region with the provided path.\n *\n * @param {String} path - Relative paths from the region\n * to the child region.\n *\n * @return {Region}\n */\n this.findOrCreateChildFromPath = (path) => {\n let childRegion = this.findChildFromPath(path);\n if (!childRegion) {\n childRegion = this.createChildFromPath(path);\n }\n return childRegion;\n }\n\n /**\n * Add a zinc object into this region, the morph will be added\n * to the group.\n *\n * @param {ZincObject} zincObject - Zinc object to be added into\n * this region.\n */\n this.addZincObject = zincObject => {\n if (zincObject) {\n zincObject.setRegion(this);\n group.add(zincObject.getGroup());\n zincObjects.push(zincObject);\n this.pickableUpdateRequired = true;\n if (scene) {\n scene.triggerObjectAddedCallback(zincObject);\n }\n }\n }\n\n\n /**\n * Remove a ZincObject from this region if it presents. This will eventually\n * destroy the object and free up the memory.\n *\n * @param {ZincObject} zincObject - object to be removed from this region.\n */\n this.removeZincObject = zincObject => {\n for (let i = 0; i < zincObjects.length; i++) {\n if (zincObject === zincObjects[i]) {\n group.remove(zincObject.getGroup());\n zincObjects.splice(i, 1);\n if (scene) {\n scene.triggerObjectRemovedCallback(zincObject);\n }\n zincObject.dispose();\n this.pickableUpdateRequired = true;\n return;\n }\n }\n }\n\n /**\n * Return true if pickable objects require an update.\n *\n * @param {Boolean} transverse - Check child regions as well\n * if this is set to true.\n *\n * @return {Boolean}\n */\n this.checkPickableUpdateRequred = (transverse) => {\n if (this.pickableUpdateRequired) return true;\n if (transverse) {\n let flag = false;\n for (let i = 0; i < children.length; i++) {\n flag = children[i].checkPickableUpdateRequred(transverse);\n if (flag) return true;\n }\n }\n return false;\n }\n\n /**\n * Get all pickable objects.\n */\n this.getPickableThreeJSObjects = (objectsList, transverse) => {\n if (group.visible) {\n zincObjects.forEach(zincObject => {\n if (zincObject.isPickable && zincObject.getGroup() && zincObject.getGroup().visible) {\n let marker = zincObject.marker;\n if (marker && marker.isEnabled()) {\n objectsList.push(marker.getMorph());\n }\n objectsList.push(zincObject.getGroup());\n }\n });\n if (transverse) {\n children.forEach(childRegion => {\n childRegion.getPickableThreeJSObjects(objectsList, transverse);\n });\n }\n this.pickableUpdateRequired = false;\n }\n return objectsList;\n }\n\n /**\n * Set the default duration value for all zinc objects\n * that are to be loaded into this region.\n *\n * @param {Number} durationIn - duration of the scene.\n */\n this.setDuration = durationIn => {\n duration = durationIn;\n zincObjects.forEach(zincObject => zincObject.setDuration(durationIn));\n children.forEach(childRegion => childRegion.setDuration(durationIn));\n }\n\n /**\n * Get the default duration value.\n * returns {Number}\n */\n this.getDuration = () => {\n return duration;\n }\n\n /**\n * Get the bounding box of all the object in this and child regions only.\n * Do not include the matrix transformation here, it is done at the primitives\n * level.\n *\n * @returns {THREE.Box3}\n */\n this.getBoundingBox = transverse => {\n let boundingBox1 = undefined, boundingBox2 = undefined;\n zincObjects.forEach(zincObject => {\n boundingBox2 = zincObject.getBoundingBox();\n if (boundingBox2) {\n if (boundingBox1 == undefined) {\n boundingBox1 = boundingBox2.clone();\n } else {\n boundingBox1.union(boundingBox2);\n }\n }\n });\n if (transverse) {\n children.forEach(childRegion => {\n boundingBox2 = childRegion.getBoundingBox(transverse);\n if (boundingBox2) {\n if (boundingBox1 == undefined) {\n boundingBox1 = boundingBox2.clone();\n } else {\n boundingBox1.union(boundingBox2);\n }\n }\n });\n }\n return boundingBox1;\n }\n\n /**\n * Clear and dispose all objects belong to this region.\n *\n * @param {Boolean} transverse - Clear and dispose child regions as well\n * if this is set to true.\n */\n this.clear = transverse => {\n if (transverse) {\n children.forEach(childRegion => childRegion.clear(transverse));\n }\n zincObjects.forEach(zincObject => {\n group.remove(zincObject.getGroup());\n zincObject.dispose();\n });\n children = [];\n zincObjects = [];\n }\n\n /**\n * Check if a zincObject is a member of this region.\n *\n * @param {ZincObject} zincObject - The ZincObject to be checked.\n * @param {Boolean} transverse - Also check the child regions.\n *\n * @return {Boolean}\n */\n this.objectIsInRegion = (zincObject, transverse) => {\n for (let i = 0; i < zincObjects.length; i++) {\n if (zincObject === zincObjects[i]) {\n return true;\n }\n }\n if (transverse) {\n for (let i = 0; i < children.length; i++) {\n if (children[i].objectIsInRegion(zincObject, transverse))\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * A function which iterates through the list of geometries and call the callback\n * function with the geometries as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the geometry\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachGeometry = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isGeometry)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachGeometry(\n callbackFunction, transverse));\n }\n\n /**\n * A function which iterates through the list of glyphsets and call the callback\n * function with the glyphset as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the glyphset\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachGlyphset = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isGlyphset)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachGlyphset(\n callbackFunction, transverse));\n }\n\n /**\n * A function which iterates through the list of pointsets and call the callback\n * function with the pointset as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the pointset\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachPointset = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isPointset)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachPointset(\n callbackFunction, transverse));\n }\n\n /**\n * A function which iterates through the list of lines and call the callback\n * function with the lines as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the lines\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachLine = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isLines)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachLine(\n callbackFunction, transverse));\n }\n\n this.findObjectsWithAnatomicalId = (anatomicalId, transverse) => {\n const objectsArray = [];\n zincObjects.forEach(zincObject => {\n if (zincObject.anatomicalId === anatomicalId)\n objectsArray.push(zincObject);\n });\n if (transverse) {\n children.forEach(childRegion => {\n let childObjects = childRegion.findObjectsWithAnatomicalId(anatomicalId, transverse);\n objectsArray.push(...childObjects);\n });\n }\n\n return objectsArray;\n }\n\n /**\n * Find and return all zinc objects in this and child regions with\n * the matching GroupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findObjectsWithGroupName = (groupName, transverse) => {\n const objectsArray = [];\n zincObjects.forEach(zincObject => {\n const lowerObjectName = zincObject.groupName ? zincObject.groupName.toLowerCase() : zincObject.groupName;\n const lowerGroupName = groupName ? groupName.toLowerCase() : groupName;\n if (lowerObjectName === lowerGroupName)\n objectsArray.push(zincObject);\n });\n if (transverse) {\n children.forEach(childRegion => {\n let childObjects = childRegion.findObjectsWithGroupName(groupName, transverse);\n objectsArray.push(...childObjects);\n });\n }\n return objectsArray;\n }\n\n /**\n * Find and return all geometries in this and child regions with\n * the matching GroupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findGeometriesWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const geometriesArray = primitivesArray.filter(primitive => primitive.isGeometry);\n return geometriesArray;\n }\n\n /**\n * Find and return all pointsets in this and child regions with\n * the matching groupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findPointsetsWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const pointsetsArray = primitivesArray.filter(primitive => primitive.isPointset);\n return pointsetsArray;\n }\n\n /**\n * Find and return all glyphsets in this and child regions with\n * the matching groupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findGlyphsetsWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const glyphsetsArray = primitivesArray.filter(primitive => primitive.isGlyphset);\n return glyphsetsArray;\n }\n\n /**\n * Find and return all lines in this and child regions with\n * the matching groupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findLinesWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const linesArray = primitivesArray.filter(primitive => primitive.isLines);\n return linesArray;\n }\n\n /**\n * Get all zinc objects in this region.\n *\n * @param {Boolean} transverse - Include zinc objects in child regions if this is\n * set to true.\n * @returns {Array}\n */\n this.getAllObjects = transverse => {\n const objectsArray = [...zincObjects];\n if (transverse) {\n children.forEach(childRegion => {\n let childObjects = childRegion.getAllObjects(transverse);\n objectsArray.push(...childObjects);\n });\n }\n return objectsArray;\n }\n\n /**\n * Get all child regions.\n *\n * @param {Boolean} transverse - Include all regions which are descendants of\n * this reigon when this is set to true.\n * @returns {Array}\n */\n this.getChildRegions = transverse => {\n const objectsArray = [...children];\n if (transverse) {\n children.forEach(childRegion => {\n const childObjects = childRegion.getChildRegions(transverse);\n objectsArray.push(...childObjects);\n });\n }\n return objectsArray;\n }\n\n /**\n * Get the current time of the region.\n * Return -1 if no graphics in the region.\n *\n * @return {Number}\n */\n this.getCurrentTime = () => {\n if (zincObjects[0] != undefined) {\n return zincObjects[0].getCurrentTime();\n } else {\n for (let i = 0; i < children.length; i++) {\n const time = children[i].getCurrentTime();\n if (time !== -1)\n return time;\n }\n }\n return -1;\n }\n\n /**\n * Set the current time of all the objects of this region.\n *\n * @param {Number} time - Value to set the time to.\n * @param {Boolean} transverse - Set the time for chidl regions if\n * this is set to true.\n */\n this.setMorphTime = (time, transverse) => {\n zincObjects.forEach(zincObject => {\n zincObject.setMorphTime(time);\n });\n if (transverse) {\n children.forEach(childRegion => {\n childRegion.setMorphTime(time);\n });\n }\n }\n\n /**\n * Check if any object in this region is time varying.\n *\n * @return {Boolean}\n */\n this.isTimeVarying = () => {\n for (let i = 0; i < zincObjects.length; i++) {\n if (zincObjects[i].isTimeVarying()) {\n return true;\n }\n }\n for (let i = 0; i < children.length; i++) {\n if (children[i].isTimeVarying()) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n * @private\n */\n this.renderGeometries = (playRate, delta, playAnimation, cameraControls, options, transverse) => {\n // Let video dictates the progress if one is present\n const allObjects = this.getAllObjects(transverse);\n allObjects.forEach(zincObject => {\n zincObject.render(playRate * delta, playAnimation, cameraControls, options);\n });\n //process markers visibility and size, as long as there are more than\n //one entry in markersList is greater than 1, markers have been enabled.\n if (options && (playAnimation === false) &&\n options.markerCluster?.markerUpdateRequired) {\n /**\n const markerDepths = Object.values(options.markersList)\n .map((marker) => marker.ndc.z);\n if (markerDepths.length > 1) {\n const min = Math.min(...markerDepths);\n const max = Math.max(...markerDepths);\n allObjects.forEach(zincObject => {\n zincObject.processMarkerVisual(min, max);\n });\n }\n */\n options.markerCluster.calculate();\n }\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n */\n this.createPoints = ( groupName, coords, labels, colour ) => {\n let isNew = false;\n const zincObjects = this.findObjectsWithGroupName(groupName, false);\n const index = zincObjects.findIndex((zincObject) => zincObject.isPointset);\n const pointset = index > -1 ? zincObjects[index] : new Pointset();\n pointset.addPoints(coords, labels, colour);\n if (index === -1) {\n pointset.setName(groupName);\n this.addZincObject(pointset);\n isNew = true;\n } else {\n this.pickableUpdateRequired = true;\n }\n return { zincObject: pointset, isNew };\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n */\n this.createLines = ( groupName, coords, colour ) => {\n let isNew = false;\n const zincObjects = this.findObjectsWithGroupName(groupName, false);\n const index = zincObjects.findIndex((zincObject) => zincObject.isLines);\n const lines = index > -1 ? zincObjects[index] : new Lines2();\n lines.addLines(coords, colour);\n if (index === -1) {\n lines.setName(groupName);\n this.addZincObject(lines);\n isNew = true;\n } else {\n this.pickableUpdateRequired = true;\n }\n return { zincObject: lines, isNew };\n }\n\n /**\n * Add a new geometry\n */\n this.createGeometryFromThreeJSGeometry = (\n groupName, geometry, colour, opacity, visibility, renderOrder) => {\n const zincGeometry = new Geometry();\n const material = new THREE.MeshPhongMaterial({\n color : colour,\n morphTargets : false,\n morphNormals : false,\n transparent : true,\n opacity : opacity,\n side : THREE.DoubleSide\n });\n zincGeometry.createMesh(\n geometry,\n material,\n {localTimeEnabled: false, localMorphColour: false,},\n );\n if (zincGeometry.getMorph()) {\n zincGeometry.setVisibility(false);\n zincGeometry.setName(groupName);\n zincGeometry.setRenderOrder(renderOrder);\n this.addZincObject(zincGeometry);\n return zincGeometry;\n }\n return undefined;\n }\n}\n\nexport { Region };\n","import {\n\tBufferAttribute,\n\tClampToEdgeWrapping,\n\tDoubleSide,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tMathUtils,\n\tMatrix4,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tPropertyBinding,\n\tRGBAFormat,\n\tRGBFormat,\n\tRepeatWrapping,\n\tScene,\n\tVector3\n} from 'three';\n\n\nclass GLTFExporter {\n\n\tconstructor() {\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFLightExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsUnlitExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsPBRSpecularGlossiness( writer );\n\n\t\t} );\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param {Scene or [THREE.Scenes]} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Object} options options\n\t */\n\tparse( input, onDone, options ) {\n\n\t\tconst writer = new GLTFWriter();\n\t\tconst plugins = [];\n\n\t\tfor ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {\n\n\t\t\tplugins.push( this.pluginCallbacks[ i ]( writer ) );\n\n\t\t}\n\n\t\twriter.setPlugins( plugins );\n\t\twriter.write( input, onDone, options );\n\n\t}\n\n}\n\n//------------------------------------------------------------------------------\n// Constants\n//------------------------------------------------------------------------------\n\nconst WEBGL_CONSTANTS = {\n\tPOINTS: 0x0000,\n\tLINES: 0x0001,\n\tLINE_LOOP: 0x0002,\n\tLINE_STRIP: 0x0003,\n\tTRIANGLES: 0x0004,\n\tTRIANGLE_STRIP: 0x0005,\n\tTRIANGLE_FAN: 0x0006,\n\n\tUNSIGNED_BYTE: 0x1401,\n\tUNSIGNED_SHORT: 0x1403,\n\tFLOAT: 0x1406,\n\tUNSIGNED_INT: 0x1405,\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst THREE_TO_WEBGL = {};\n\nTHREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nTHREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR;\nTHREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nTHREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;\nTHREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;\nTHREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n//------------------------------------------------------------------------------\n// Utility functions\n//------------------------------------------------------------------------------\n\n/**\n * Compare two arrays\n * @param {Array} array1 Array 1 to compare\n * @param {Array} array2 Array 2 to compare\n * @return {Boolean} Returns true if both arrays are equal\n */\nfunction equalArray( array1, array2 ) {\n\n\treturn ( array1.length === array2.length ) && array1.every( function ( element, index ) {\n\n\t\treturn element === array2[ index ];\n\n\t} );\n\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n * @param {string} text\n * @return {ArrayBuffer}\n */\nfunction stringToArrayBuffer( text ) {\n\n\tif ( window.TextEncoder !== undefined ) {\n\n\t\treturn new TextEncoder().encode( text ).buffer;\n\n\t}\n\n\tconst array = new Uint8Array( new ArrayBuffer( text.length ) );\n\n\tfor ( let i = 0, il = text.length; i < il; i ++ ) {\n\n\t\tconst value = text.charCodeAt( i );\n\n\t\t// Replacing multi-byte character with space(0x20).\n\t\tarray[ i ] = value > 0xFF ? 0x20 : value;\n\n\t}\n\n\treturn array.buffer;\n\n}\n\n/**\n * Is identity matrix\n *\n * @param {Matrix4} matrix\n * @returns {Boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix( matrix ) {\n\n\treturn equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );\n\n}\n\n/**\n * Get the min and max vectors from the given attribute\n * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count\n * @param {Integer} start\n * @param {Integer} count\n * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)\n */\nfunction getMinMax( attribute, start, count ) {\n\n\tconst output = {\n\n\t\tmin: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),\n\t\tmax: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )\n\n\t};\n\n\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\tlet value;\n\n\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t} else {\n\n\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t}\n\n\t\t\toutput.min[ a ] = Math.min( output.min[ a ], value );\n\t\t\toutput.max[ a ] = Math.max( output.max[ a ], value );\n\n\t\t}\n\n\t}\n\n\treturn output;\n\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @param {Integer} bufferSize The size the original buffer.\n * @returns {Integer} new buffer size with required padding.\n *\n */\nfunction getPaddedBufferSize( bufferSize ) {\n\n\treturn Math.ceil( bufferSize / 4 ) * 4;\n\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n *\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {Integer} paddingByte (Optional)\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {\n\n\tconst paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );\n\n\tif ( paddedLength !== arrayBuffer.byteLength ) {\n\n\t\tconst array = new Uint8Array( paddedLength );\n\t\tarray.set( new Uint8Array( arrayBuffer ) );\n\n\t\tif ( paddingByte !== 0 ) {\n\n\t\t\tfor ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {\n\n\t\t\t\tarray[ i ] = paddingByte;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn array.buffer;\n\n\t}\n\n\treturn arrayBuffer;\n\n}\n\nlet cachedCanvas = null;\n\n/**\n * Writer\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\t\tthis.extensionsUsed = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'THREE.GLTFExporter'\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tattributesNormalized: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param {Scene or [THREE.Scenes]} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Object} options options\n\t */\n\twrite( input, onDone, options ) {\n\n\t\tthis.options = Object.assign( {}, {\n\t\t\t// default options\n\t\t\tbinary: false,\n\t\t\ttrs: false,\n\t\t\tonlyVisible: true,\n\t\t\ttruncateDrawRange: true,\n\t\t\tembedImages: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\tanimations: [],\n\t\t\tincludeCustomExtensions: false\n\t\t}, options );\n\n\t\tif ( this.options.animations.length > 0 ) {\n\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\n\t\t}\n\n\t\tthis.processInput( input );\n\n\t\tconst writer = this;\n\n\t\tPromise.all( this.pending ).then( function () {\n\n\t\t\tconst buffers = writer.buffers;\n\t\t\tconst json = writer.json;\n\t\t\tconst options = writer.options;\n\t\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\t\t// Merge buffers.\n\t\t\tconst blob = new Blob( buffers, { type: 'application/octet-stream' } );\n\n\t\t\t// Declare extensions.\n\t\t\tconst extensionsUsedList = Object.keys( extensionsUsed );\n\n\t\t\tif ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;\n\n\t\t\t// Update bytelength of the single buffer.\n\t\t\tif ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\t\tconst reader = new window.FileReader();\n\t\t\t\treader.readAsArrayBuffer( blob );\n\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\t// Binary chunk.\n\t\t\t\t\tconst binaryChunk = getPaddedArrayBuffer( reader.result );\n\t\t\t\t\tconst binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\t\tbinaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );\n\t\t\t\t\tbinaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );\n\n\t\t\t\t\t// JSON chunk.\n\t\t\t\t\tconst jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );\n\t\t\t\t\tconst jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\t\tjsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );\n\t\t\t\t\tjsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );\n\n\t\t\t\t\t// GLB header.\n\t\t\t\t\tconst header = new ArrayBuffer( GLB_HEADER_BYTES );\n\t\t\t\t\tconst headerView = new DataView( header );\n\t\t\t\t\theaderView.setUint32( 0, GLB_HEADER_MAGIC, true );\n\t\t\t\t\theaderView.setUint32( 4, GLB_VERSION, true );\n\t\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\t\theaderView.setUint32( 8, totalByteLength, true );\n\n\t\t\t\t\tconst glbBlob = new Blob( [\n\t\t\t\t\t\theader,\n\t\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\t\tjsonChunk,\n\t\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\t\tbinaryChunk\n\t\t\t\t\t], { type: 'application/octet-stream' } );\n\n\t\t\t\t\tconst glbReader = new window.FileReader();\n\t\t\t\t\tglbReader.readAsArrayBuffer( glbBlob );\n\t\t\t\t\tglbReader.onloadend = function () {\n\n\t\t\t\t\t\tonDone( glbReader.result );\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 ( json.buffers && json.buffers.length > 0 ) {\n\n\t\t\t\t\tconst reader = new window.FileReader();\n\t\t\t\t\treader.readAsDataURL( blob );\n\t\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\t\tjson.buffers[ 0 ].uri = base64data;\n\t\t\t\t\t\tonDone( json );\n\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tonDone( json );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t *\n\t * @param {THREE.Object3D|THREE.Material} object\n\t * @param {Object} objectDef\n\t */\n\tserializeUserData( object, objectDef ) {\n\n if (object.userData && object.userData.isZincObject) return;\n\n\t\tif ( Object.keys( object.userData ).length === 0 ) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\ttry {\n\n\t\t\tconst json = JSON.parse( JSON.stringify( object.userData ) );\n\n\t\t\tif ( options.includeCustomExtensions && json.gltfExtensions ) {\n\n\t\t\t\tif ( objectDef.extensions === undefined ) objectDef.extensions = {};\n\n\t\t\t\tfor ( const extensionName in json.gltfExtensions ) {\n\n\t\t\t\t\tobjectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];\n\t\t\t\t\textensionsUsed[ extensionName ] = true;\n\n\t\t\t\t}\n\n\t\t\t\tdelete json.gltfExtensions;\n\n\t\t\t}\n\n\t\t\tif ( Object.keys( json ).length > 0 ) objectDef.extras = json;\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: userData of \\'' + object.name + '\\' ' +\n\t\t\t\t'won\\'t be serialized because of JSON.stringify error - ' + error.message );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Assign and return a temporal unique id for an object\n\t * especially which doesn't have .uuid\n\t * @param {Object} object\n\t * @return {Integer}\n\t */\n\tgetUID( object ) {\n\n\t\tif ( ! this.uids.has( object ) ) this.uids.set( object, this.uid ++ );\n\n\t\treturn this.uids.get( object );\n\n\t}\n\n\t/**\n\t * Checks if normal attribute values are normalized.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {Boolean}\n\t */\n\tisNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) ) return false;\n\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = normal.count; i < il; i ++ ) {\n\n\t\t\t// 0.0005 is from glTF-validator\n\t\t\tif ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Creates normalized normal buffer attribute.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {BufferAttribute}\n\t *\n\t */\n\tcreateNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) )\treturn cache.attributesNormalized.get( normal );\n\n\t\tconst attribute = normal.clone();\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tv.fromBufferAttribute( attribute, i );\n\n\t\t\tif ( v.x === 0 && v.y === 0 && v.z === 0 ) {\n\n\t\t\t\t// if values can't be normalized set (1, 0, 0)\n\t\t\t\tv.setX( 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.normalize();\n\n\t\t\t}\n\n\t\t\tattribute.setXYZ( i, v.x, v.y, v.z );\n\n\t\t}\n\n\t\tcache.attributesNormalized.set( normal, attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Applies a texture transform, if present, to the map definition. Requires\n\t * the KHR_texture_transform extension.\n\t *\n\t * @param {Object} mapDef\n\t * @param {THREE.Texture} texture\n\t */\n\tapplyTextureTransform( mapDef, texture ) {\n\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tif ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {\n\n\t\t\ttransformDef.offset = texture.offset.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.rotation !== 0 ) {\n\n\t\t\ttransformDef.rotation = texture.rotation;\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {\n\n\t\t\ttransformDef.scale = texture.repeat.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( didTransform ) {\n\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions[ 'KHR_texture_transform' ] = transformDef;\n\t\t\tthis.extensionsUsed[ 'KHR_texture_transform' ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param {ArrayBuffer} buffer\n\t * @return {Integer}\n\t */\n\tprocessBuffer( buffer ) {\n\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push( buffer );\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param {BufferAttribute} attribute\n\t * @param {number} componentType\n\t * @param {number} start\n\t * @param {number} count\n\t * @param {number} target (Optional) Target usage of the BufferView\n\t * @return {Object}\n\t */\n\tprocessBufferView( attribute, componentType, start, count, target ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tif ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\tcomponentSize = 1;\n\n\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\tcomponentSize = 2;\n\n\t\t} else {\n\n\t\t\tcomponentSize = 4;\n\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize( count * attribute.itemSize * componentSize );\n\t\tconst dataView = new DataView( new ArrayBuffer( byteLength ) );\n\t\tlet offset = 0;\n\n\t\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( componentType === WEBGL_CONSTANTS.FLOAT ) {\n\n\t\t\t\t\tdataView.setFloat32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {\n\n\t\t\t\t\tdataView.setUint32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\t\t\tdataView.setUint16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\t\t\tdataView.setUint8( offset, value );\n\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bufferViewDef = {\n\n\t\t\tbuffer: this.processBuffer( dataView.buffer ),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\n\t\t};\n\n\t\tif ( target !== undefined ) bufferViewDef.target = target;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = attribute.itemSize * componentSize;\n\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tjson.bufferViews.push( bufferViewDef );\n\n\t\t// @TODO Merge bufferViews where possible.\n\t\tconst output = {\n\n\t\t\tid: json.bufferViews.length - 1,\n\t\t\tbyteLength: 0\n\n\t\t};\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @return {Promise<Integer>}\n\t */\n\tprocessBufferViewImage( blob ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\treturn new Promise( function ( resolve ) {\n\n\t\t\tconst reader = new window.FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\tconst buffer = getPaddedArrayBuffer( reader.result );\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve( json.bufferViews.push( bufferViewDef ) - 1 );\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param {BufferAttribute} attribute Attribute to process\n\t * @param {THREE.BufferGeometry} geometry (Optional) Geometry used for truncated draw range\n\t * @param {Integer} start (Optional)\n\t * @param {Integer} count (Optional)\n\t * @return {Integer|null} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor( attribute, geometry, start, count ) {\n\n\t\tconst options = this.options;\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t16: 'MAT4'\n\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array (float, uint or ushort)\n\t\tif ( attribute.array.constructor === Float32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.FLOAT;\n\n\t\t} else if ( attribute.array.constructor === Uint32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_INT;\n\n\t\t} else if ( attribute.array.constructor === Uint16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;\n\n\t\t} else if ( attribute.array.constructor === Uint8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type.' );\n\n\t\t}\n\n\t\tif ( start === undefined ) start = 0;\n\t\tif ( count === undefined ) count = attribute.count;\n\n\t\t// @TODO Indexed buffer geometry with drawRange not supported yet\n\t\tif ( options.truncateDrawRange && geometry !== undefined && geometry.index === null ) {\n\n\t\t\tconst end = start + count;\n\t\t\tconst end2 = geometry.drawRange.count === Infinity\n\t\t\t\t? attribute.count\n\t\t\t\t: geometry.drawRange.start + geometry.drawRange.count;\n\n\t\t\tstart = Math.max( start, geometry.drawRange.start );\n\t\t\tcount = Math.min( end, end2 ) - start;\n\n\t\t\tif ( count < 0 ) count = 0;\n\n\t\t}\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif ( count === 0 ) return null;\n\n\t\tconst minMax = getMinMax( attribute, start, count );\n\t\tlet bufferViewTarget;\n\n\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t// animation samplers, target must not be set.\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tbufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;\n\n\t\t}\n\n\t\tconst bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );\n\n\t\tconst accessorDef = {\n\n\t\t\tbufferView: bufferView.id,\n\t\t\tbyteOffset: bufferView.byteOffset,\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[ attribute.itemSize ]\n\n\t\t};\n\n\t\tif ( attribute.normalized === true ) accessorDef.normalized = true;\n\t\tif ( ! json.accessors ) json.accessors = [];\n\n\t\treturn json.accessors.push( accessorDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process image\n\t * @param {Image} image to process\n\t * @param {Integer} format of the image (e.g. RGBFormat, RGBAFormat etc)\n\t * @param {Boolean} flipY before writing out the image\n\t * @return {Integer} Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage( image, format, flipY ) {\n\n\t\tconst writer = this;\n\t\tconst cache = writer.cache;\n\t\tconst json = writer.json;\n\t\tconst options = writer.options;\n\t\tconst pending = writer.pending;\n\n\t\tif ( ! cache.images.has( image ) ) cache.images.set( image, {} );\n\n\t\tconst cachedImages = cache.images.get( image );\n\t\tconst mimeType = format === RGBAFormat ? 'image/png' : 'image/jpeg';\n\t\tconst key = mimeType + ':flipY/' + flipY.toString();\n\n\t\tif ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];\n\n\t\tif ( ! json.images ) json.images = [];\n\n\t\tconst imageDef = { mimeType: mimeType };\n\n\t\tif ( options.embedImages ) {\n\n\t\t\tconst canvas = cachedCanvas = cachedCanvas || document.createElement( 'canvas' );\n\n\t\t\tcanvas.width = Math.min( image.width, options.maxTextureSize );\n\t\t\tcanvas.height = Math.min( image.height, options.maxTextureSize );\n\n\t\t\tconst ctx = canvas.getContext( '2d' );\n\n\t\t\tif ( flipY === true ) {\n\n\t\t\t\tctx.translate( 0, canvas.height );\n\t\t\t\tctx.scale( 1, - 1 );\n\n\t\t\t}\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 OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tctx.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t} else {\n\n\t\t\t\tif ( format !== RGBAFormat && format !== RGBFormat ) {\n\n\t\t\t\t\tconsole.error( 'GLTFExporter: Only RGB and RGBA formats are supported.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {\n\n\t\t\t\t\tconsole.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );\n\n\t\t\t\t}\n\n\t\t\t\tconst data = new Uint8ClampedArray( image.height * image.width * 4 );\n\n\t\t\t\tif ( format === RGBAFormat ) {\n\n\t\t\t\t\tfor ( let i = 0; i < data.length; i += 4 ) {\n\n\t\t\t\t\t\tdata[ i + 0 ] = image.data[ i + 0 ];\n\t\t\t\t\t\tdata[ i + 1 ] = image.data[ i + 1 ];\n\t\t\t\t\t\tdata[ i + 2 ] = image.data[ i + 2 ];\n\t\t\t\t\t\tdata[ i + 3 ] = image.data[ i + 3 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let i = 0, j = 0; i < data.length; i += 4, j += 3 ) {\n\n\t\t\t\t\t\tdata[ i + 0 ] = image.data[ j + 0 ];\n\t\t\t\t\t\tdata[ i + 1 ] = image.data[ j + 1 ];\n\t\t\t\t\t\tdata[ i + 2 ] = image.data[ j + 2 ];\n\t\t\t\t\t\tdata[ i + 3 ] = 255;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\tpending.push( new Promise( function ( resolve ) {\n\n\t\t\t\t\tcanvas.toBlob( function ( blob ) {\n\n\t\t\t\t\t\twriter.processBufferViewImage( blob ).then( function ( bufferViewIndex ) {\n\n\t\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\t\t\t\t\t\t\tresolve();\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}, mimeType );\n\n\t\t\t\t} ) );\n\n\t\t\t} else {\n\n\t\t\t\timageDef.uri = canvas.toDataURL( mimeType );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\timageDef.uri = image.src;\n\n\t\t}\n\n\t\tconst index = json.images.push( imageDef ) - 1;\n\t\tcachedImages[ key ] = index;\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param {Texture} map Texture to process\n\t * @return {Integer} Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler( map ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.samplers ) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: THREE_TO_WEBGL[ map.magFilter ],\n\t\t\tminFilter: THREE_TO_WEBGL[ map.minFilter ],\n\t\t\twrapS: THREE_TO_WEBGL[ map.wrapS ],\n\t\t\twrapT: THREE_TO_WEBGL[ map.wrapT ]\n\t\t};\n\n\t\treturn json.samplers.push( samplerDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process texture\n\t * @param {Texture} map Map to process\n\t * @return {Integer} Index of the processed texture in the \"textures\" array\n\t */\n\tprocessTexture( map ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.textures.has( map ) ) return cache.textures.get( map );\n\n\t\tif ( ! json.textures ) json.textures = [];\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler( map ),\n\t\t\tsource: this.processImage( map.image, map.format, map.flipY )\n\t\t};\n\n\t\tif ( map.name ) textureDef.name = map.name;\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeTexture && ext.writeTexture( map, textureDef );\n\n\t\t} );\n\n\t\tconst index = json.textures.push( textureDef ) - 1;\n\t\tcache.textures.set( map, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process material\n\t * @param {THREE.Material} material Material to process\n\t * @return {Integer|null} Index of the processed material in the \"materials\" array\n\t */\n\tprocessMaterial( material ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.materials.has( material ) ) return cache.materials.get( material );\n\n\t\tif ( material.isShaderMaterial ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( ! json.materials ) json.materials = [];\n\n\t\t// @QUESTION Should we avoid including any attribute that has the default value?\n\t\tconst materialDef = {\tpbrMetallicRoughness: {} };\n\n\t\tif ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.color.toArray().concat( [ material.opacity ] );\n\n\t\tif ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\n\t\t}\n\n\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;\n\n\t\t} else {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.5;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.5;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif ( material.metalnessMap || material.roughnessMap ) {\n\n\t\t\tif ( material.metalnessMap === material.roughnessMap ) {\n\n\t\t\t\tconst metalRoughMapDef = { index: this.processTexture( material.metalnessMap ) };\n\t\t\t\tthis.applyTextureTransform( metalRoughMapDef, material.metalnessMap );\n\t\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Ignoring metalnessMap and roughnessMap because they are not the same Texture.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture or pbrSpecularGlossiness diffuseTexture\n\t\tif ( material.map ) {\n\n\t\t\tconst baseColorMapDef = { index: this.processTexture( material.map ) };\n\t\t\tthis.applyTextureTransform( baseColorMapDef, material.map );\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\t// note: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see #21849 and #22000.\n\t\t\tconst emissive = material.emissive.clone().multiplyScalar( material.emissiveIntensity );\n\t\t\tconst maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );\n\n\t\t\tif ( maxEmissiveComponent > 1 ) {\n\n\t\t\t\temissive.multiplyScalar( 1 / maxEmissiveComponent );\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited' );\n\n\t\t\t}\n\n\t\t\tif ( maxEmissiveComponent > 0 ) {\n\n\t\t\t\tmaterialDef.emissiveFactor = emissive.toArray();\n\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tconst emissiveMapDef = { index: this.processTexture( material.emissiveMap ) };\n\t\t\t\tthis.applyTextureTransform( emissiveMapDef, material.emissiveMap );\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalTexture\n\t\tif ( material.normalMap ) {\n\n\t\t\tconst normalMapDef = { index: this.processTexture( material.normalMap ) };\n\n\t\t\tif ( material.normalScale && material.normalScale.x !== - 1 ) {\n\n\t\t\t\tif ( material.normalScale.x !== material.normalScale.y ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Normal scale components are different, ignoring Y and exporting X.' );\n\n\t\t\t\t}\n\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( normalMapDef, material.normalMap );\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif ( material.aoMap ) {\n\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: this.processTexture( material.aoMap ),\n\t\t\t\ttexCoord: 1\n\t\t\t};\n\n\t\t\tif ( material.aoMapIntensity !== 1.0 ) {\n\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( occlusionMapDef, material.aoMap );\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\n\t\t}\n\n\t\t// alphaMode\n\t\tif ( material.transparent ) {\n\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\n\t\t} else {\n\n\t\t\tif ( material.alphaTest > 0.0 ) {\n\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// doubleSided\n\t\tif ( material.side === DoubleSide ) materialDef.doubleSided = true;\n\t\tif ( material.name !== '' ) materialDef.name = material.name;\n\n\t\tthis.serializeUserData( material, materialDef );\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMaterial && ext.writeMaterial( material, materialDef );\n\n\t\t} );\n\n\t\tconst index = json.materials.push( materialDef ) - 1;\n\t\tcache.materials.set( material, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param {THREE.Mesh} mesh Mesh to process\n\t * @return {Integer|null} Index of the processed mesh in the \"meshes\" array\n\t */\n\tprocessMesh( mesh ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [ mesh.geometry.uuid ];\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tfor ( let i = 0, l = mesh.material.length; i < l; i ++ ) {\n\n\t\t\t\tmeshCacheKeyParts.push( mesh.material[ i ].uuid\t);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmeshCacheKeyParts.push( mesh.material.uuid );\n\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join( ':' );\n\n\t\tif ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet mode;\n\n\t\t// Use the correct mode\n\t\tif ( mesh.isLineSegments ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINES;\n\n\t\t} else if ( mesh.isLineLoop ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_LOOP;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_STRIP;\n\n\t\t} else if ( mesh.isPoints ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.POINTS;\n\n\t\t} else {\n\n\t\t\tmode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;\n\n\t\t}\n\n\t\tif ( geometry.isBufferGeometry !== true ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Geometry is not of type THREE.BufferGeometry.' );\n\n\t\t}\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\t// Conversion between attributes names in threejs and gltf spec\n\t\tconst nameConversion = {\n\t\t\tuv: 'TEXCOORD_0',\n\t\t\tuv2: 'TEXCOORD_1',\n\t\t\tcolor: 'COLOR_0',\n\t\t\tskinWeight: 'WEIGHTS_0',\n\t\t\tskinIndex: 'JOINTS_0'\n\t\t};\n\n\t\tconst originalNormal = geometry.getAttribute( 'normal' );\n\n\t\tif ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );\n\n\t\t\tgeometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );\n\n\t\t}\n\n\t\t// @QUESTION Detect if .vertexColors = true?\n\t\t// For every attribute create an accessor\n\t\tlet modifiedAttribute = null;\n\n\t\tfor ( let attributeName in geometry.attributes ) {\n\n\t\t\t// Ignore morph target attributes, which are exported later.\n\t\t\tif ( attributeName.substr( 0, 5 ) === 'morph' ) continue;\n\n\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\tattributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();\n\n\t\t\t// Prefix all geometry attributes except the ones specifically\n\t\t\t// listed in the spec; non-spec attributes are considered custom.\n\t\t\tconst validVertexAttributes =\n\t\t\t\t\t/^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\n\t\t\tif ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;\n\n\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\tattributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT.\n\t\t\tmodifiedAttribute = null;\n\t\t\tconst array = attribute.array;\n\n\t\t\tif ( attributeName === 'JOINTS_0' &&\n\t\t\t\t! ( array instanceof Uint16Array ) &&\n\t\t\t\t! ( array instanceof Uint8Array ) ) {\n\n\t\t\t\tconsole.warn( 'GLTFExporter: Attribute \"skinIndex\" converted to type UNSIGNED_SHORT.' );\n\t\t\t\tmodifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tconst accessor = this.processAccessor( modifiedAttribute || attribute, geometry );\n\n\t\t\tif ( accessor !== null ) {\n\n\t\t\t\tattributes[ attributeName ] = accessor;\n\t\t\t\tcache.attributes.set( this.getUID( attribute ), accessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal );\n\n\t\t// Skip if no exportable attributes found\n\t\tif ( Object.keys( attributes ).length === 0 ) return null;\n\n\t\t// Morph targets\n\t\tif ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {\n\n\t\t\tconst weights = [];\n\t\t\tconst targetNames = [];\n\t\t\tconst reverseDictionary = {};\n\n\t\t\tif ( mesh.morphTargetDictionary !== undefined ) {\n\n\t\t\t\tfor ( const key in mesh.morphTargetDictionary ) {\n\n\t\t\t\t\treverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {\n\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor ( const attributeName in geometry.morphAttributes ) {\n\n\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// Three.js doesn't support TANGENT yet.\n\n\t\t\t\t\tif ( attributeName !== 'position' && attributeName !== 'normal' && attributeName !== 'color' ) {\n\n\t\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );\n\t\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[ attributeName ][ i ];\n\t\t\t\t\tlet gltfAttributeName = attributeName.toUpperCase();\n\n if ( nameConversion[ attributeName ] ) {\n\n gltfAttributeName = nameConversion[ attributeName ];\n\n }\n\n\t\t\t\t\t// Three.js morph attribute has absolute values while the one of glTF has relative values.\n\t\t\t\t\t//\n\t\t\t\t\t// glTF 2.0 Specification:\n\t\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\t\t\tconst baseAttribute = geometry.attributes[ attributeName ];\n\n\t\t\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\t\t\ttarget[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clones attribute not to override\n\t\t\t\t\tconst relativeAttribute = baseAttribute.clone();\n\n\t\t\t\t\tif ( ! geometry.morphTargetsRelative ) {\n\n if (baseAttribute) {\n\n for ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n if (baseAttribute.count > j) {\n\n relativeAttribute.setXYZ(\n j,\n attribute.getX( j ) - baseAttribute.getX( j ),\n attribute.getY( j ) - baseAttribute.getY( j ),\n attribute.getZ( j ) - baseAttribute.getZ( j )\n );\n\n }\n\n }\n\n } else {\n\n for ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n relativeAttribute.setXYZ(\n j,\n 0,\n 0,\n 0\n );\n\n }\n\n }\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );\n\t\t\t\t\tcache.attributes.set( this.getUID( baseAttribute ), target[ gltfAttributeName ] );\n\n\t\t\t\t}\n\n\t\t\t\ttargets.push( target );\n\n\t\t\t\tweights.push( mesh.morphTargetInfluences[ i ] );\n\n\t\t\t\tif ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );\n\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\n\t\t\tif ( targetNames.length > 0 ) {\n\n\t\t\t\tmeshDef.extras = {};\n\t\t\t\tmeshDef.extras.targetNames = targetNames;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray( mesh.material );\n\n\t\tif ( isMultiMaterial && geometry.groups.length === 0 ) return null;\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [ mesh.material ];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ];\n\n\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes,\n\t\t\t};\n\n\t\t\tthis.serializeUserData( geometry, primitive );\n\n\t\t\tif ( targets.length > 0 ) primitive.targets = targets;\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tlet cacheKey = this.getUID( geometry.index );\n\n\t\t\t\tif ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {\n\n\t\t\t\t\tcacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cache.attributes.has( cacheKey ) ) {\n\n\t\t\t\t\tprimitive.indices = cache.attributes.get( cacheKey );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprimitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );\n\t\t\t\t\tcache.attributes.set( cacheKey, primitive.indices );\n\n\t\t\t\t}\n\n\t\t\t\tif ( primitive.indices === null ) delete primitive.indices;\n\n\t\t\t}\n\n\t\t\tconst material = this.processMaterial( materials[ groups[ i ].materialIndex ] );\n\n\t\t\tif ( material !== null ) primitive.material = material;\n\n\t\t\tprimitives.push( primitive );\n\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif ( ! json.meshes ) json.meshes = [];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMesh && ext.writeMesh( mesh, meshDef );\n\n\t\t} );\n\n\t\tconst index = json.meshes.push( meshDef ) - 1;\n\t\tcache.meshes.set( meshCacheKey, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process camera\n\t * @param {THREE.Camera} camera Camera to process\n\t * @return {Integer} Index of the processed mesh in the \"camera\" array\n\t */\n\tprocessCamera( camera ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.cameras ) json.cameras = [];\n\n\t\tconst isOrtho = camera.isOrthographicCamera;\n\n\t\tconst cameraDef = {\n\t\t\ttype: isOrtho ? 'orthographic' : 'perspective'\n\t\t};\n\n\t\tif ( isOrtho ) {\n\n\t\t\tcameraDef.orthographic = {\n\t\t\t\txmag: camera.right * 2,\n\t\t\t\tymag: camera.top * 2,\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tcameraDef.perspective = {\n\t\t\t\taspectRatio: camera.aspect,\n\t\t\t\tyfov: MathUtils.degToRad( camera.fov ),\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t}\n\n\t\t// Question: Is saving \"type\" as name intentional?\n\t\tif ( camera.name !== '' ) cameraDef.name = camera.type;\n\n\t\treturn json.cameras.push( cameraDef ) - 1;\n\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t *\n\t * @param {THREE.AnimationClip} clip\n\t * @param {THREE.Object3D} root\n\t * @return {number|null}\n\t */\n\tprocessAnimation( clip, root ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.animations ) json.animations = [];\n\n\t\tclip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor ( let i = 0; i < tracks.length; ++ i ) {\n\n\t\t\tconst track = tracks[ i ];\n\t\t\tconst trackBinding = PropertyBinding.parseTrackName( track.name );\n\t\t\tlet trackNode = PropertyBinding.findNode( root, trackBinding.nodeName );\n\t\t\tconst trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];\n\n\t\t\tif ( trackBinding.objectName === 'bones' ) {\n\n\t\t\t\tif ( trackNode.isSkinnedMesh === true ) {\n\n\t\t\t\t\ttrackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttrackNode = undefined;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! trackNode || ! trackProperty ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation track \"%s\".', track.name );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.values.length / track.times.length;\n\n\t\t\tif ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {\n\n\t\t\t\toutputItemSize /= trackNode.morphTargetInfluences.length;\n\n\t\t\t}\n\n\t\t\tlet interpolation;\n\n\t\t\t// @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE\n\n\t\t\t// Detecting glTF cubic spline interpolant by checking factory method's special property\n\t\t\t// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return\n\t\t\t// valid value from .getInterpolation().\n\t\t\tif ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {\n\n\t\t\t\tinterpolation = 'CUBICSPLINE';\n\n\t\t\t\t// itemSize of CUBICSPLINE keyframe is 9\n\t\t\t\t// (VEC3 * 3: inTangent, splineVertex, and outTangent)\n\t\t\t\t// but needs to be stored as VEC3 so dividing by 3 here.\n\t\t\t\toutputItemSize /= 3;\n\n\t\t\t} else if ( track.getInterpolation() === InterpolateDiscrete ) {\n\n\t\t\t\tinterpolation = 'STEP';\n\n\t\t\t} else {\n\n\t\t\t\tinterpolation = 'LINEAR';\n\n\t\t\t}\n\n\t\t\tsamplers.push( {\n\t\t\t\tinput: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ),\n\t\t\t\toutput: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ),\n\t\t\t\tinterpolation: interpolation\n\t\t\t} );\n\n\t\t\tchannels.push( {\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get( trackNode ),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tjson.animations.push( {\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t} );\n\n\t\treturn json.animations.length - 1;\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D} object\n\t * @return {number|null}\n\t */\n\t processSkin( object ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[ nodeMap.get( object ) ];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif ( skeleton === undefined ) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[ 0 ];\n\n\t\tif ( rootJoint === undefined ) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor ( let i = 0; i < skeleton.bones.length; ++ i ) {\n\n\t\t\tjoints.push( nodeMap.get( skeleton.bones[ i ] ) );\n\t\t\ttemporaryBoneInverse.copy( skeleton.boneInverses[ i ] );\n\t\t\ttemporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( json.skins === undefined ) json.skins = [];\n\n\t\tjson.skins.push( {\n\t\t\tinverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get( rootJoint )\n\t\t} );\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param {THREE.Object3D} node Object3D to processNode\n\t * @return {Integer} Index of the node in the nodes list\n\t */\n\tprocessNode( object ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.nodes ) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif ( options.trs ) {\n\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {\n\n\t\t\t\tnodeDef.rotation = rotation;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( position, [ 0, 0, 0 ] ) ) {\n\n\t\t\t\tnodeDef.translation = position;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {\n\n\t\t\t\tnodeDef.scale = scale;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( object.matrixAutoUpdate ) {\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t}\n\n\t\t\tif ( isIdentityMatrix( object.matrix ) === false ) {\n\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// We don't export empty strings name because it represents no-name in Three.js.\n\t\tif ( object.name !== '' ) nodeDef.name = String( object.name );\n\n\t\tthis.serializeUserData( object, nodeDef );\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tconst meshIndex = this.processMesh( object );\n\n\t\t\tif ( meshIndex !== null ) nodeDef.mesh = meshIndex;\n\n\t\t} else if ( object.isCamera ) {\n\n\t\t\tnodeDef.camera = this.processCamera( object );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) this.skins.push( object );\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tconst children = [];\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = object.children[ i ];\n\n\t\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\t\tif ( nodeIndex !== null ) children.push( nodeIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( children.length > 0 ) nodeDef.children = children;\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeNode && ext.writeNode( object, nodeDef );\n\n\t\t} );\n\n\t\tconst nodeIndex = json.nodes.push( nodeDef ) - 1;\n\t\tnodeMap.set( object, nodeIndex );\n\t\treturn nodeIndex;\n\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param {Scene} node Scene to process\n\t */\n\tprocessScene( scene ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! json.scenes ) {\n\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif ( scene.name !== '' ) sceneDef.name = scene.name;\n\n\t\tjson.scenes.push( sceneDef );\n\n\t\tconst nodes = [];\n\n\t\tfor ( let i = 0, l = scene.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = scene.children[ i ];\n\n\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\tif ( nodeIndex !== null ) nodes.push( nodeIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( nodes.length > 0 ) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData( scene, sceneDef );\n\n\t}\n\n\t/**\n\t * Creates a Scene to hold a list of objects and parse it\n\t * @param {Array} objects List of objects to process\n\t */\n\tprocessObjects( objects ) {\n\n\t\tconst scene = new Scene();\n\t\tscene.name = 'AuxScene';\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t// modify the .parent and break its original scene and hierarchy\n\t\t\tscene.children.push( objects[ i ] );\n\n\t\t}\n\n\t\tthis.processScene( scene );\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|Array<THREE.Object3D>} input\n\t */\n\tprocessInput( input ) {\n\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [ input ];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.beforeParse && ext.beforeParse( input );\n\n\t\t} );\n\n\t\tconst objectsWithoutScene = [];\n\n\t\tfor ( let i = 0; i < input.length; i ++ ) {\n\n\t\t\tif ( input[ i ] instanceof Scene ) {\n\n\t\t\t\tthis.processScene( input[ i ] );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsWithoutScene.push( input[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsWithoutScene.length > 0 ) this.processObjects( objectsWithoutScene );\n\n\t\tfor ( let i = 0; i < this.skins.length; ++ i ) {\n\n\t\t\tthis.processSkin( this.skins[ i ] );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < options.animations.length; ++ i ) {\n\n\t\t\tthis.processAnimation( options.animations[ i ].clip, options.animations[i].mesh);\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.afterParse && ext.afterParse( input );\n\n\t\t} );\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tfor ( let i = 0, il = this.plugins.length; i < il; i ++ ) {\n\n\t\t\tfunc( this.plugins[ i ] );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\n\t}\n\n\twriteNode( light, nodeDef ) {\n\n\t\tif ( ! light.isLight ) return;\n\n\t\tif ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif ( light.name ) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif ( light.isDirectionalLight ) {\n\n\t\t\tlightDef.type = 'directional';\n\n\t\t} else if ( light.isPointLight ) {\n\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t} else if ( light.isSpotLight ) {\n\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = ( light.penumbra - 1.0 ) * light.angle * - 1.0;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\n\t\t}\n\n\t\tif ( light.decay !== undefined && light.decay !== 2 ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.' );\n\n\t\t}\n\n\t\tif ( light.target\n\t\t\t\t&& ( light.target.parent !== light\n\t\t\t\t|| light.target.position.x !== 0\n\t\t\t\t|| light.target.position.y !== 0\n\t\t\t\t|| light.target.position.z !== - 1 ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, '\n\t\t\t\t+ 'make light.target a child of the light with position 0,0,-1.' );\n\n\t\t}\n\n\t\tif ( ! extensionsUsed[ this.name ] ) {\n\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[ this.name ] = { lights: [] };\n\t\t\textensionsUsed[ this.name ] = true;\n\n\t\t}\n\n\t\tconst lights = json.extensions[ this.name ].lights;\n\t\tlights.push( lightDef );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { light: lights.length - 1 };\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshBasicMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = {};\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\n\n\t}\n\n}\n\n/**\n * Specular-Glossiness Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n */\nclass GLTFMaterialsPBRSpecularGlossiness {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_pbrSpecularGlossiness';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isGLTFSpecularGlossinessMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( materialDef.pbrMetallicRoughness.baseColorFactor ) {\n\n\t\t\textensionDef.diffuseFactor = materialDef.pbrMetallicRoughness.baseColorFactor;\n\n\t\t}\n\n\t\tconst specularFactor = [ 1, 1, 1 ];\n\t\tmaterial.specular.toArray( specularFactor, 0 );\n\t\textensionDef.specularFactor = specularFactor;\n\t\textensionDef.glossinessFactor = material.glossiness;\n\n\t\tif ( materialDef.pbrMetallicRoughness.baseColorTexture ) {\n\n\t\t\textensionDef.diffuseTexture = materialDef.pbrMetallicRoughness.baseColorTexture;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tconst specularMapDef = { index: writer.processTexture( material.specularMap ) };\n\t\t\twriter.applyTextureTransform( specularMapDef, material.specularMap );\n\t\t\textensionDef.specularGlossinessTexture = specularMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Static utility functions\n */\nGLTFExporter.Utils = {\n\n\tinsertKeyframe: function ( track, time ) {\n\n\t\tconst tolerance = 0.001; // 1ms\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = new track.TimeBufferType( track.times.length + 1 );\n\t\tconst values = new track.ValueBufferType( track.values.length + valueSize );\n\t\tconst interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );\n\n\t\tlet index;\n\n\t\tif ( track.times.length === 0 ) {\n\n\t\t\ttimes[ 0 ] = time;\n\n\t\t\tfor ( let i = 0; i < valueSize; i ++ ) {\n\n\t\t\t\tvalues[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time < track.times[ 0 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;\n\n\t\t\ttimes[ 0 ] = time;\n\t\t\ttimes.set( track.times, 1 );\n\n\t\t\tvalues.set( interpolant.evaluate( time ), 0 );\n\t\t\tvalues.set( track.values, valueSize );\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time > track.times[ track.times.length - 1 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {\n\n\t\t\t\treturn track.times.length - 1;\n\n\t\t\t}\n\n\t\t\ttimes[ times.length - 1 ] = time;\n\t\t\ttimes.set( track.times, 0 );\n\n\t\t\tvalues.set( track.values, 0 );\n\t\t\tvalues.set( interpolant.evaluate( time ), track.values.length );\n\n\t\t\tindex = times.length - 1;\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < track.times.length; i ++ ) {\n\n\t\t\t\tif ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;\n\n\t\t\t\tif ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {\n\n\t\t\t\t\ttimes.set( track.times.slice( 0, i + 1 ), 0 );\n\t\t\t\t\ttimes[ i + 1 ] = time;\n\t\t\t\t\ttimes.set( track.times.slice( i + 1 ), i + 2 );\n\n\t\t\t\t\tvalues.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );\n\t\t\t\t\tvalues.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );\n\t\t\t\t\tvalues.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );\n\n\t\t\t\t\tindex = i + 1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttrack.times = times;\n\t\ttrack.values = values;\n\n\t\treturn index;\n\n\t},\n\n\tmergeMorphTargetTracks: function ( clip, root ) {\n\n\t\tconst tracks = [];\n\t\tconst mergedTracks = {};\n\t\tconst sourceTracks = clip.tracks;\n\n\t\tfor ( let i = 0; i < sourceTracks.length; ++ i ) {\n\n\t\t\tlet sourceTrack = sourceTracks[ i ];\n\t\t\tconst sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name );\n\t\t\tconst sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName );\n\n\t\t\tif ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {\n\n\t\t\t\t// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.\n\t\t\t\ttracks.push( sourceTrack );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete\n\t\t\t\t&& sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {\n\n\t\t\t\tif ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\t\t// This should never happen, because glTF morph target animations\n\t\t\t\t\t// affect all targets already.\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );\n\n\t\t\t\tsourceTrack = sourceTrack.clone();\n\t\t\t\tsourceTrack.setInterpolation( InterpolateLinear );\n\n\t\t\t}\n\n\t\t\tconst targetCount = sourceTrackNode.morphTargetInfluences.length;\n\t\t\tconst targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];\n\n\t\t\tif ( targetIndex === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );\n\n\t\t\t}\n\n\t\t\tlet mergedTrack;\n\n\t\t\t// If this is the first time we've seen this object, create a new\n\t\t\t// track to store merged keyframe data for each morph target.\n\t\t\tif ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {\n\n\t\t\t\tmergedTrack = sourceTrack.clone();\n\n\t\t\t\tconst values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );\n\n\t\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\t\tvalues[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];\n\n\t\t\t\t}\n\n\t\t\t\t// We need to take into consideration the intended target node\n\t\t\t\t// of our original un-merged morphTarget animation.\n\t\t\t\tmergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';\n\t\t\t\tmergedTrack.values = values;\n\n\t\t\t\tmergedTracks[ sourceTrackNode.uuid ] = mergedTrack;\n\t\t\t\ttracks.push( mergedTrack );\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );\n\n\t\t\tmergedTrack = mergedTracks[ sourceTrackNode.uuid ];\n\n\t\t\t// For every existing keyframe of the merged track, write a (possibly\n\t\t\t// interpolated) value from the source track.\n\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\tmergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );\n\n\t\t\t}\n\n\t\t\t// For every existing keyframe of the source track, write a (possibly\n\t\t\t// new) keyframe to the merged track. Values from the previous loop may\n\t\t\t// be written again, but keyframes are de-duplicated.\n\t\t\tfor ( let j = 0; j < sourceTrack.times.length; j ++ ) {\n\n\t\t\t\tconst keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );\n\t\t\t\tmergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\treturn clip;\n\n\t}\n\n};\n\nexport { GLTFExporter };\n","import { GLTFExporter } from './three/GLTFExporter';\n\n/**\n * Provides an object which uses for exporting the scene\n *\n * @class\n * @author Alan Wu\n * @return {SceneExporter}\n */\nconst SceneExporter = function (sceneIn) {\n const scene = sceneIn;\n\n\tthis.exportGLTF = (binary) => {\n const rootRegion = scene.getRootRegion();\n const zincObjects = rootRegion.getAllObjects(true);\n const animations = [];\n zincObjects.forEach(zincObject => {\n if (zincObject.animationClip) {\n animations.push({clip: zincObject.animationClip[0], mesh: zincObject.getMorph()});\n }\n });\n const exporter = new GLTFExporter();\n const options = { binary, animations };\n return new Promise((resolve, reject) => {\n exporter.parse( scene.getThreeJSScene(), function ( gltf ) {\n resolve(gltf);\n }, options );\n });\n\t}\n}\n\nexport { SceneExporter };\n","import * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';\nimport { Geometry } from '../primitives/geometry';\nimport { Lines } from '../primitives/lines';\nimport { Pointset } from '../primitives/pointset';\n\nconst GLTFToZincJSLoader = function () {\n\n const _this = this;\n\n this.parseGLTFObjects = (object, region, depth, finishCallback) => {\n let childRegion = region;\n if (depth !== 0) {\n if (object.type === \"Object3D\") {\n if (object.name !== \"\") {\n if (region)\n childRegion = region.findOrCreateChildFromPath(object.name);\n if (childRegion) {\n const group = childRegion.getGroup();\n group.position.copy(object.position);\n group.rotation.copy(object.rotation);\n group.quaternion.copy(object.quaternion);\n group.matrixAutoUpdate = true;\n }\n }\n } else {\n let zincGeometry = undefined;\n if (object.type === \"Mesh\") {\n zincGeometry = new Geometry();\n } else if (object.type === \"LineSegments\") {\n zincGeometry = new Lines();\n } else if (object.type === \"Points\") {\n zincGeometry = new Pointset();\n }\n if (zincGeometry) {\n let localTimeEnabled = false;\n let localMorphColour = false;\n if (object.geometry && object.geometry.morphAttributes) {\n localTimeEnabled = object.geometry.morphAttributes.position ? true : false;\n localMorphColour = object.geometry.morphAttributes.color ? true : false;\n }\n zincGeometry.setMesh(object.clone(), localTimeEnabled, localMorphColour);\n const morph = zincGeometry.getMorph();\n zincGeometry.groupName = morph.name;\n morph.matrixAutoUpdate = true;\n region.addZincObject(zincGeometry);\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(zincGeometry);\n }\n }\n }\n depth++;\n object.children.forEach( child => {\n _this.parseGLTFObjects(child, childRegion, depth, finishCallback);\n });\n }\n\n this.setCamera = scene => {\n scene.viewAll();\n const cameraControls = scene.getZincCameraControls();\n const viewport = cameraControls.getCurrentViewport();\n cameraControls.addViewport('default', viewport);\n cameraControls.setDefaultViewport('default');\n }\n\n /**\n * Load GLTF into this scene object.\n *\n * @param {String} url - URL to the GLTF file\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.load = (scene, region, url, finishCallback, allCompletedCallback, options) => {\n const path = url.substring(0, url.lastIndexOf(\"/\") + 1);\n const filename = url.substring(url.lastIndexOf(\"/\") + 1, url.length);\n const loader = new GLTFLoader().setPath(path);\n\n loader.load( filename, function ( gltf ) {\n console.log(gltf)\n _this.parseGLTFObjects(gltf.scene, region, 0, finishCallback);\n _this.setCamera(scene);\n if (allCompletedCallback != undefined && (typeof allCompletedCallback == 'function'))\n allCompletedCallback();\n });\n }\n}\n\nexport { GLTFToZincJSLoader };\n","import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tMaterial,\n\tMesh,\n\tMeshPhongMaterial,\n\tPoints,\n\tPointsMaterial,\n\tVector3\n} from 'three';\n\n// o object_name | g group_name\nconst _object_pattern = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst _material_library_pattern = /^mtllib /;\n// usemtl material_name\nconst _material_use_pattern = /^usemtl /;\n// usemap map_name\nconst _map_use_pattern = /^usemap /;\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _ab = new Vector3();\nconst _cb = new Vector3();\n\nfunction ParserState() {\n\n\tconst state = {\n\t\tobjects: [],\n\t\tobject: {},\n\n\t\tvertices: [],\n\t\tnormals: [],\n\t\tcolors: [],\n\t\tuvs: [],\n\n\t\tmaterials: {},\n\t\tmaterialLibraries: [],\n\n\t\tstartObject: function ( name, fromDeclaration ) {\n\n\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\n\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\n\t\t\tif ( this.object && this.object.fromDeclaration === false ) {\n\n\t\t\t\tthis.object.name = name;\n\t\t\t\tthis.object.fromDeclaration = ( fromDeclaration !== false );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t\tthis.object = {\n\t\t\t\tname: name || '',\n\t\t\t\tfromDeclaration: ( fromDeclaration !== false ),\n\n\t\t\t\tgeometry: {\n\t\t\t\t\tvertices: [],\n\t\t\t\t\tnormals: [],\n\t\t\t\t\tcolors: [],\n\t\t\t\t\tuvs: [],\n\t\t\t\t\thasUVIndices: false\n\t\t\t\t},\n\t\t\t\tmaterials: [],\n\t\t\t\tsmooth: true,\n\n\t\t\t\tstartMaterial: function ( name, libraries ) {\n\n\t\t\t\t\tconst previous = this._finalize( false );\n\n\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\n\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\n\t\t\t\t\tif ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {\n\n\t\t\t\t\t\tthis.materials.splice( previous.index, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst material = {\n\t\t\t\t\t\tindex: this.materials.length,\n\t\t\t\t\t\tname: name || '',\n\t\t\t\t\t\tmtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),\n\t\t\t\t\t\tsmooth: ( previous !== undefined ? previous.smooth : this.smooth ),\n\t\t\t\t\t\tgroupStart: ( previous !== undefined ? previous.groupEnd : 0 ),\n\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\tinherited: false,\n\n\t\t\t\t\t\tclone: function ( index ) {\n\n\t\t\t\t\t\t\tconst cloned = {\n\t\t\t\t\t\t\t\tindex: ( typeof index === 'number' ? index : this.index ),\n\t\t\t\t\t\t\t\tname: this.name,\n\t\t\t\t\t\t\t\tmtllib: this.mtllib,\n\t\t\t\t\t\t\t\tsmooth: this.smooth,\n\t\t\t\t\t\t\t\tgroupStart: 0,\n\t\t\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\t\t\tinherited: false\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcloned.clone = this.clone.bind( cloned );\n\t\t\t\t\t\t\treturn cloned;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.materials.push( material );\n\n\t\t\t\t\treturn material;\n\n\t\t\t\t},\n\n\t\t\t\tcurrentMaterial: function () {\n\n\t\t\t\t\tif ( this.materials.length > 0 ) {\n\n\t\t\t\t\t\treturn this.materials[ this.materials.length - 1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t},\n\n\t\t\t\t_finalize: function ( end ) {\n\n\t\t\t\t\tconst lastMultiMaterial = this.currentMaterial();\n\t\t\t\t\tif ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) {\n\n\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n\t\t\t\t\t\tlastMultiMaterial.inherited = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\n\t\t\t\t\tif ( end && this.materials.length > 1 ) {\n\n\t\t\t\t\t\tfor ( let mi = this.materials.length - 1; mi >= 0; mi -- ) {\n\n\t\t\t\t\t\t\tif ( this.materials[ mi ].groupCount <= 0 ) {\n\n\t\t\t\t\t\t\t\tthis.materials.splice( mi, 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\t// Guarantee at least one empty material, this makes the creation later more straight forward.\n\t\t\t\t\tif ( end && this.materials.length === 0 ) {\n\n\t\t\t\t\t\tthis.materials.push( {\n\t\t\t\t\t\t\tname: '',\n\t\t\t\t\t\t\tsmooth: this.smooth\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn lastMultiMaterial;\n\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Inherit previous objects material.\n\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\n\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\n\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\n\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n\n\t\t\tif ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {\n\n\t\t\t\tconst declared = previousMaterial.clone( 0 );\n\t\t\t\tdeclared.inherited = true;\n\t\t\t\tthis.object.materials.push( declared );\n\n\t\t\t}\n\n\t\t\tthis.objects.push( this.object );\n\n\t\t},\n\n\t\tfinalize: function () {\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t},\n\n\t\tparseVertexIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseNormalIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseUVIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 2 ) * 2;\n\n\t\t},\n\n\t\taddVertex: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddVertexPoint: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddVertexLine: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.normals;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddFaceNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\t_vA.fromArray( src, a );\n\t\t\t_vB.fromArray( src, b );\n\t\t\t_vC.fromArray( src, c );\n\n\t\t\t_cb.subVectors( _vC, _vB );\n\t\t\t_ab.subVectors( _vA, _vB );\n\t\t\t_cb.cross( _ab );\n\n\t\t\t_cb.normalize();\n\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\n\t\t},\n\n\t\taddColor: function ( a, b, c ) {\n\n\t\t\tconst src = this.colors;\n\t\t\tconst dst = this.object.geometry.colors;\n\n\t\t\tif ( src[ a ] !== undefined ) dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tif ( src[ b ] !== undefined ) dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tif ( src[ c ] !== undefined ) dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddUV: function ( a, b, c ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ] );\n\n\t\t},\n\n\t\taddDefaultUV: function () {\n\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\n\t\t},\n\n\t\taddUVLine: function ( a ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\n\t\t},\n\n\t\taddFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tlet ia = this.parseVertexIndex( a, vLen );\n\t\t\tlet ib = this.parseVertexIndex( b, vLen );\n\t\t\tlet ic = this.parseVertexIndex( c, vLen );\n\n\t\t\tthis.addVertex( ia, ib, ic );\n\t\t\tthis.addColor( ia, ib, ic );\n\n\t\t\t// normals\n\n\t\t\tif ( na !== undefined && na !== '' ) {\n\n\t\t\t\tconst nLen = this.normals.length;\n\n\t\t\t\tia = this.parseNormalIndex( na, nLen );\n\t\t\t\tib = this.parseNormalIndex( nb, nLen );\n\t\t\t\tic = this.parseNormalIndex( nc, nLen );\n\n\t\t\t\tthis.addNormal( ia, ib, ic );\n\n\t\t\t} else {\n\n\t\t\t\tthis.addFaceNormal( ia, ib, ic );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tif ( ua !== undefined && ua !== '' ) {\n\n\t\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\t\tia = this.parseUVIndex( ua, uvLen );\n\t\t\t\tib = this.parseUVIndex( ub, uvLen );\n\t\t\t\tic = this.parseUVIndex( uc, uvLen );\n\n\t\t\t\tthis.addUV( ia, ib, ic );\n\n\t\t\t\tthis.object.geometry.hasUVIndices = true;\n\n\t\t\t} else {\n\n\t\t\t\t// add placeholder values (for inconsistent face definitions)\n\n\t\t\t\tthis.addDefaultUV();\n\n\t\t\t}\n\n\t\t},\n\n\t\taddPointGeometry: function ( vertices ) {\n\n\t\t\tthis.object.geometry.type = 'Points';\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tconst index = this.parseVertexIndex( vertices[ vi ], vLen );\n\n\t\t\t\tthis.addVertexPoint( index );\n\t\t\t\tthis.addColor( index );\n\n\t\t\t}\n\n\t\t},\n\n\t\taddLineGeometry: function ( vertices, uvs ) {\n\n\t\t\tthis.object.geometry.type = 'Line';\n\n\t\t\tconst vLen = this.vertices.length;\n\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tthis.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n\t\t\t}\n\n\t\t\tfor ( let uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {\n\n\t\t\t\tthis.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tstate.startObject( '', false );\n\n\treturn state;\n\n}\n\n//\n\nclass OBJLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.materials = null;\n\n\t}\n\n\tload( 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( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.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\tsetMaterials( materials ) {\n\n\t\tthis.materials = materials;\n\n\t\treturn this;\n\n\t}\n\n\tparse( text ) {\n\n\t\tconst state = new ParserState();\n\n\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t}\n\n\t\tif ( text.indexOf( '\\\\\\n' ) !== - 1 ) {\n\n\t\t\t// join lines separated by a line continuation character (\\)\n\t\t\ttext = text.replace( /\\\\\\n/g, '' );\n\n\t\t}\n\n\t\tconst lines = text.split( '\\n' );\n\t\tlet line = '', lineFirstChar = '';\n\t\tlet lineLength = 0;\n\t\tlet result = [];\n\n\t\t// Faster to just trim left side of the line. Use if available.\n\t\tconst trimLeft = ( typeof ''.trimLeft === 'function' );\n\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tline = lines[ i ];\n\n\t\t\tline = trimLeft ? line.trimLeft() : line.trim();\n\n\t\t\tlineLength = line.length;\n\n\t\t\tif ( lineLength === 0 ) continue;\n\n\t\t\tlineFirstChar = line.charAt( 0 );\n\n\t\t\t// @todo invoke passed in handler if any\n\t\t\tif ( lineFirstChar === '#' ) continue;\n\n\t\t\tif ( lineFirstChar === 'v' ) {\n\n\t\t\t\tconst data = line.split( /\\s+/ );\n\n\t\t\t\tswitch ( data[ 0 ] ) {\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tstate.vertices.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ( data.length >= 7 ) {\n\n\t\t\t\t\t\t\tstate.colors.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 4 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 5 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 6 ] )\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\t// if no colors are defined, add placeholders so color and vertex indices match\n\n\t\t\t\t\t\t\tstate.colors.push( undefined, undefined, undefined );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vn':\n\t\t\t\t\t\tstate.normals.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vt':\n\t\t\t\t\t\tstate.uvs.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'f' ) {\n\n\t\t\t\tconst lineData = line.substr( 1 ).trim();\n\t\t\t\tconst vertexData = lineData.split( /\\s+/ );\n\t\t\t\tconst faceVertices = [];\n\n\t\t\t\t// Parse the face vertex data into an easy to work with format\n\n\t\t\t\tfor ( let j = 0, jl = vertexData.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst vertex = vertexData[ j ];\n\n\t\t\t\t\tif ( vertex.length > 0 ) {\n\n\t\t\t\t\t\tconst vertexParts = vertex.split( '/' );\n\t\t\t\t\t\tfaceVertices.push( vertexParts );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n\t\t\t\tconst v1 = faceVertices[ 0 ];\n\n\t\t\t\tfor ( let j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {\n\n\t\t\t\t\tconst v2 = faceVertices[ j ];\n\t\t\t\t\tconst v3 = faceVertices[ j + 1 ];\n\n\t\t\t\t\tstate.addFace(\n\t\t\t\t\t\tv1[ 0 ], v2[ 0 ], v3[ 0 ],\n\t\t\t\t\t\tv1[ 1 ], v2[ 1 ], v3[ 1 ],\n\t\t\t\t\t\tv1[ 2 ], v2[ 2 ], v3[ 2 ]\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'l' ) {\n\n\t\t\t\tconst lineParts = line.substring( 1 ).trim().split( ' ' );\n\t\t\t\tlet lineVertices = [];\n\t\t\t\tconst lineUVs = [];\n\n\t\t\t\tif ( line.indexOf( '/' ) === - 1 ) {\n\n\t\t\t\t\tlineVertices = lineParts;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let li = 0, llen = lineParts.length; li < llen; li ++ ) {\n\n\t\t\t\t\t\tconst parts = lineParts[ li ].split( '/' );\n\n\t\t\t\t\t\tif ( parts[ 0 ] !== '' ) lineVertices.push( parts[ 0 ] );\n\t\t\t\t\t\tif ( parts[ 1 ] !== '' ) lineUVs.push( parts[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.addLineGeometry( lineVertices, lineUVs );\n\n\t\t\t} else if ( lineFirstChar === 'p' ) {\n\n\t\t\t\tconst lineData = line.substr( 1 ).trim();\n\t\t\t\tconst pointData = lineData.split( ' ' );\n\n\t\t\t\tstate.addPointGeometry( pointData );\n\n\t\t\t} else if ( ( result = _object_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t// o object_name\n\t\t\t\t// or\n\t\t\t\t// g group_name\n\n\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n\t\t\t\t// let name = result[ 0 ].substr( 1 ).trim();\n\t\t\t\tconst name = ( ' ' + result[ 0 ].substr( 1 ).trim() ).substr( 1 );\n\n\t\t\t\tstate.startObject( name );\n\n\t\t\t} else if ( _material_use_pattern.test( line ) ) {\n\n\t\t\t\t// material\n\n\t\t\t\tstate.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );\n\n\t\t\t} else if ( _material_library_pattern.test( line ) ) {\n\n\t\t\t\t// mtl file\n\n\t\t\t\tstate.materialLibraries.push( line.substring( 7 ).trim() );\n\n\t\t\t} else if ( _map_use_pattern.test( line ) ) {\n\n\t\t\t\t// the line is parsed but ignored since the loader assumes textures are defined MTL files\n\t\t\t\t// (according to https://www.okino.com/conv/imp_wave.htm, 'usemap' is the old-style Wavefront texture reference method)\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Rendering identifier \"usemap\" not supported. Textures must be defined in MTL files.' );\n\n\t\t\t} else if ( lineFirstChar === 's' ) {\n\n\t\t\t\tresult = line.split( ' ' );\n\n\t\t\t\t// smooth shading\n\n\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n\t\t\t\t// but does not define a usemtl for each face set.\n\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n\t\t\t\t// where explicit usemtl defines geometry groups.\n\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n\t\t\t\t/*\n\t\t\t\t\t * http://paulbourke.net/dataformats/obj/\n\t\t\t\t\t * or\n\t\t\t\t\t * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n\t\t\t\t\t *\n\t\t\t\t\t * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n\t\t\t\t\t * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n\t\t\t\t\t * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n\t\t\t\t\t * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n\t\t\t\t\t * than 0.\"\n\t\t\t\t\t */\n\t\t\t\tif ( result.length > 1 ) {\n\n\t\t\t\t\tconst value = result[ 1 ].trim().toLowerCase();\n\t\t\t\t\tstate.object.smooth = ( value !== '0' && value !== 'off' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// ZBrush can produce \"s\" lines #11707\n\t\t\t\t\tstate.object.smooth = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = state.object.currentMaterial();\n\t\t\t\tif ( material ) material.smooth = state.object.smooth;\n\n\t\t\t} else {\n\n\t\t\t\t// Handle null terminated files without exception\n\t\t\t\tif ( line === '\\0' ) continue;\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Unexpected line: \"' + line + '\"' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.finalize();\n\n\t\tconst container = new Group();\n\t\tcontainer.materialLibraries = [].concat( state.materialLibraries );\n\n\t\tconst hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 );\n\n\t\tif ( hasPrimitives === true ) {\n\n\t\t\tfor ( let i = 0, l = state.objects.length; i < l; i ++ ) {\n\n\t\t\t\tconst object = state.objects[ i ];\n\t\t\t\tconst geometry = object.geometry;\n\t\t\t\tconst materials = object.materials;\n\t\t\t\tconst isLine = ( geometry.type === 'Line' );\n\t\t\t\tconst isPoints = ( geometry.type === 'Points' );\n\t\t\t\tlet hasVertexColors = false;\n\n\t\t\t\t// Skip o/g line declarations that did not follow with any faces\n\t\t\t\tif ( geometry.vertices.length === 0 ) continue;\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) );\n\n\t\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\t\thasVertexColors = true;\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( geometry.colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.hasUVIndices === true ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Create materials\n\n\t\t\t\tconst createdMaterials = [];\n\n\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\tconst materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;\n\t\t\t\t\tlet material = state.materials[ materialHash ];\n\n\t\t\t\t\tif ( this.materials !== null ) {\n\n\t\t\t\t\t\tmaterial = this.materials.create( sourceMaterial.name );\n\n\t\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\n\t\t\t\t\t\tif ( isLine && material && ! ( material instanceof LineBasicMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialLine = new LineBasicMaterial();\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialLine, material );\n\t\t\t\t\t\t\tmaterialLine.color.copy( material.color );\n\t\t\t\t\t\t\tmaterial = materialLine;\n\n\t\t\t\t\t\t} else if ( isPoints && material && ! ( material instanceof PointsMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialPoints = new PointsMaterial( { size: 10, sizeAttenuation: false } );\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialPoints, material );\n\t\t\t\t\t\t\tmaterialPoints.color.copy( material.color );\n\t\t\t\t\t\t\tmaterialPoints.map = material.map;\n\t\t\t\t\t\t\tmaterial = materialPoints;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( material === undefined ) {\n\n\t\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\t\tmaterial = new LineBasicMaterial();\n\n\t\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\t\tmaterial = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaterial.name = sourceMaterial.name;\n\t\t\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? false : true;\n\t\t\t\t\t\tmaterial.vertexColors = hasVertexColors;\n\n\t\t\t\t\t\tstate.materials[ materialHash ] = material;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcreatedMaterials.push( material );\n\n\t\t\t\t}\n\n\t\t\t\t// Create mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tif ( createdMaterials.length > 1 ) {\n\n\t\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\t\tbuffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = object.name;\n\n\t\t\t\tcontainer.add( mesh );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// if there is only the default parser state object with no geometry data, interpret data as point cloud\n\n\t\t\tif ( state.vertices.length > 0 ) {\n\n\t\t\t\tconst material = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( state.vertices, 3 ) );\n\n\t\t\t\tif ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( state.colors, 3 ) );\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst points = new Points( buffergeometry, material );\n\t\t\t\tcontainer.add( points );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn container;\n\n\t}\n\n}\n\nexport { OBJLoader };\n","import { JSONLoader } from './JSONLoader';\nimport * as THREE from 'three';\nconst FileLoader = THREE.FileLoader;\n\nconst mergeGlyphData = (glyphData) => {\n const merge = (glyphData1, glyphData2) => {\n glyphData1.metadata.number_of_vertices += glyphData2.metadata.number_of_vertices;\n if ('labels' in glyphData1) {\n glyphData1.labels.push(...glyphData1.labels);\n }\n const fields = ['axis1', 'axis2', 'axis3', 'colors', 'positions', 'scale'];\n fields.forEach(field => {\n if (field in glyphData1) {\n Object.keys(glyphData1[field]).forEach((step) => {\n const len = glyphData2[field][step].length;\n for (let i = 0; i < len; i++) {\n glyphData1[field][step].push(glyphData2[field][step][i]);\n }\n });\n }\n });\n }\n\n if (glyphData && glyphData.length > 0) {\n while (glyphData.length > 1) {\n const glyphData2 = glyphData.splice(1,1);\n merge(glyphData[0], glyphData2[0]);\n }\n }\n}\n\nconst mergeGeometries = (geometries) => {\n const merge = (geometry1, geometry2) => {\n geometry1.merge(geometry2);\n }\n\n if (geometries && geometries.length > 0) {\n while (geometries.length > 1) {\n const geometry2 = geometries.splice(1,1);\n merge(geometries[0], geometry2[0]);\n }\n return geometries[0];\n }\n return undefined;\n}\n\nconst IndexedSourcesHandler = function(urlIn, crossOrigin, onDownloadedCallback) {\n const fileLoader = new FileLoader();\n const jsonLoader = new JSONLoader();\n fileLoader.crossOrigin = crossOrigin;\n const url = urlIn;\n const onDownloaded = onDownloadedCallback;\n let data = undefined;\n let downloading = false;\n let finished = false;\n let error = undefined;\n const items = [];\n\n const processItemDownloaded = (item) => {\n const modelData = data[item.index];\n if (modelData) {\n if (\"GlyphGeometriesURL\" in modelData) {\n item.onLoad(modelData);\n } else {\n let obj = jsonLoader.parse( modelData );\n item.onLoad(obj.geometry, obj.materials);\n }\n } else {\n processItemError(item, {responseURL: url});\n }\n }\n\n const processItemError = (item) => {\n if (item.onError) {\n if (!error) {\n error = {responseURL: url};\n }\n item.onError(error);\n }\n }\n\n this.downloadCompleted = (args) => {\n try {\n data = JSON.parse(args[0]);\n downloading = false;\n finished = true;\n if (Array.isArray(data)) {\n items.forEach(item => processItemDownloaded(item));\n } else {\n items.forEach(item => processItemError(item));\n }\n } catch {\n items.forEach(item => processItemError(item));\n }\n }\n\n const errorHandling = () => {\n return xhr => {\n error = xhr;\n finished = true;\n downloading = false;\n items.forEach((item) => {\n processItemError(item);\n });\n }\n }\n\n const progressHandling = () => {\n return xhr => {\n items.forEach((item) => {\n if (item.onProgress) {\n item.onProgress(xhr);\n }\n });\n }\n }\n\n this.load = (index, onLoad, onProgress, onError) => {\n const item = {\n index,\n onLoad,\n onProgress,\n onError,\n };\n if (finished) {\n if (data) {\n processItemDownloaded(item);\n } else {\n processItemError(error);\n }\n } else if (downloading) {\n //quene it up\n items.push(item);\n } else {\n items.push(item);\n downloading = true;\n fileLoader.load(url, onDownloaded, progressHandling, errorHandling);\n }\n }\n}\n\nconst MultiSourcesHandler = function(numberIn, onLoadCallback, options) {\n const allData = [];\n const number = numberIn;\n const onLoad = onLoadCallback;\n let totalDownloaded = 0;\n const isGlyphData = options.isGlyphsets;\n\n this.itemDownloaded = (order, args) => {\n allData[order]= args;\n totalDownloaded++;\n if (totalDownloaded == number) {\n if (allData.length > 0) {\n //Assume when item length is one then it is a glyphset otherwise geometry\n if (!isGlyphData) {\n const materials = allData[0][1];\n const geometries = allData.map((data) => data[0]);\n //All geometries will be merged into the first one\n const geometry = mergeGeometries(geometries);\n for (let i = 1; i < number; i++) {\n allData[order][0].dispose();\n allData[order][1].forEach((material) => material.dispose());\n }\n onLoad(geometry, materials);\n } else {\n const glyphData = allData.map((item) => {\n return JSON.parse(item[0])\n });\n mergeGlyphData(glyphData);\n onLoad(glyphData[0]);\n }\n }\n }\n }\n}\n\nconst PrimitivesLoader = function () {\n let concurrentDownloads = 0;\n const MAX_DOWNLOAD = 20;\n this.crossOrigin = \"Anonymous\";\n const jsonloader = new JSONLoader();\n const fileloader = new FileLoader();\n fileloader.crossOrigin = \"Anonymous\";\n const waitingList = [];\n //URL to loader pair\n const indexedLoaders = {};\n\n //Load the first file then the rest will be handled separately\n const loadFromMultipleSources = (urls, onLoad, onProgress, onError, options) => {\n const number = urls.length;\n const msHandler = new MultiSourcesHandler(number, onLoad, options);\n //The order here will give us hint on the sequence on merging the primitives\n let order = 0;\n urls.forEach((url) => {\n const newOptions = options ? {...options} : {};\n newOptions.msHandler = msHandler;\n newOptions.order = order;\n order++;\n loadFromSingleSource(url, onLoad, onProgress, onError, newOptions);\n });\n }\n\n const handleIndexedSource = (url, onLoad, onProgress, onError, options) => {\n const newOptions = options ? {...options} : {};\n let indexedLoader = indexedLoaders[url];\n if (!indexedLoader) {\n if (MAX_DOWNLOAD > concurrentDownloads) {\n const onLoadCallback = new onFinally(undefined, this, newOptions);\n ++concurrentDownloads;\n indexedLoader = new IndexedSourcesHandler(url, this.crossOrigin, onLoadCallback);\n indexedLoaders[url] = indexedLoader;\n } else {\n waitingList.push({\n url,\n onLoad,\n onProgress,\n onError,\n options,\n });\n }\n }\n if (indexedLoader) {\n newOptions.isHandler = indexedLoader;\n indexedLoader.load(options.index, onLoad, onProgress, onError);\n }\n }\n\n const loadFromSingleSource = (url, onLoad, onProgress, onError, options) => {\n if (options && (options.index !== undefined) ) {\n handleIndexedSource(url, onLoad, onProgress, onError, options);\n } else {\n //Standard loading\n if (MAX_DOWNLOAD > concurrentDownloads) {\n ++concurrentDownloads;\n const onLoadCallback = new onFinally(onLoad, this, options);\n const onErrorCallback = new onFinally(onError, this, options);\n if (!options.isGlyphsets) {\n jsonloader.crossOrigin = this.crossOrigin;\n jsonloader.load(url, onLoadCallback, onProgress, onErrorCallback);\n } else {\n fileloader.load(url, onLoadCallback, onProgress, onErrorCallback);\n }\n } else {\n waitingList.push({\n url,\n onLoad,\n onProgress,\n onError,\n options,\n });\n }\n }\n }\n\n this.load = (url, onLoad, onProgress, onError, options) => {\n if (Array.isArray(url)) {\n loadFromMultipleSources(url, onLoad, onProgress, onError, options);\n } else {\n loadFromSingleSource(url, onLoad, onProgress, onError, options);\n }\n }\n\n this.loadFromWaitingList = () => {\n while (MAX_DOWNLOAD > concurrentDownloads) {\n const item = waitingList.shift();\n if (item) {\n this.load(item.url, item.onLoad, item.onProgress, item.onError, item.options);\n } else {\n return;\n }\n }\n }\n\n this.itemRemainingCheck = () => {\n if (waitingList.length === 0 && concurrentDownloads === 0) {\n for (let key in indexedLoaders) {\n if (indexedLoaders.hasOwnProperty(key)) {\n delete indexedLoaders[key];\n }\n }\n }\n }\n\n const onFinally = function(callback, loader, options) {\n return (...args) => {\n --concurrentDownloads;\n if (options?.msHandler) {\n options.msHandler.itemDownloaded(options.order, args);\n } else if (options?.isHandler) {\n options.isHandler.downloadCompleted(args);\n } else {\n if (callback) {\n callback(...args);\n }\n }\n loader.loadFromWaitingList();\n loader.itemRemainingCheck();\n }\n }\n\n this.parse = data => {\n return loader.parse(data);\n }\n\n}\n\nexport { PrimitivesLoader };","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tLoaderUtils,\n\tVector3\n} from 'three';\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n * Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n * There is perhaps some question as to how valid it is to always assume little-endian-ness.\n * ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n * const loader = new STLLoader();\n * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n * scene.add( new THREE.Mesh( geometry ) );\n * });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n * // use the same code to load STL as above\n * if (geometry.hasColors) {\n * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n * } else { .... }\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n * const materials = [];\n * const nGeometryGroups = geometry.groups.length;\n *\n * const colorMap = ...; // Some logic to index colors.\n *\n * for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n * }\n *\n * materials.push(material);\n * const mesh = new THREE.Mesh(geometry, materials);\n */\n\n\nclass STLLoader 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 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( this.withCredentials );\n\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.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( data ) {\n\n\t\tfunction isBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 );\n\t\t\tconst n_faces = reader.getUint32( 80, true );\n\t\t\tconst expect = 80 + ( 32 / 8 ) + ( n_faces * face_size );\n\n\t\t\tif ( expect === reader.byteLength ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// An ASCII STL data must begin with 'solid ' as the first six bytes.\n\t\t\t// However, ASCII STLs lacking the SPACE after the 'd' are known to be\n\t\t\t// plentiful. So, check the first 5 bytes for 'solid'.\n\n\t\t\t// Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n\t\t\t// https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n\t\t\t// Search for \"solid\" to start anywhere after those prefixes.\n\n\t\t\t// US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n\t\t\tconst solid = [ 115, 111, 108, 105, 100 ];\n\n\t\t\tfor ( let off = 0; off < 5; off ++ ) {\n\n\t\t\t\t// If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n\t\t\t\tif ( matchDataViewAt( solid, reader, off ) ) return false;\n\n\t\t\t}\n\n\t\t\t// Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction matchDataViewAt( query, reader, offset ) {\n\n\t\t\t// Check if each byte in query matches the corresponding byte from the current offset\n\n\t\t\tfor ( let i = 0, il = query.length; i < il; i ++ ) {\n\n\t\t\t\tif ( query[ i ] !== reader.getUint8( offset + i, false ) ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction parseBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst faces = reader.getUint32( 80, true );\n\n\t\t\tlet r, g, b, hasColors = false, colors;\n\t\t\tlet defaultR, defaultG, defaultB, alpha;\n\n\t\t\t// process STL header\n\t\t\t// check for default color in header (\"COLOR=rgba\" sequence).\n\n\t\t\tfor ( let index = 0; index < 80 - 10; index ++ ) {\n\n\t\t\t\tif ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) {\n\n\t\t\t\t\thasColors = true;\n\t\t\t\t\tcolors = new Float32Array( faces * 3 * 3 );\n\n\t\t\t\t\tdefaultR = reader.getUint8( index + 6 ) / 255;\n\t\t\t\t\tdefaultG = reader.getUint8( index + 7 ) / 255;\n\t\t\t\t\tdefaultB = reader.getUint8( index + 8 ) / 255;\n\t\t\t\t\talpha = reader.getUint8( index + 9 ) / 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst dataOffset = 84;\n\t\t\tconst faceLength = 12 * 4 + 2;\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst vertices = new Float32Array( faces * 3 * 3 );\n\t\t\tconst normals = new Float32Array( faces * 3 * 3 );\n\n\t\t\tfor ( let face = 0; face < faces; face ++ ) {\n\n\t\t\t\tconst start = dataOffset + face * faceLength;\n\t\t\t\tconst normalX = reader.getFloat32( start, true );\n\t\t\t\tconst normalY = reader.getFloat32( start + 4, true );\n\t\t\t\tconst normalZ = reader.getFloat32( start + 8, true );\n\n\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\tconst packedColor = reader.getUint16( start + 48, true );\n\n\t\t\t\t\tif ( ( packedColor & 0x8000 ) === 0 ) {\n\n\t\t\t\t\t\t// facet has its own unique color\n\n\t\t\t\t\t\tr = ( packedColor & 0x1F ) / 31;\n\t\t\t\t\t\tg = ( ( packedColor >> 5 ) & 0x1F ) / 31;\n\t\t\t\t\t\tb = ( ( packedColor >> 10 ) & 0x1F ) / 31;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tr = defaultR;\n\t\t\t\t\t\tg = defaultG;\n\t\t\t\t\t\tb = defaultB;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 1; i <= 3; i ++ ) {\n\n\t\t\t\t\tconst vertexstart = start + i * 12;\n\t\t\t\t\tconst componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );\n\n\t\t\t\t\tvertices[ componentIdx ] = reader.getFloat32( vertexstart, true );\n\t\t\t\t\tvertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );\n\t\t\t\t\tvertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );\n\n\t\t\t\t\tnormals[ componentIdx ] = normalX;\n\t\t\t\t\tnormals[ componentIdx + 1 ] = normalY;\n\t\t\t\t\tnormals[ componentIdx + 2 ] = normalZ;\n\n\t\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\t\tcolors[ componentIdx ] = r;\n\t\t\t\t\t\tcolors[ componentIdx + 1 ] = g;\n\t\t\t\t\t\tcolors[ componentIdx + 2 ] = b;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\t\t\t\tgeometry.hasColors = true;\n\t\t\t\tgeometry.alpha = alpha;\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction parseASCII( data ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst patternSolid = /solid([\\s\\S]*?)endsolid/g;\n\t\t\tconst patternFace = /facet([\\s\\S]*?)endfacet/g;\n\t\t\tlet faceCounter = 0;\n\n\t\t\tconst patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source;\n\t\t\tconst patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' );\n\t\t\tconst patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' );\n\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\n\t\t\tconst normal = new Vector3();\n\n\t\t\tlet result;\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet startVertex = 0;\n\t\t\tlet endVertex = 0;\n\n\t\t\twhile ( ( result = patternSolid.exec( data ) ) !== null ) {\n\n\t\t\t\tstartVertex = endVertex;\n\n\t\t\t\tconst solid = result[ 0 ];\n\n\t\t\t\twhile ( ( result = patternFace.exec( solid ) ) !== null ) {\n\n\t\t\t\t\tlet vertexCountPerFace = 0;\n\t\t\t\t\tlet normalCountPerFace = 0;\n\n\t\t\t\t\tconst text = result[ 0 ];\n\n\t\t\t\t\twhile ( ( result = patternNormal.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tnormal.x = parseFloat( result[ 1 ] );\n\t\t\t\t\t\tnormal.y = parseFloat( result[ 2 ] );\n\t\t\t\t\t\tnormal.z = parseFloat( result[ 3 ] );\n\t\t\t\t\t\tnormalCountPerFace ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( ( result = patternVertex.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tvertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );\n\t\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\t\t\tvertexCountPerFace ++;\n\t\t\t\t\t\tendVertex ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// every face have to own ONE valid normal\n\n\t\t\t\t\tif ( normalCountPerFace !== 1 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the normal of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// each face have to own THREE valid vertices\n\n\t\t\t\t\tif ( vertexCountPerFace !== 3 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the vertices of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCounter ++;\n\n\t\t\t\t}\n\n\t\t\t\tconst start = startVertex;\n\t\t\t\tconst count = endVertex - startVertex;\n\n\t\t\t\tgeometry.addGroup( start, count, groupCount );\n\t\t\t\tgroupCount ++;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction ensureString( buffer ) {\n\n\t\t\tif ( typeof buffer !== 'string' ) {\n\n\t\t\t\treturn LoaderUtils.decodeText( new Uint8Array( buffer ) );\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction ensureBinary( buffer ) {\n\n\t\t\tif ( typeof buffer === 'string' ) {\n\n\t\t\t\tconst array_buffer = new Uint8Array( buffer.length );\n\t\t\t\tfor ( let i = 0; i < buffer.length; i ++ ) {\n\n\t\t\t\t\tarray_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian\n\n\t\t\t\t}\n\n\t\t\t\treturn array_buffer.buffer || array_buffer;\n\n\t\t\t} else {\n\n\t\t\t\treturn buffer;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// start\n\n\t\tconst binData = ensureBinary( data );\n\n\t\treturn isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) );\n\n\t}\n\n}\n\nexport { STLLoader };\n","import * as THREE from 'three';\nimport { mergeGeometries } from '../utilities';\nimport { ZincObject } from './zincObject';\n\n/**\n * Provides an object which stores lines.\n * This is created when a valid json file containing lines is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {TubeLines}\n */\nconst TubeLines = function () {\n ZincObject.call(this);\n this.isTubeLines = true;\n let dataIn = {};\n let geometryConfig = { radius: 1, radialSegments: 8, smooth: false };\n\n /**\n * Create the line segements using geometry and material.\n *\n * @param {THREE.Geomtry} geometryIn - Geometry of lines to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n this.createLineSegment = (geometryIn, materialIn, options) => {\n if (geometryIn && materialIn) {\n dataIn = { geometryIn, materialIn, options };\n const geometry = getTubeLinesGeometry(geometryIn.vertices);\n const material = new THREE.MeshStandardMaterial({ color: materialIn.color });\n const mesh = new THREE.Mesh(geometry, material);\n this.setMesh(mesh, options.localTimeEnabled, options.localMorphColour);\n }\n }\n\n /**\n * Set the width for the lines.\n *\n * @param {Number} width - Width of the lines.\n */\n\tthis.setWidth = width => {\n\t\tif (this.morph && this.morph.material) {\n\t\t\tthis.morph.material.linewidth = width;\n\t\t\tthis.morph.material.needsUpdate = true;\n\t\t}\n\t}\n\n /**\n * Set the opacity of this Geometry. This function will also set the transparent\n * according to the provided alpha value.\n *\n * @param {Number} alpah - Alpha value to set for this geometry,\n * can be any value between from 0 to 1.0.\n */\n this.setAlpha = function (alpha) {\n let mesh = this.getMorph();\n mesh.material.opacity = alpha;\n mesh.material.transparent = alpha < 1.0;\n mesh.material.depthWrite = alpha > 0.5;\n }\n\n /**\n * Set the wireframe mode for this geometry.\n * @param {Boolean} wireframe\n */\n this.setWireframe = (wireframe) => {\n let mesh = this.getMorph();\n mesh.material.wireframe = wireframe;\n }\n\n /**\n * Update tube radius/radialSegments value\n *\n * @param {Float} radius The radius of the tube.\n * @param {Integer} radialSegments The number of segments that make up the cross-section.\n */\n this.setTubeLines = (radius, radialSegments) => {\n if (radius && radialSegments) {\n const { geometryIn } = dataIn;\n let mesh = this.getMorph();\n mesh.geometry.dispose();\n\n geometryConfig = Object.assign(geometryConfig, { radius, radialSegments });\n mesh.geometry = getTubeLinesGeometry(geometryIn.vertices);\n }\n }\n\n /**\n * Get merged geometry from list of geometry vertices\n *\n * @param {Array} vertices - An array of THREE.Vector3 vertices.\n * @returns {Object}\n */\n const getTubeLinesGeometry = (vertices) => {\n const { radius, radialSegments, smooth } = geometryConfig;\n let finalGeometry;\n if (smooth) {\n const curve = new THREE.CatmullRomCurve3(vertices);\n finalGeometry = new THREE.TubeGeometry(curve, vertices.length, radius, radialSegments, false);\n } else {\n const geometries = [];\n for (let i = 0; i + 1 < vertices.length; i = i + 2) {\n const curve = new THREE.LineCurve3(vertices[i], vertices[i+1]);\n const tubeGeometry = new THREE.TubeGeometry(curve, 1, radius, radialSegments, false);\n geometries.push(tubeGeometry);\n }\n finalGeometry = mergeGeometries(geometries, true);\n geometries.forEach(g => g.dispose());\n }\n return finalGeometry;\n }\n}\n\nTubeLines.prototype = Object.create(ZincObject.prototype);\nexport { TubeLines };\n","import * as THREE from 'three';\nimport { GLTFToZincJSLoader } from './loaders/GLTFToZincJSLoader';\nimport { OBJLoader } from './loaders/OBJLoader';\nimport { PrimitivesLoader } from './loaders/primitivesLoader';\nimport { STLLoader } from './loaders/STLLoader';\nimport { Geometry } from './primitives/geometry';\nimport { Glyphset } from './primitives/glyphset';\nimport { Lines } from './primitives/lines';\nimport { Pointset } from './primitives/pointset';\nimport { TextureSlides } from './primitives/textureSlides';\nimport { TubeLines } from './primitives/tubeLines';\nimport { createNewURL, isRegionGroup, resolveURL } from './utilities';\nimport Zinc from './zinc';\n\n/**\n * A helper class to help with reading / importing primitives and\n * settings into a {@link Scene}.\n *\n * @class\n * @param {Object} containerIn - Container to create the renderer on.\n * @author Alan Wu\n * @return {SceneLoader}\n */\nconst SceneLoader = function (sceneIn) {\n const scene = sceneIn;\n this.toBeDownloaded = 0;\n this.progressMap = {};\n let viewLoaded = false;\n let errorDownload = false;\n const primitivesLoader = new PrimitivesLoader();\n /**\n * This function returns a three component array, which contains\n * [totalsize, totalLoaded and errorDownload] of all the downloads happening\n * in this scene.\n * @returns {Array}\n */\n this.getDownloadProgress = () => {\n let totalSize = 0;\n let totalLoaded = 0;\n let unknownFound = false;\n\n for (const key in this.progressMap) {\n const progress = this.progressMap[key];\n\n totalSize += progress[1];\n totalLoaded += progress[0];\n\n if (progress[1] == 0)\n unknownFound = true;\n }\n if (unknownFound) {\n totalSize = 0;\n }\n return [ totalSize, totalLoaded, errorDownload ];\n }\n\n //Stores the current progress of downloads\n this.onProgress = id => {\n return xhr => {\n this.progressMap[id] = [ xhr.loaded, xhr.total ];\n };\n }\n\n this.onError = finishCallback => {\n return xhr => {\n this.toBeDownloaded = this.toBeDownloaded - 1;\n errorDownload = true;\n console.error(`There is an issue with external resource ${xhr?.responseURL ? \": \" + xhr?.responseURL: \"\"}.`);\n const payload = {\n type: \"Error\",\n xhr\n };\n if (finishCallback) {\n finishCallback(payload);\n }\n }\n };\n\n let loadMultipleViews = (referenceURL, views) => {\n const defaultView = views.Default;\n if (views.Inline) {\n scene.setupMultipleViews(defaultView, views.Entries);\n } else {\n const promises = [];\n for (const [key, value] of Object.entries(views.Entries)) {\n if (referenceURL) {\n newURL = createNewURL(value, referenceURL);\n promises.push(new Promise((resolve, reject) => {\n // Add parameters if we are sent them\n fetch(newURL)\n .then(response => response.json())\n .then(data => resolve({key: key, data: data}))\n .catch(data => reject(data));\n }));\n }\n }\n Promise.all(promises)\n .then(values => {\n const entries = {};\n values.forEach(entry => {\n entries[entry.key] = entry.data;\n });\n scene.setupMultipleViews(defaultView, entries);\n let zincCameraControls = scene.getZincCameraControls();\n if (zincCameraControls)\n zincCameraControls.setCurrentViewport(defaultView);\n viewLoaded = true;\n });\n }\n }\n\n /**\n * Load the viewport from an external location provided by the url.\n * @param {String} URL - address to the file containing viewport information.\n */\n this.loadViewURL = (url, finishCallback) => {\n this.toBeDownloaded += 1;\n const xmlhttp = new XMLHttpRequest();\n xmlhttp.onreadystatechange = () => {\n if (xmlhttp.readyState == 4) {\n if(xmlhttp.status == 200) {\n const viewData = JSON.parse(xmlhttp.responseText);\n scene.setupMultipleViews(\"default\", { \"default\" : viewData });\n scene.resetView();\n viewLoaded = true;\n --this.toBeDownloaded;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback();\n } else {\n (this.onError(finishCallback))({responseURL: url});\n }\n }\n }\n const requestURL = resolveURL(url);\n xmlhttp.open(\"GET\", requestURL, true);\n xmlhttp.send();\n }\n\n/**\n * Load a legacy model(s) format with the provided URLs and parameters. This only loads the geometry\n * without any of the metadata. Therefore, extra parameters should be provided.\n *\n * @deprecated\n */\n this.loadModelsURL = (region, urls, colours, opacities, timeEnabled, morphColour, finishCallback) => {\n const number = urls.length;\n this.toBeDownloaded += number;\n for (let i = 0; i < number; i++) {\n const filename = urls[i];\n let colour = Zinc.defaultMaterialColor;\n let opacity = Zinc.defaultOpacity;\n if (colours != undefined && colours[i] != undefined)\n colour = colours[i] ? true : false;\n if (opacities != undefined && opacities[i] != undefined)\n opacity = opacities[i];\n let localTimeEnabled = 0;\n if (timeEnabled != undefined && timeEnabled[i] != undefined)\n localTimeEnabled = timeEnabled[i] ? true : false;\n let localMorphColour = 0;\n if (morphColour != undefined && morphColour[i] != undefined)\n localMorphColour = morphColour[i] ? true : false;\n primitivesLoader.load(resolveURL(filename), meshloader(region, colour, opacity, localTimeEnabled, localMorphColour, undefined, undefined,\n undefined, undefined, finishCallback), this.onProgress(filename), this.onError(finishCallback));\n }\n }\n\n /**\n * Load a legacy file format containing the viewport and its meta file from an external\n * location provided by the url. Use the new metadata format with\n * {@link Zinc.SceneLoader.#loadMetadataURL} instead.\n *\n * @param {String} URL - address to the file containing viewport and model information.\n * @deprecated\n */\n this.loadFromViewURL = (targetRegion, jsonFilePrefix, finishCallback) => {\n const xmlhttp = new XMLHttpRequest();\n xmlhttp.onreadystatechange = () => {\n if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {\n const viewData = JSON.parse(xmlhttp.responseText);\n scene.loadView(viewData);\n const urls = [];\n const filename_prefix = jsonFilePrefix + \"_\";\n for (let i = 0; i < viewData.numberOfResources; i++) {\n const filename = filename_prefix + (i + 1) + \".json\";\n urls.push(filename);\n }\n this.loadModelsURL(targetRegion, urls, viewData.colour, viewData.opacity, viewData.timeEnabled, viewData.morphColour, finishCallback);\n }\n }\n const requestURL = resolveURL(jsonFilePrefix + \"_view.json\");\n xmlhttp.open(\"GET\", requestURL, true);\n xmlhttp.send();\n }\n\n //Internal loader for a regular zinc geometry.\n const linesloader = (region, localTimeEnabled, localMorphColour, groupName,\n anatomicalId, renderOrder, lod, tubeLines, finishCallback) => {\n return (geometry, materials) => {\n const newLines = tubeLines ? new TubeLines() : new Lines();\n let material = undefined;\n if (materials && materials[0]) {\n material = new THREE.LineBasicMaterial({color:materials[0].color.clone()});\n if (1.0 > materials[0].opacity) {\n material.transparent = true;\n }\n material.opacity = materials[0].opacity;\n material.morphTargets = localTimeEnabled;\n material.vertexColors = materials[0].vertexColors;\n }\n let options = {};\n options.localTimeEnabled = localTimeEnabled;\n options.localMorphColour = localMorphColour;\n if (newLines) {\n newLines.createLineSegment(geometry, material, options);\n newLines.setName(groupName);\n newLines.setAnatomicalId(anatomicalId);\n newLines.setRenderOrder(renderOrder);\n region.addZincObject(newLines);\n newLines.setDuration(scene.getDuration());\n if (lod && lod.levels) {\n for (const [key, value] of Object.entries(lod.levels)) {\n newLines.addLOD(primitivesLoader, key, value.URL, value.Index, lod.preload);\n }\n }\n }\n --this.toBeDownloaded;\n geometry.dispose();\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newLines);\n };\n }\n\n /**\n * Load lines into this scene object.\n *\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadLinesURL = (region, url, timeEnabled, morphColour, groupName, finishCallback, options) => {\n\t let localTimeEnabled = 0;\n this.toBeDownloaded += 1;\n let isInline = options?.isInline ? options.isInline : false;\n let anatomicalId = options?.anatomicalId ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n\t if (timeEnabled != undefined)\n\t\t localTimeEnabled = timeEnabled ? true : false;\n\t let localMorphColour = 0;\n\t if (morphColour != undefined)\n\t\t localMorphColour = morphColour ? true : false;\n let tubeLines = options.tubeLines && !localTimeEnabled && !localMorphColour;\n if (isInline) {\n let object = primitivesLoader.parse( url );\n (linesloader(region, localTimeEnabled, localMorphColour, groupName, anatomicalId,\n renderOrder, options.lod, tubeLines, finishCallback))( object.geometry, object.materials );\n } else {\n primitivesLoader.load(url, linesloader(region, localTimeEnabled, localMorphColour, groupName,\n anatomicalId, renderOrder, options.lod, tubeLines, finishCallback), this.onProgress(url), this.onError(finishCallback),\n options.loaderOptions);\n }\n }\n\n const glyphsetloader = (region, glyphurl, groupName, finishCallback, options) => {\n return (data) => {\n let glyphsetData = data;\n if (typeof glyphsetData === 'string' || glyphsetData instanceof String) {\n glyphsetData = JSON.parse(data);\n }\n let isInline = (options && options.isInline) ? options.isInline : undefined;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let displayLabels = (options && options.displayLabels) ? options.displayLabels : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n const newGlyphset = new Glyphset();\n newGlyphset.setDuration(scene.getDuration());\n newGlyphset.groupName = groupName;\n let myCallback = () => {\n --this.toBeDownloaded;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newGlyphset);\n }\n ++this.toBeDownloaded;\n if (isInline) {\n newGlyphset.load(glyphsetData, glyphurl, myCallback, isInline, displayLabels);\n }\n else {\n newGlyphset.load(glyphsetData, resolveURL(glyphurl), myCallback, isInline, displayLabels);\n }\n newGlyphset.setAnatomicalId(anatomicalId);\n newGlyphset.setRenderOrder(renderOrder);\n region.addZincObject(newGlyphset);\n }\n };\n\n //Load a glyphset into this scene.\n const onLoadGlyphsetReady = (region, xmlhttp, glyphurl, groupName, finishCallback, options) => {\n return () => {\n if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {\n let glyphsetData = JSON.parse(xmlhttp.responseText);\n if (Array.isArray(glyphsetData)) {\n const index = options?.loaderOptions?.index;\n if (index !== undefined) {\n if (glyphsetData.length > index) {\n glyphsetData = glyphsetData[index];\n }\n }\n }\n (glyphsetloader(region, glyphurl, groupName, finishCallback, options))(glyphsetData);\n }\n };\n };\n\n /**\n * Load a glyphset into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {String} glyphurl - regular json model file providing geometry of the glyph.\n * @param {String} groupName - name to assign the glyphset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadGlyphsetURL = (region, metaurl, glyphurl, groupName, finishCallback, options) => {\n const isInline = (options && options.isInline) ? options.isInline : false;\n if (isInline) {\n (glyphsetloader(region, glyphurl, groupName, finishCallback, options))(metaurl);\n } else {\n primitivesLoader.load(metaurl, glyphsetloader(region, glyphurl, groupName,\n finishCallback, options), this.onProgress(metaurl),\n this.onError(finishCallback), options.loaderOptions);\n\n /*\n const xmlhttp = new XMLHttpRequest();\n\n xmlhttp.onreadystatechange = onLoadGlyphsetReady(region, xmlhttp, glyphurl,\n groupName, finishCallback, options);\n xmlhttp.open(\"GET\", resolveURL(metaurl), true);\n xmlhttp.send();*/\n }\n }\n\n //Internal loader for zinc pointset.\n const pointsetloader = (region, localTimeEnabled, localMorphColour, groupName, anatomicalId, renderOrder, finishCallback) => {\n return (geometry, materials) => {\n const newPointset = new Pointset();\n let material = new THREE.PointsMaterial({ alphaTest: 0.5, size: 10, sizeAttenuation: false });\n if (materials && materials[0]) {\n if (1.0 > materials[0].opacity) {\n material.transparent = true;\n }\n material.opacity = materials[0].opacity;\n material.color = materials[0].color;\n material.morphTargets = localTimeEnabled;\n material.vertexColors = materials[0].vertexColors;\n }\n let options = {};\n options.localTimeEnabled = localTimeEnabled;\n options.localMorphColour = localMorphColour;\n if (newPointset) {\n newPointset.createMesh(geometry, material, options);\n newPointset.setName(groupName);\n newPointset.setAnatomicalId(anatomicalId);\n region.addZincObject(newPointset);\n newPointset.setDuration(scene.getDuration());\n newPointset.setRenderOrder(renderOrder);\n }\n geometry.dispose();\n --this.toBeDownloaded;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newPointset);\n };\n }\n\n /**\n * Read a STL file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the STL geometry is succssfully loaded.\n */\n this.loadSTL = (region, url, groupName, finishCallback) => {\n this.toBeDownloaded += 1;\n const colour = Zinc.defaultMaterialColor;\n const opacity = Zinc.defaultOpacity;\n const loader = new STLLoader();\n loader.crossOrigin = \"Anonymous\";\n loader.load(resolveURL(url), meshloader(region, colour, opacity, false,\n false, groupName, undefined, undefined, undefined, finishCallback));\n }\n\n /**\n * Read a OBJ file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the OBJ geometry is succssfully loaded.\n */\n this.loadOBJ = (region, url, groupName, finishCallback) => {\n this.toBeDownloaded += 1;\n const colour = Zinc.defaultMaterialColor;\n const opacity = Zinc.defaultOpacity;\n const loader = new OBJLoader();\n loader.crossOrigin = \"Anonymous\";\n loader.load(resolveURL(url), meshloader(region, colour, opacity, false,\n false, groupName, undefined, undefined, undefined, finishCallback));\n }\n\n /**\n * Load a geometry into this scene, this is a subsequent called from\n * {@link Zinc.Scene#loadMetadataURL}, although it can be used to read\n * in geometry into the scene externally.\n *\n * @param {String} url - regular json model file providing geometry.\n * @param {Boolean} timeEnabled - Indicate if geometry morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {STRING} fileFormat - name supported formats are STL, OBJ and JSON.\n * @param {Function} finishCallback - Callback function which will be called\n * once the geometry is succssfully loaded in.\n */\n const loadSurfaceURL = (region ,url, timeEnabled, morphColour, groupName, finishCallback, options) => {\n this.toBeDownloaded += 1;\n const colour = Zinc.defaultMaterialColor;\n const opacity = Zinc.defaultOpacity;\n let localTimeEnabled = 0;\n let isInline = (options && options.isInline) ? options.isInline : false;\n let fileFormat = (options && options.fileFormat) ? options.fileFormat : undefined;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n if (timeEnabled != undefined)\n localTimeEnabled = timeEnabled ? true : false;\n let localMorphColour = 0;\n if (morphColour != undefined)\n localMorphColour = morphColour ? true : false;\n let loader = primitivesLoader;\n if (fileFormat !== undefined) {\n if (fileFormat == \"STL\") {\n loader = new STLLoader();\n } else if (fileFormat == \"OBJ\") {\n loader = new OBJLoader();\n loader.crossOrigin = \"Anonymous\";\n loader.load(url, objloader(region, colour, opacity, localTimeEnabled,\n localMorphColour, groupName, anatomicalId, finishCallback), this.onProgress(url), this.onError,\n options.loaderOptions);\n return;\n }\n }\n if (isInline) {\n const object = primitivesLoader.parse( url );\n\t\t\t(meshloader(region, colour, opacity, localTimeEnabled,\n localMorphColour, groupName, anatomicalId, renderOrder, options, finishCallback))( object.geometry, object.materials );\n } else {\n loader.crossOrigin = \"Anonymous\";\n primitivesLoader.load(url, meshloader(region, colour, opacity, localTimeEnabled,\n localMorphColour, groupName, anatomicalId, renderOrder, options, finishCallback),\n this.onProgress(url), this.onError(finishCallback), options.loaderOptions);\n }\n };\n\n //Object to keep track of number of items downloaded and when all items are downloaded\n //allCompletedCallback is called\n const metaFinishCallback = function (numberOfDownloaded, finishCallback, allCompletedCallback) {\n let downloadedItem = 0;\n return zincObject => {\n downloadedItem = downloadedItem + 1;\n if (zincObject && (finishCallback != undefined) && (typeof finishCallback == 'function')) {\n finishCallback(zincObject);\n }\n if (downloadedItem == numberOfDownloaded) {\n if (viewLoaded === false)\n scene.viewAll();\n if (allCompletedCallback != undefined && (typeof allCompletedCallback == 'function')) {\n allCompletedCallback();\n let zincCameraControls = scene.getZincCameraControls();\n if (zincCameraControls) {\n zincCameraControls.calculateMaxAllowedDistance(scene);\n }\n }\n }\n };\n };\n\n /**\n * Load a pointset into this scene object.\n *\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadPointsetURL = (region, url, timeEnabled, morphColour, groupName, finishCallback, options) => {\n let localTimeEnabled = 0;\n this.toBeDownloaded += 1;\n if (timeEnabled != undefined)\n localTimeEnabled = timeEnabled ? true : false;\n let localMorphColour = 0;\n if (morphColour != undefined)\n localMorphColour = morphColour ? true : false;\n let isInline = (options && options.isInline) ? options.isInline : false;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n if (isInline) {\n const object = primitivesLoader.parse( url );\n (pointsetloader(region, localTimeEnabled, localMorphColour, groupName,\n anatomicalId, renderOrder, finishCallback))(object.geometry, object.materials );\n } else {\n primitivesLoader.load(url, pointsetloader(region, localTimeEnabled, localMorphColour,\n groupName, anatomicalId, renderOrder, finishCallback),\n this.onProgress(url), this.onError(finishCallback), options.loaderOptions);\n }\n }\n\n const loadTexture = (region, referenceURL, textureData, groupName, finishCallback, options) => {\n let isInline = (options && options.isInline) ? options.isInline : undefined;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n let newTexture = undefined;\n if (textureData) {\n if (referenceURL && textureData.images && textureData.images.source) {\n const source = textureData.images.source;\n for (let i = 0; i < source.length; i++) {\n const newURL = createNewURL(source[i], referenceURL);\n textureData.images.source[i] = newURL;\n }\n }\n if (textureData.type === \"slides\") {\n newTexture = new TextureSlides();\n }\n if (newTexture) {\n newTexture.groupName = groupName;\n let myCallback = () => {\n //Add zincObject after it has sort out all the required download\n region.addZincObject(newTexture);\n --this.toBeDownloaded;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newTexture);\n }\n ++this.toBeDownloaded;\n newTexture.load(textureData, myCallback, isInline);\n newTexture.setAnatomicalId(anatomicalId);\n newTexture.setRenderOrder(renderOrder);\n }\n }\n };\n\n\n //Load a glyphset into this scene.\n const onLoadTextureReady = (region, xmlhttp, groupName, finishCallback, options) => {\n return () => {\n if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {\n const textureData = JSON.parse(xmlhttp.responseText);\n loadTexture(region, xmlhttp.responseURL, textureData, groupName, finishCallback, options);\n }\n };\n };\n\n /**\n * Load a texture into this scene object.\n *\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadTextureURL = (region, url, groupName, finishCallback, options) => {\n const isInline = (options && options.isInline) ? options.isInline : false;\n if (isInline) {\n loadTexture(region, undefined, url, groupName, finishCallback, options);\n } else {\n const xmlhttp = new XMLHttpRequest();\n xmlhttp.onreadystatechange = onLoadTextureReady(region, xmlhttp,\n groupName, finishCallback, options);\n xmlhttp.open(\"GET\", resolveURL(url), true);\n xmlhttp.send();\n }\n }\n\n /**\n * Add a user provided {THREE.Geometry} into the scene as zinc geometry.\n *\n * @param {Three.Geometry} geometry - The threejs geometry to be added as {@link Zinc.Geometry}.\n * @param {THREE.Color} color - Colour to be assigned to this geometry, overrided if materialIn is provided.\n * @param {Number} opacity - Opacity to be set for this geometry, overrided if materialIn is provided.\n * @param {Boolean} localTimeEnabled - Set this to true if morph geometry is present, overrided if materialIn is provided.\n * @param {Boolean} localMorphColour - Set this to true if morph colour is present, overrided if materialIn is provided.\n * @param {Boolean} external - Set this to true if morph geometry is present, overrided if materialIn is provided.\n * @param {Function} finishCallback - Callback once the geometry has been added succssfully.\n * @param {THREE.Material} materialIn - Material to be set for this geometry if it is present.\n *\n * @returns {Zinc.Geometry}\n */\n const addZincGeometry = (\n region,\n geometryIn,\n colour,\n opacity,\n localTimeEnabled,\n localMorphColour,\n finishCallback,\n materialIn,\n groupName,\n renderOrder,\n anatomicalId\n ) => {\n let options = {};\n options.colour = colour;\n options.opacity = opacity;\n options.localTimeEnabled = localTimeEnabled;\n options.localMorphColour = localMorphColour\n const newGeometry = new Geometry();\n newGeometry.createMesh(geometryIn, materialIn, options);\n if (newGeometry.getMorph()) {\n newGeometry.setName(groupName);\n newGeometry.setRenderOrder(renderOrder);\n newGeometry.setAnatomicalId(anatomicalId);\n if (region) region.addZincObject(newGeometry);\n newGeometry.setDuration(scene.getDuration());\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newGeometry);\n if (newGeometry.videoHandler)\n scene.setVideoHandler(newGeometry.videoHandler);\n return newGeometry;\n }\n return undefined;\n }\n\n //Internal loader for a regular zinc geometry.\n const meshloader = (\n region,\n colour,\n opacity,\n localTimeEnabled,\n localMorphColour,\n groupName,\n anatomicalId,\n renderOrder,\n options,\n finishCallback\n ) => {\n return (geometry, materials) => {\n let material = undefined;\n if (materials && materials[0]) {\n material = materials[0];\n }\n const zincGeometry = addZincGeometry(region, geometry, colour, opacity,\n localTimeEnabled, localMorphColour, undefined, material, groupName, renderOrder, anatomicalId);\n if (options.lod && options.lod.levels) {\n for (const [key, value] of Object.entries(options.lod.levels)) {\n zincGeometry.addLOD(primitivesLoader, key, value.URL, value.Index, options.lod.preload);\n }\n }\n --this.toBeDownloaded;\n geometry.dispose();\n if (finishCallback != undefined && (typeof finishCallback == 'function')) {\n finishCallback(zincGeometry);\n }\n };\n }\n\n //Turn ISO 8601 duration string into an array.\n const parseDuration = (durationString) => {\n const regex = /P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?$/;\n const [, years, months, weeks, days, hours, mins, secs] =\n durationString.match(regex);\n return {years: years,months: months, weeks: weeks, days: days,\n hours: hours, mins: mins, secs: secs };\n }\n\n //Load settings from metadata item.\n this.loadSettings = (item) => {\n if (item) {\n //duration uses the ISO 8601 standard - PnYnMnDTnHnMnS\n if (item.Duration) {\n const duration = parseDuration(item.Duration);\n scene.setDurationFromObject(duration);\n }\n if (item.OriginalDuration) {\n const duration = parseDuration(item.OriginalDuration);\n scene.setOriginalDurationFromObject(duration);\n }\n if (item.TimeStamps) {\n for (const key in item.TimeStamps) {\n const time = parseDuration(item.TimeStamps[key]);\n scene.addMetadataTimeStamp(key, time);\n }\n }\n }\n }\n\n //Function to process each of the graphical metadata item except for view and\n //settings.\n const readPrimitivesItem = (region, referenceURL, item, order, finishCallback) => {\n if (item) {\n let newURL = undefined;\n let isInline = false;\n if (item.URL) {\n //Convert it into an array\n newURL = item.URL;\n if (referenceURL)\n newURL = createNewURL(newURL, referenceURL);\n } else if (item.Inline) {\n newURL = item.Inline.URL;\n isInline = true;\n }\n const lod = {};\n if (item.LOD && item.LOD.Levels) {\n lod.preload = item.LOD.Preload ? true : false;\n lod.levels = {};\n for (const [key, value] of Object.entries(item.LOD.Levels)) {\n lod.levels[key] = {};\n lod.levels[key][\"URL\"] = createNewURL(value.URL, referenceURL);\n lod.levels[key][\"Index\"] = value.Index;\n }\n }\n let groupName = item.GroupName;\n if (groupName === undefined || groupName === \"\") {\n groupName = \"_Unnamed\";\n }\n\n let options = {\n loaderOptions: {\n index: item.Index,\n },\n isInline: isInline,\n fileFormat: item.FileFormat,\n anatomicalId: item.AnatomicalId,\n compression: item.compression,\n tubeLines: item.tubeLines,\n lod: lod,\n renderOrder: order\n };\n\n switch (item.Type) {\n case \"Surfaces\":\n loadSurfaceURL(region, newURL, item.MorphVertices, item.MorphColours, groupName, finishCallback, options);\n break;\n case \"Glyph\":\n let newGeometryURL = undefined;\n if (!isInline) {\n newGeometryURL = item.GlyphGeometriesURL;\n newGeometryURL = createNewURL(item.GlyphGeometriesURL, referenceURL);\n } else {\n newGeometryURL = item.Inline.GlyphGeometriesURL;\n }\n if (item.DisplayLabels) {\n options.displayLabels = true;\n }\n options.loaderOptions.isGlyphsets = true;\n this.loadGlyphsetURL(region, newURL, newGeometryURL, groupName, finishCallback, options);\n break;\n case \"Points\":\n this.loadPointsetURL(region, newURL, item.MorphVertices, item.MorphColours, groupName, finishCallback, options);\n break;\n case \"Lines\":\n this.loadLinesURL(region, newURL, item.MorphVertices, item.MorphColours, groupName, finishCallback, options);\n break;\n case \"Texture\":\n this.loadTextureURL(region, newURL, groupName, finishCallback, options);\n break;\n default:\n break;\n }\n }\n };\n\n //Function to read the view item first\n const readViewAndSettingsItem = (referenceURL, item, finishCallback) => {\n if (item) {\n let newURL = undefined;\n let isInline = false;\n if (item.URL) {\n newURL = item.URL;\n if (referenceURL)\n newURL = createNewURL(item.URL, referenceURL);\n } else if (item.Inline) {\n newURL = item.Inline.URL;\n isInline = true;\n }\n switch (item.Type) {\n case \"View\":\n if (isInline) {\n scene.setupMultipleViews(\"default\", { \"default\" : newURL});\n viewLoaded = true;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback();\n }\n else\n this.loadViewURL(newURL, finishCallback);\n break;\n case \"Settings\":\n this.loadSettings(item);\n break;\n default:\n break;\n }\n }\n };\n\n /**\n * Load GLTF into this scene object.\n *\n * @param {String} url - URL to the GLTF file\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadGLTF = (region, url, finishCallback, allCompletedCallback, options) => {\n const loader = new GLTFToZincJSLoader();\n loader.load(scene, region, url, finishCallback, allCompletedCallback, options);\n }\n\n let loadRegions = (currentRegion, referenceURL, regions, callback) => {\n if (regions.Primitives) {\n regions.Primitives.forEach(primitive => {\n let order = 1;\n if (primitive.Order)\n order = primitive.Order;\n readPrimitivesItem(currentRegion, referenceURL, primitive, order, callback);\n });\n }\n if (regions.Transformation) {\n currentRegion.setTransformation(regions.Transformation);\n }\n if (regions.Children) {\n for (const [regionName, value] of Object.entries(regions.Children)) {\n const childRegion = currentRegion.findOrCreateChildFromPath(regionName);\n if (childRegion) {\n loadRegions(childRegion, referenceURL, value, callback);\n }\n }\n }\n }\n\n let supplementPrimitivesArray = (array, options) => {\n let newArray = array;\n const include = options?.enabled?.include;\n const exclude = options?.enabled?.exclude;\n const tubeLines = options?.tubeLines;\n if (include?.length || exclude?.length) {\n if (include) {\n newArray = array.filter((item) => {\n if (item.Type === \"View\") {\n return true;\n }\n for (let i = 0; i < include.length; i++) {\n if (isRegionGroup(item.RegionPath, item.GroupName, include[i])) {\n return true;\n }\n }\n return false;\n });\n }\n if (exclude) {\n newArray = newArray.filter((item) => {\n if (item.Type === \"View\") {\n return true;\n }\n for (let i = 0; i < exclude.length; i++) {\n if (isRegionGroup(item.RegionPath, item.GroupName, exclude[i])) {\n return false;\n }\n }\n return true;\n });\n }\n }\n if (tubeLines) {\n newArray.forEach((item) => {\n if (item.Type === \"Lines\") {\n item.tubeLines = true;\n }\n });\n }\n return newArray;\n }\n\n let supplementMetadataInArray = (metadata, options) => {\n if (Array.isArray(metadata)) {\n return supplementPrimitivesArray(metadata, options);\n }\n return metadata;\n }\n\n let getNumberOfDownloadsInArray = (array, includeViews) => {\n if (Array.isArray(array)) {\n let count = 0;\n for (let i = 0; i < array.length; i++) {\n if (array[i].Type && (\n (includeViews && array[i].Type === \"View\") ||\n array[i].Type === \"Surfaces\" ||\n array[i].Type === \"Glyph\" ||\n array[i].Type === \"Points\" ||\n array[i].Type === \"Lines\" ||\n array[i].Type === \"Texture\"))\n {\n count++;\n }\n }\n return count;\n }\n return 0;\n }\n\n let getNumberOfObjectsInRegions = (regionJson) => {\n let counts = regionJson.Primitives ?\n getNumberOfDownloadsInArray(regionJson.Primitives, false) : 0;\n if (regionJson.Children) {\n Object.values(regionJson.Children).forEach(childRegion => {\n counts += getNumberOfObjectsInRegions(childRegion);\n });\n }\n return counts;\n }\n\n let getNumberOfObjects = (metadata) => {\n if (Array.isArray(metadata)) {\n return getNumberOfDownloadsInArray(metadata, true);\n } else if ((typeof metadata) === \"object\" && metadata !== null) {\n if (metadata.Version === \"2.0\") {\n return getNumberOfObjectsInRegions(metadata.Regions);\n }\n }\n }\n\n let readVersionOneRegionPath = (region, referenceURL, item, order, callback) => {\n let targetRegion = region;\n if (item.RegionPath && item.RegionPath !== \"\") {\n targetRegion = region.findOrCreateChildFromPath(item.RegionPath);\n }\n //Render order is set to i * 2 to account for front and back rendering\n readPrimitivesItem(targetRegion, referenceURL, item, order * 2, callback);\n }\n\n let loadVersionOne = (targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback, options) => {\n const filteredMetada = supplementMetadataInArray(metadata, options);\n let numberOfObjects = getNumberOfObjects(filteredMetada);\n // view file does not receive callback\n let callback = new metaFinishCallback(numberOfObjects, finishCallback, allCompletedCallback);\n // Prioritise the view file and settings before loading anything else\n for (let i = 0; i < metadata.length; i++)\n readViewAndSettingsItem(referenceURL, filteredMetada[i], callback);\n for (let i = 0; i < metadata.length; i++) {\n readVersionOneRegionPath(targetRegion, referenceURL, filteredMetada[i], i, callback);\n }\n }\n\n let loadVersionTwo = (targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback) => {\n let numberOfObjects = getNumberOfObjects(metadata);\n // view file does not receive callback\n let callback = new metaFinishCallback(numberOfObjects, finishCallback, allCompletedCallback);\n if (metadata.Settings)\n this.loadSettings(metadata.Settings);\n if (metadata.Views)\n loadMultipleViews(referenceURL, metadata.Views, referenceURL);\n if (metadata.Regions)\n loadRegions(targetRegion, referenceURL, metadata.Regions, callback);\n }\n\n /**\n * Load a metadata file from the provided URL into this scene. Once\n * succssful scene proceeds to read each items into scene for visualisations.\n *\n * @param {String} url - Location of the metadata file\n * @param {Function} finishCallback - Callback function which will be called\n * @param {options} Optional settings, it can be used to ignore some regions/groups\n * in the metadata file. Only supports version 1 at this moment.\n * for each glyphset and geometry that has been written in.\n */\n this.loadMetadataURL = (targetRegion, url, finishCallback, allCompletedCallback, options) => {\n const xmlhttp = new XMLHttpRequest();\n const requestURL = resolveURL(url);\n xmlhttp.onreadystatechange = () => {\n if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {\n scene.resetMetadata();\n scene.resetDuration();\n viewLoaded = false;\n let referenceURL = xmlhttp.responseURL;\n if (referenceURL === undefined)\n referenceURL = (new URL(requestURL)).href;\n const metadata = JSON.parse(xmlhttp.responseText);\n if (Array.isArray(metadata)) {\n loadVersionOne(targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback, options);\n } else if (typeof metadata === \"object\" && metadata !== null) {\n if (metadata.Version == \"2.0\") {\n loadVersionTwo(targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback);\n }\n }\n }\n }\n\n xmlhttp.open(\"GET\", requestURL, true);\n xmlhttp.send();\n }\n}\n\nexport { SceneLoader };\n","import * as THREE from 'three';\nimport { CameraControls, StereoEffect } from './controls';\nimport { LineSegments } from './three/line/LineSegments';\nimport { MarkerCluster } from './primitives/markerCluster';\nimport { Minimap } from './minimap';\nimport { Region } from './region';\nimport { Points } from './three/Points';\nimport { SceneExporter } from './sceneExporter';\nimport { SceneLoader } from './sceneLoader';\nimport { Viewport } from './controls';\nimport {\n createBufferGeometry,\n createNewSpriteText,\n getCircularTexture\n} from './utilities';\n\nlet uniqueiId = 0;\n\nconst getUniqueId = function () {\n return \"sc\" + uniqueiId++;\n}\n\nconst defaultMetadata = function() {\n return {\n Duration: \"6 secs\",\n OriginalDuration: \"-\",\n TimeStamps: {}\n }\n};\n\nconst defaultDuration = 6000;\n\n/**\n * A Scene contains {@link Region},and\n * {@link CameraControls} which controls the viewport and additional features.\n * It is the main object used for controlling what is and what is not displayed\n * on the renderer.\n *\n * @class\n * @param {Object} containerIn - Container to create the renderer on.\n * @author Alan Wu\n * @return {Scene}\n */\nconst Scene = function (containerIn, rendererIn) {\n const container = containerIn;\n let cameraHelper = undefined;\n let videoHandler = undefined;\n let sceneLoader = new SceneLoader(this);\n let minimap = undefined;\n let zincObjectAddedCallbacks = {};\n let zincObjectAddedCallbacks_id = 0;\n let zincObjectRemovedCallbacks = {};\n let zincObjectRemovedCallbacks_id = 0;\n const scene = new THREE.Scene();\n const miniAxesScene = new THREE.Scene();\n const rootRegion = new Region(undefined, this);\n scene.add(rootRegion.getGroup());\n const tempGroup = new THREE.Group();\n scene.add(tempGroup);\n /**\n * A {@link THREE.DirectionalLight} object for controlling lighting of this scene.\n */\n this.directionalLight = undefined;\n /**\n * a {@link THREE.AmbientLight} for controlling the ambient lighting of this scene.\n */\n this.ambient = undefined;\n this.camera = undefined;\n let duration = 6000;\n let zincCameraControls = undefined;\n this.sceneName = undefined;\n let stereoEffectFlag = false;\n let stereoEffect = undefined;\n this.autoClearFlag = true;\n this.displayMarkers = false;\n this.displayMinimap = false;\n this.displayMiniAxes = false;\n this.minimapScissor = {\n x_offset: 16,\n y_offset: 16,\n width: 128,\n height: 128,\n align: \"top-right\",\n updateRequired: true\n };\n let scissor = {x: 0, y: 0};\n let metadata = defaultMetadata();\n let _markerTarget = new THREE.Vector2();\n let pickableObjectsList = [];\n this.forcePickableObjectsUpdate = false;\n this.uuid = getUniqueId();\n let markerCluster = new MarkerCluster(this);\n markerCluster.disable();\n scene.add(markerCluster.group);\n let axisDisplay = {\n main: [],\n mini: [],\n }\n const _v3 = new THREE.Vector3( 0, 0, 0 );\n\n const getDrawingWidth = () => {\n if (container)\n if (typeof container.clientWidth !== \"undefined\")\n return container.clientWidth;\n else\n return container.width;\n return 0;\n }\n\n const getDrawingHeight = () => {\n if (container)\n if (typeof container.clientHeight !== \"undefined\")\n return container.clientHeight;\n else\n return container.height;\n return 0;\n }\n\n /**\n * This function returns a three component array, which contains\n * [totalsize, totalLoaded and errorDownload] of all the downloads happening\n * in this scene.\n * @returns {Array}\n */\n this.getDownloadProgress = () => {\n return sceneLoader.getDownloadProgress();\n }\n\n //called from Renderer when panel has been resized\n this.onWindowResize = () => {\n const wHeight = getDrawingHeight();\n this.camera.aspect = getDrawingWidth() / wHeight;\n this.camera.updateProjectionMatrix();\n this.minimapScissor.updateRequired = true;\n zincCameraControls.onResize();\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(wHeight);\n }\n\n /**\n * Reset the viewport of this scene to its original state.\n */\n this.resetView = () => {\n this.onWindowResize();\n zincCameraControls.resetView();\n }\n\n /**\n * Set the zoom level by unit scroll rate\n */\n this.changeZoomByScrollRateUnit = unit => {\n zincCameraControls.changeZoomByScrollRateUnit(unit);\n }\n\n //Setup the camera for this scene, it also initialise the lighting\n const setupCamera = () => {\n this.camera = new THREE.PerspectiveCamera(40, getDrawingWidth() / getDrawingHeight(), 0.0, 10.0);\n this.ambient = new THREE.AmbientLight(0xffffff, 0.2);\n scene.add(this.ambient);\n\n this.directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);\n scene.add(this.directionalLight);\n zincCameraControls = new CameraControls(this.camera, rendererIn.domElement, rendererIn, this);\n\n zincCameraControls.setDirectionalLight(this.directionalLight);\n zincCameraControls.resetView();\n\n minimap = new Minimap(this);\n };\n\n setupCamera();\n\n /**\n * Load the viewport Data from the argument {@link Zinc.Viewport} and set it as\n * the default viewport of this scene.\n *\n * @param {Zinc.Viewport} viewData - Viewport data to be loaded.\n */\n this.loadView = settings => {\n const viewPort = new Viewport();\n viewPort.setFromObject(settings);\n zincCameraControls.setCurrentCameraSettings(viewPort);\n return true;\n }\n\n /**\n * Set up multiple views.\n *\n * @param {Zinc.Viewport} viewData - Viewport data to be loaded.\n */\n this.setupMultipleViews = (defaultView, entries) => {\n for (const [name, settings] of Object.entries(entries)) {\n const viewport = new Viewport();\n viewport.setFromObject(settings);\n zincCameraControls.addViewport(name, viewport);\n }\n zincCameraControls.setDefaultViewport(defaultView);\n }\n\n /**\n * Get the bounding box of all the object in this scene only.\n *\n * @returns {THREE.Box3}\n */\n this.getBoundingBox = () => {\n return rootRegion.getBoundingBox(true);\n }\n\n /**\n * Adjust the viewport to display the desired volume provided by the bounding box.\n *\n * @param {THREE.Box3} boundingBox - The bounding box which describes the volume of\n * which we the viewport should be displaying.\n */\n this.viewAllWithBoundingBox = boundingBox => {\n if (boundingBox) {\n const viewport = zincCameraControls.getViewportFromBoundingBox(boundingBox, 1.0);\n zincCameraControls.setCurrentCameraSettings(viewport);\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(getDrawingHeight());\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n /**\n * Adjust zoom distance to include all primitives in scene only.\n */\n this.viewAll = () => {\n const boundingBox = this.getBoundingBox();\n this.viewAllWithBoundingBox(boundingBox);\n markerCluster.markerUpdateRequired = true;\n }\n\n /**\n * A function which iterates through the list of geometries and call the callback\n * function with the geometries as the argument.\n * @param {Function} callbackFunction - Callback function with the geometry\n * as an argument.\n */\n this.forEachGeometry = callbackFunction => {\n rootRegion.forEachGeometry(callbackFunction, true);\n }\n\n /**\n * A function which iterates through the list of glyphsets and call the callback\n * function with the glyphset as the argument.\n * @param {Function} callbackFunction - Callback function with the glyphset\n * as an argument.\n */\n this.forEachGlyphset = callbackFunction => {\n rootRegion.forEachGlyphset(callbackFunction, true);\n }\n\n /**\n * A function which iterates through the list of pointsets and call the callback\n * function with the pointset as the argument.\n * @param {Function} callbackFunction - Callback function with the pointset\n * as an argument.\n */\n this.forEachPointset = callbackFunction => {\n rootRegion.forEachPointset(callbackFunction, true);\n }\n\n /**\n * A function which iterates through the list of lines and call the callback\n * function with the lines as the argument.\n * @param {Function} callbackFunction - Callback function with the lines\n * as an argument.\n */\n this.forEachLine = callbackFunction => {\n rootRegion.forEachLine(callbackFunction, true);\n }\n\n /**\n * Find and return all geometries in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findGeometriesWithGroupName = GroupName => {\n return rootRegion.findGeometriesWithGroupName(GroupName, true);\n }\n\n /**\n * Find and return all pointsets in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findPointsetsWithGroupName = GroupName => {\n return rootRegion.findPointsetsWithGroupName(GroupName, true);\n }\n /**\n * Find and return all glyphsets in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findGlyphsetsWithGroupName = GroupName => {\n return rootRegion.findGlyphsetsWithGroupName(GroupName, true);\n }\n\n /**\n * Find and return all lines in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findLinesWithGroupName = GroupName => {\n return rootRegion.findLinesWithGroupName(GroupName, true);\n }\n\n /**\n * Find a list of objects with the specified name, this will\n * tranverse through the region tree to find all child objects\n * with matching name.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findObjectsWithGroupName = GroupName => {\n return rootRegion.findObjectsWithGroupName(GroupName, true);\n }\n\n this.findObjectsWithAnatomicalId = anatomicalId => {\n return rootRegion.findObjectsWithAnatomicalId(anatomicalId, true);\n }\n\n /**\n * Get the bounding box of all zinc objects in list.\n *\n * @param {Array} objectsArray - Groupname to match with.\n * @returns {THREE.Box3}\n */\n this.getBoundingBoxOfZincObjects = objectsArray => {\n let boundingBox = undefined;\n for (let i = 0; i < objectsArray.length; i++) {\n let box = objectsArray[i].getBoundingBox();\n if (box) {\n if (!boundingBox)\n boundingBox = box;\n else\n boundingBox.union(box);\n }\n }\n return boundingBox;\n }\n\n /**\n * Convert the vector3 into screen coordinates.\n *\n * @param {THREE.Vector3} point - Vector 3 containing the point to convert,\n * this vector will be overwritten with the returned value.\n * @param {Array} objectsArray - Groupname to match with.\n * @returns {THREE.Vector3}\n */\n this.vectorToScreenXY = point => {\n point.project(this.camera);\n let width = getDrawingWidth();\n let height = getDrawingHeight();\n let widthHalf = (width / 2);\n let heightHalf = (height / 2);\n point.x = (point.x * widthHalf) + widthHalf;\n point.y = - (point.y * heightHalf) + heightHalf;\n return point;\n }\n\n /**\n * Get the screen coordinate of the centroid of provided list of objects.\n *\n * @param {Array} zincObjects - List of {@link ZincObject}.\n * @returns {THREE.Vector3}\n */\n this.getObjectsScreenXY = zincObjects => {\n if (zincObjects && zincObjects.length > 0) {\n let boundingBox = this.getBoundingBoxOfZincObjects(zincObjects);\n const center = new THREE.Vector3();\n boundingBox.getCenter(center);\n return this.vectorToScreenXY(center);\n }\n return undefined;\n }\n\n /**\n * Get the screen coordinate of the centroid of all objects\n * in scene with the provided name.\n *\n * @param {String} name - List of {@link ZincObject}.\n * @returns {THREE.Vector3}\n */\n this.getNamedObjectsScreenXY = name => {\n let zincObjects = this.findObjectsWithGroupName(name);\n return this.getObjectsScreenXY(zincObjects);\n };\n\n /**\n * Add zinc object into the root {@link Region} of sfcene.\n *\n * @param {ZincObject} - zinc object ot be added.\n * @returns {THREE.Vector3}\n */\n this.addZincObject = zincObject => {\n if (zincObject) {\n rootRegion.addZincObject(zincObject);\n if (zincCameraControls)\n zincCameraControls.calculateMaxAllowedDistance(this);\n }\n }\n\n /**\n * Load a glyphset into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {String} glyphurl - regular json model file providing geometry of the glyph.\n * @param {String} groupName - name to assign the glyphset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadGlyphsetURL = (metaurl, glyphurl, groupName, finishCallback) => {\n sceneLoader.loadGlyphsetURL(rootRegion, metaurl, glyphurl, groupName, finishCallback);\n }\n\n /**\n * Load a pointset into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadPointsetURL = (url, timeEnabled, morphColour, groupName, finishCallback) => {\n sceneLoader.loadPointsetURL(rootRegion, url, timeEnabled, morphColour, groupName, finishCallback);\n }\n\n /**\n * Load lines into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadLinesURL = (url, timeEnabled, morphColour, groupName, finishCallback) => {\n sceneLoader.loadLinesURL(rootRegion, url, timeEnabled, morphColour, groupName, finishCallback);\n }\n\n /**\n * Read a STL file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the STL geometry is succssfully loaded.\n */\n this.loadSTL = (url, groupName, finishCallback) => {\n sceneLoader.loadSTL(rootRegion, url, groupName, finishCallback);\n }\n\n /**\n * Read a OBJ file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the OBJ geometry is succssfully loaded.\n */\n this.loadOBJ = (url, groupName, finishCallback) => {\n sceneLoader.loadOBJ(rootRegion, url, groupName, finishCallback);\n }\n\n /**\n * Load a metadata file from the provided URL into this scene. Once\n * succssful scene proceeds to read each items into scene for visualisations.\n *\n * @param {String} url - Location of the metafile\n * @param {Function} finishCallback - Callback function which will be called\n * for each glyphset and geometry that has been written in.\n * @param {options} Optional settings, it can be used to ignore some regions/groups\n * in the metadata file. Only supports version 1 at this moment.\n */\n this.loadMetadataURL = (url, finishCallback, allCompletedCallback, options) => {\n sceneLoader.loadMetadataURL(rootRegion, url, finishCallback, allCompletedCallback, options);\n }\n\n /**\n * Load a legacy model(s) format with the provided URLs and parameters. This only loads the geometry\n * without any of the metadata. Therefore, extra parameters should be provided.\n *\n * @deprecated\n */\n this.loadModelsURL = (urls, colours, opacities, timeEnabled, morphColour, finishCallback) => {\n sceneLoader.loadModelsURL(rootRegion. urls, colours, opacities, timeEnabled, morphColour, finishCallback);\n }\n\n /**\n * Load the viewport from an external location provided by the url.\n * @param {String} URL - address to the file containing viewport information.\n */\n this.loadViewURL = url => {\n sceneLoader.loadViewURL(url);\n }\n\n /**\n * Load a legacy file format containing the viewport and its meta file from an external\n * location provided by the url. Use the new metadata format with\n * {@link Zinc.Scene#loadMetadataURL} instead.\n *\n * @param {String} URL - address to the file containing viewport and model information.\n * @deprecated\n */\n this.loadFromViewURL = (jsonFilePrefix, finishCallback) => {\n sceneLoader.loadFromViewURL(jsonFilePrefix, finishCallback);\n }\n\n /**\n * Load GLTF into this scene object.\n */\n this.loadGLTF = (url, finishCallback, allCompletedCallback, options) => {\n sceneLoader.loadGLTF(rootRegion, url, finishCallback, allCompletedCallback, options);\n }\n\n //Update the directional light for this scene.\n this.updateDirectionalLight = () => {\n zincCameraControls.updateDirectionalLight();\n }\n\n /**\n * Add any {THREE.Object} into this scene.\n * @param {THREE.Object} object - to be addded into this scene.\n */\n this.addObject = object => {\n scene.add(object);\n }\n\n /**\n * Remove any {THREE.Object} from this scene.\n * @param {THREE.Object} object - to be removed from this scene.\n */\n this.removeObject = object => {\n scene.remove(object);\n }\n\n /**\n * Get the current time of the scene.\n * @return {Number}\n */\n this.getCurrentTime = () => {\n if (videoHandler != undefined) {\n return videoHandler.getCurrentTime(duration);\n }\n const time = rootRegion.getCurrentTime();\n if (time !== -1)\n return time;\n\n return 0;\n }\n\n /**\n * Set the current time of all the geometries and glyphsets of this scene.\n * @param {Number} time - Value to set the time to.\n */\n this.setMorphsTime = (time) => {\n if (videoHandler != undefined) {\n videoHandler.setMorphTime(time, duration);\n }\n rootRegion.setMorphTime(time, true);\n }\n\n /**\n * Check if any object in this scene is time varying.\n *\n * @return {Boolean}\n */\n this.isTimeVarying = () => {\n if (videoHandler && videoHandler.video && !videoHandler.video.error) {\n \treturn true;\n }\n return rootRegion.isTimeVarying();\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n * @private\n */\n this.renderGeometries = (playRate, delta, playAnimation) => {\n // Let video dictates the progress if one is present\n let options = {};\n options.camera = zincCameraControls;\n //Global markers flag, marker can be set at individual zinc object level\n //overriding this flag.\n options.displayMarkers = this.displayMarkers;\n options.markerCluster = markerCluster;\n options.markersList = markerCluster.markers;\n options.ndcToBeUpdated = false;\n //Always set marker cluster update required when playAnimation is true\n //to make sure it is updated when it stops\n if (playAnimation) {\n options.markerCluster.markerUpdateRequired = true;\n }\n\t if (videoHandler) {\n\t\t if (videoHandler.isReadyToPlay()) {\n\t\t\t if (playAnimation) {\n videoHandler.video.play();\n\t\t\t } else {\n\t\t\t\t videoHandler.video.pause();\n\t\t\t }\n const currentTime = videoHandler.video.currentTime /\n videoHandler.getVideoDuration() * duration;\n\t\t\t if (0 == sceneLoader.toBeDownloaded) {\n\t\t\t\t zincCameraControls.setTime(currentTime);\n\t\t\t\t options.ndcToBeUpdated = zincCameraControls.update(0);\n if (options.ndcToBeUpdated) {\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(getDrawingHeight());\n }\n rootRegion.setMorphTime(currentTime, true);\n rootRegion.renderGeometries(0, 0, playAnimation, zincCameraControls, options, true);\n\t\t\t } else {\n\t\t\t\t zincCameraControls.update(0);\n\t\t\t }\n\t\t\t //console.log(videoHandler.video.currentTime / videoHandler.getVideoDuration() * 6000);\n\t\t } else {\n\t\t\t myPlayRate = 0;\n\t\t }\n\t } else {\n\t\t if (0 == sceneLoader.toBeDownloaded) {\n options.ndcToBeUpdated = zincCameraControls.update(delta);\n if (options.ndcToBeUpdated) {\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(getDrawingHeight());\n }\n rootRegion.renderGeometries(playRate, delta, playAnimation, zincCameraControls, options, true);\n\t\t } else {\n\t\t\t zincCameraControls.update(0);\n\t\t }\n }\n }\n\n /**\n * Return the internal {THREE.Scene}.\n * @return {THREE.Scene}\n */\n this.getThreeJSScene = () => {\n return scene;\n }\n\n this.setVideoHandler = (videoHandlerIn) => {\n if (!videoHandler)\n videoHandler = videoHandlerIn;\n }\n\n /**\n * Set a group of scenes into this parent scene. This group of\n * scenes will also be rendered when this scene is rendered.\n * @private\n */\n this.setAdditionalScenesGroup = scenesGroup => {\n scene.add(scenesGroup);\n }\n\n let getWindowsPosition = (align, x_offset, y_offset, width, height,\n renderer_width, renderer_height) => {\n let x = 0;\n let y = 0;\n if (align.includes(\"top\")) {\n y = renderer_height - height - y_offset;\n } else if (align.includes(\"bottom\")) {\n y = y_offset;\n } else {\n y = Math.floor((renderer_height - height) / 2.0);\n }\n if (align.includes(\"left\")) {\n x = x_offset;\n } else if (align.includes(\"right\")) {\n x = renderer_width - x_offset- width;\n } else {\n x = Math.floor((renderer_width - width) / 2.0);\n }\n return {x: x, y: y};\n }\n\n const renderMinimap = renderer => {\n if (this.displayMinimap || this.displayMiniAxes) {\n renderer.setScissorTest(true);\n renderer.getSize(_markerTarget);\n if (this.minimapScissor.updateRequired) {\n scissor = getWindowsPosition(this.minimapScissor.align,\n this.minimapScissor.x_offset,\n this.minimapScissor.y_offset,\n this.minimapScissor.width,\n this.minimapScissor.height,\n _markerTarget.x, _markerTarget.y);\n this.minimapScissor.updateRequired = false;\n }\n renderer.setScissor(\n scissor.x,\n scissor.y,\n this.minimapScissor.width,\n this.minimapScissor.height);\n renderer.setViewport(\n scissor.x,\n scissor.y,\n this.minimapScissor.width,\n this.minimapScissor.height);\n minimap.updateCamera();\n if (this.displayMiniAxes) {\n renderer.render(miniAxesScene, minimap.camera);\n } else {\n scene.add(minimap.mask);\n renderer.render(scene, minimap.camera);\n scene.remove(minimap.mask);\n }\n renderer.setScissorTest(false);\n renderer.setViewport(0, 0, _markerTarget.x, _markerTarget.y);\n }\n }\n\n /**\n * Render the scene.\n * @private\n */\n this.render = renderer => {\n if (this.autoClearFlag)\n renderer.clear();\n if (stereoEffectFlag && stereoEffect) {\n stereoEffect.render(scene, this.camera);\n } else {\n renderer.render(scene, this.camera);\n renderMinimap(renderer);\n }\n }\n\n /**\n * Enable or disable interactive control, this is on by default.\n *\n * @param {Boolean} flag - Indicate either interactive control\n * should be enabled or disabled.\n */\n this.setInteractiveControlEnable = flag => {\n if (flag == true)\n zincCameraControls.enable();\n else\n zincCameraControls.disable();\n }\n\n /**\n * Get the camera control of this scene.\n * @return {Zinc.CameraControls}\n */\n this.getZincCameraControls = () => {\n return zincCameraControls;\n }\n\n /**\n * Get the internal {THREE.Scene}.\n * @return {THREE.Scene}\n */\n this.getThreeJSScene = () => {\n return scene;\n }\n\n /**\n * Set the default duration value for geometries and glyphsets\n * that are to be loaded into this scene.\n * @param {Number} durationIn - duration of the scene.\n */\n this.setDuration = durationIn => {\n rootRegion.setDuration(durationIn);\n duration = durationIn;\n zincCameraControls.setPathDuration(durationIn);\n sceneLoader.duration = durationIn;\n }\n\n /**\n * Get the default duration value.\n * @return {Number}\n */\n this.getDuration = () => {\n return duration;\n }\n\n /**\n * Enable or disable stereo effect of this scene.\n * @param {Boolean} stereoFlag - Indicate either stereo effect control\n * should be enabled or disabled.\n */\n this.setStereoEffectEnable = stereoFlag => {\n if (stereoFlag == true) {\n if (!stereoEffect) {\n stereoEffect = new StereoEffect(rendererIn);\n }\n }\n rendererIn.setSize(getDrawingWidth(), getDrawingHeight());\n this.camera.updateProjectionMatrix();\n stereoEffectFlag = stereoFlag;\n }\n\n\n /**\n * Check rather object is in scene.\n *\n * @return {Boolean}\n */\n this.objectIsInScene = zincObject => {\n return rootRegion.objectIsInRegion(zincObject, true);\n }\n\n /**\n * Rotate the camera view to view the entirety of the\n * bounding box with a smooth transition within the providied\n * transitionTime.\n *\n * @param {THREE.Box3} boundingBox - the bounding box to target\n * @param {Number} transitionTime - Duration to perform the transition.\n */\n this.alignBoundingBoxToCameraView = (boundingBox, transitionTime) => {\n if (boundingBox) {\n boundingBox.getCenter(_v3);\n const viewport = this.getZincCameraControls().getCurrentViewport();\n const target = new THREE.Vector3(viewport.targetPosition[0],\n viewport.targetPosition[1], viewport.targetPosition[2]);\n const eyePosition = new THREE.Vector3(viewport.eyePosition[0],\n viewport.eyePosition[1], viewport.eyePosition[2]);\n const newVec1 = new THREE.Vector3();\n const newVec2 = new THREE.Vector3();\n newVec1.subVectors(target, eyePosition).normalize();\n newVec2.subVectors(target, _v3).normalize();\n const newVec3 = new THREE.Vector3();\n newVec3.crossVectors(newVec1, newVec2);\n const angle = newVec1.angleTo(newVec2);\n if (transitionTime > 0) {\n this.getZincCameraControls().rotateCameraTransition(newVec3,\n angle, transitionTime);\n this.getZincCameraControls().enableCameraTransition();\n } else {\n this.getZincCameraControls().rotateAboutLookAtpoint(newVec3, angle);\n }\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n\n /**\n * Translate the camera view to the center of the\n * bounding box with a smooth transition within the providied\n * transitionTime.\n *\n * @param {THREE.Box3} boundingBox - the bounding box to target\n * @param {Number} transitionTime - Duration to perform the transition.\n */\n this.translateBoundingBoxToCameraView = (boundingBox, scaleRadius, transitionTime) => {\n if (boundingBox) {\n const oldViewport = this.getZincCameraControls().getCurrentViewport();\n const viewport = this.getZincCameraControls().getViewportFromBoundingBox(boundingBox, scaleRadius);\n if (transitionTime > 0) {\n this.getZincCameraControls().cameraTransition(oldViewport,\n viewport, transitionTime);\n this.getZincCameraControls().enableCameraTransition();\n }\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n /**\n * Transition the camera into viewing the zinc object with a\n * smooth transition within the providied transitionTime.\n *\n * @param {ZincObject} zincObject - the bounding box to target\n * @param {Number} transitionTime - Duration to perform the transition.\n */\n this.alignObjectToCameraView = (zincObject, transitionTime) => {\n if (this.objectIsInScene(zincObject)) {\n const boundingBox = zincObject.getBoundingBox();\n this.alignBoundingBoxToCameraView(boundingBox, transitionTime);\n }\n }\n\n /**\n * Set the camera to point to the centroid of the zinc object.\n *\n * @param {ZincObject} zincObject - the bounding box to target\n */\n this.setCameraTargetToObject = zincObject => {\n if (this.objectIsInScene(zincObject)) {\n const boundingBox = zincObject.getBoundingBox();\n const viewport = this.getZincCameraControls().getCurrentViewport();\n boundingBox.getCenter(_v3);\n const target = new THREE.Vector3(viewport.targetPosition[0],\n viewport.targetPosition[1], viewport.targetPosition[2]);\n const eyePosition = new THREE.Vector3(viewport.eyePosition[0],\n viewport.eyePosition[1], viewport.eyePosition[2]);\n const newVec1 = new THREE.Vector3();\n const newVec2 = new THREE.Vector3();\n newVec1.subVectors(eyePosition, target);\n newVec2.addVectors(_v3, newVec1);\n viewport.eyePosition[0] = newVec2.x;\n viewport.eyePosition[1] = newVec2.y;\n viewport.eyePosition[2] = newVec2.z;\n viewport.targetPosition[0] = _v3.x;\n viewport.targetPosition[1] = _v3.y;\n viewport.targetPosition[2] = _v3.z;\n this.getZincCameraControls().setCurrentCameraSettings(viewport);\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n /**\n * Check if stereo effect is enabled.\n * @returns {Boolean}\n */\n this.isStereoEffectEnable = () => {\n return stereoEffectFlag;\n }\n\n /**\n * Remove a ZincObject from this scene if it presents. This will eventually\n * destroy the object and free up the memory.\n * @param {Zinc.Object} zincObject - object to be removed from this scene.\n */\n this.removeZincObject = zincObject => {\n rootRegion.removeZincObject(zincObject);\n if (zincCameraControls) {\n zincCameraControls.calculateMaxAllowedDistance(this);\n }\n markerCluster.markerUpdateRequired = true;\n }\n\n /**\n * Update pickable objects list\n */\n this.updatePickableThreeJSObjects = () => {\n pickableObjectsList.length = 0;\n if (markerCluster.isEnabled) {\n pickableObjectsList.push(markerCluster.group);\n }\n rootRegion.getPickableThreeJSObjects(pickableObjectsList, true);\n this.forcePickableObjectsUpdate = false;\n }\n\n /**\n * Get all pickable objects.\n */\n this.getPickableThreeJSObjects = () => {\n //The list will only be updated if changes have been made\n //in region or a flag has been raise\n if (this.forcePickableObjectsUpdate ||\n rootRegion.checkPickableUpdateRequred(true)) {\n this.updatePickableThreeJSObjects();\n }\n return pickableObjectsList;\n }\n\n /**\n * Get the Normalised coordinates on minimap if mouse event is\n * inside the minimap\n */\n this.getNormalisedMinimapCoordinates = (renderer, event) => {\n if (this.displayMinimap) {\n const target = new THREE.Vector2();\n renderer.getSize(target);\n let offsetY = target.y - event.clientY;\n if (((scissor.x + this.minimapScissor.width) > event.clientX) &&\n (event.clientX > scissor.x) &&\n ((scissor.y + this.minimapScissor.height) > offsetY) &&\n (offsetY > scissor.y)) {\n let x = ((event.clientX - scissor.x) /\n this.minimapScissor.width) * 2.0 - 1.0;\n let y = ((offsetY - scissor.y) /\n this.minimapScissor.height) * 2.0 - 1.0;\n return {\"x\": x, \"y\": y};\n }\n }\n return undefined;\n }\n\n /**\n * Get the coordinates difference of the current viewing\n * point and projected coordinates.\n */\n this.getMinimapDiffFromNormalised = (x, y) => {\n if (minimap)\n return minimap.getDiffFromNormalised(x, y);\n return undefined;\n }\n\n this.isWebGL2 = () => {\n return rendererIn.isWebGL2();\n }\n\n /**\n * Remove all objects that are created with ZincJS APIs and it will free the memory allocated.\n * This does not remove obejcts that are added using the addObject APIs.\n */\n this.clearAll = () => {\n markerCluster.clear();\n rootRegion.clear(true);\n this.clearZincObjectAddedCallbacks();\n this.clearZincObjectRemovedCallbacks();\n sceneLoader.toBeDwonloaded = 0;\n if (zincCameraControls) {\n zincCameraControls.calculateMaxAllowedDistance(this);\n }\n markerCluster.markerUpdateRequired = true;\n }\n\n /**\n * All time stamp to the metadata TimeStamps field.\n */\n this.addMetadataTimeStamp = (key, time) => {\n metadata[\"TimeStamps\"][key] = convertDurationObjectTomSec(time);\n }\n\n /**\n * Get a specific metadata field.\n */\n this.getMetadataTag = key => {\n return metadata[key];\n }\n\n /**\n * Get all metadata set for the scene.\n */\n this.getMetadata = () => {\n return metadata;\n }\n\n /**\n * Set a specific metadata field.\n */\n this.setMetadataTag = (key, value) => {\n metadata[key] = value;\n }\n\n /**\n * Remove a specific metadata field.\n */\n this.removeMetadataTag = key => {\n delete metadata[key];\n }\n\n /**\n * Reset all metadata fields to original value.\n */\n this.resetMetadata = () => {\n metadata = defaultMetadata();\n }\n\n /**\n * Reset duration of scene to default value.\n */\n this.resetDuration = () => {\n this.setDuration(defaultDuration);\n }\n\n // Turn the object into a readable string {years: years,months: months,\n // weeks: weeks, days: days, hours: hours, mins: mins, secs: secs }\n const convertDurationObjectToString = duration => {\n return [\n ...(duration.years ? [`${duration.years}years`] : []),\n ...(duration.months ? [`${duration.months}months`] : []),\n ...(duration.weeks ? [`${duration.weeks}weeks`] : []),\n ...(duration.days ? [`${duration.days}days`] : []),\n ...(duration.hours ? [`${duration.hours}hours`] : []),\n ...(duration.mins ? [`${duration.mins}mins`] : []),\n ...(duration.secs ? [`${duration.secs}secs`] : []),\n ].join(' ');\n }\n\n // Turn the object into a number representing milliesecond {years: years,months: months,\n // weeks: weeks, days: days, hours: hours, mins: mins, secs: secs }\n const convertDurationObjectTomSec = duration => {\n return duration.years ? duration.years * 31536000000 : 0 +\n duration.months ? duration.months * 2592000000 : 0 +\n duration.weeks ? duration.weeks * 604800000 : 0 +\n duration.days ? duration.days * 86400000 : 0 +\n duration.hours ? duration.hours * 3600000 : 0 +\n duration.mins ? duration.mins * 60000 : 0 +\n duration.secs ? duration.secs * 1000 : 0;\n }\n\n // Set the readable duration and timer using an object\n // with the following format {years: years,months: months, weeks: weeks, days: days,\n // hours: hours, mins: mins, secs: secs }\n this.setDurationFromObject = duration => {\n const string = convertDurationObjectToString(duration);\n const millisec = convertDurationObjectTomSec(duration);\n this.setMetadataTag(\"Duration\", string);\n this.setDuration(millisec);\n }\n\n // Set the readable original duration using an object\n // with the following format {years: years,months: months, weeks: weeks, days: days,\n // hours: hours, mins: mins, secs: secs }\n this.setOriginalDurationFromObject = duration => {\n const string = convertDurationObjectToString(duration);\n this.setMetadataTag(\"OriginalDuration\", string);\n }\n\n /**\n * Export the scene in GLTF format, it can either return it in\n * string or binary form.\n *\n * @param {Boolean} binary - Indicate it should be exported as binary or\n * text.\n *\n * @return {Promise} The exported data if the promise resolve successfully\n */\n this.exportGLTF = (binary) => {\n const exporter = new SceneExporter(this);\n return exporter.exportGLTF(binary);\n }\n\n /**\n * Get the root region of the scene.\n *\n * @return {Region} Return the root region of the scene\n */\n this.getRootRegion = () => {\n return rootRegion;\n }\n\n /**\n * Create points in region specified in the path\n *\n */\n this.createLines = ( regionPath, groupName, coords, colour ) => {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n return region.createLines(groupName, coords, colour);\n }\n\n /**\n * Create points in region specified in the path\n *\n */\n this.createPoints = ( regionPath, groupName, coords, labels, colour ) => {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n return region.createPoints(groupName, coords, labels, colour);\n }\n\n\t/**\n\t * Add a callback function which will be called everytime zinc object is added.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addZincObjectAddedCallbacks = callbackFunction => {\n\t\tzincObjectAddedCallbacks_id = zincObjectAddedCallbacks_id + 1;\n\t\tzincObjectAddedCallbacks[zincObjectAddedCallbacks_id] = callbackFunction;\n\t\treturn zincObjectAddedCallbacks_id;\n\t}\n\n\t/**\n\t * Add a callback function which will be called everytime zinc object is removed.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addZincObjectRemovedCallbacks = callbackFunction => {\n\t\tzincObjectRemovedCallbacks_id = zincObjectRemovedCallbacks_id + 1;\n\t\tzincObjectRemovedCallbacks[zincObjectRemovedCallbacks_id] = callbackFunction;\n\t\treturn zincObjectRemovedCallbacks_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeZincObjectAddedCallbacks = id => {\n\t\tif (id in zincObjectAddedCallbacks_id) {\n \t\t\tdelete zincObjectAddedCallbacks[id];\n\t\t}\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeZincObjectRemovedCallbacks = id => {\n\t\tif (id in zincObjectRemovedCallbacks_id) {\n \t\t\tdelete zincObjectRemovedCallbacks[id];\n\t\t}\n\t}\n\n /**\n\t * Clear all zinc object callback function\n\t */\n\tthis.clearZincObjectAddedCallbacks = () => {\n\t\tzincObjectAddedCallbacks = {};\n zincObjectAddedCallbacks_id = 0;\n\t}\n\n /**\n\t * Clear all zinc object callback function\n\t */\n\tthis.clearZincObjectRemovedCallbacks = () => {\n\t\tzincObjectRemovedCallbacks = {};\n zincObjectRemovedCallbacks_id = 0;\n\t}\n\n /**\n\t * Used to trigger zinc object added callback\n\t */\n this.triggerObjectAddedCallback = (zincObject) => {\n for (let key in zincObjectAddedCallbacks) {\n if (zincObjectAddedCallbacks.hasOwnProperty(key)) {\n zincObjectAddedCallbacks[key](zincObject);\n }\n }\n }\n\n /**\n\t * Used to trigger zinc object removed callback\n\t */\n this.triggerObjectRemovedCallback= (zincObject) => {\n for (let key in zincObjectRemovedCallbacks) {\n if (zincObjectRemovedCallbacks.hasOwnProperty(key)) {\n zincObjectRemovedCallbacks[key](zincObject);\n }\n }\n }\n\n /*\n\t * Add temporary points to the scene which can be removed\n * with clearTemporaryPrimitives method.\n\t */\n this.addTemporaryPoints = (coords, colour) => {\n const geometry = createBufferGeometry(coords.length, coords);\n let material = new THREE.PointsMaterial({ alphaTest: 0.5, size: 15,\n color: colour, sizeAttenuation: false });\n const texture = getCircularTexture();\n material.map = texture;\n let point = new Points(geometry, material);\n tempGroup.add(point);\n return point;\n }\n\n /*\n\t * Add temporary lines to the scene which can be removed\n * with clearTemporaryPrimitives method.\n\t */\n this.addTemporaryLines = (coords, colour) => {\n const geometry = createBufferGeometry(coords.length, coords);\n const material = new THREE.LineBasicMaterial({color:colour});\n const line = new LineSegments(geometry, material);\n tempGroup.add(line);\n return line;\n }\n\n\n /*\n\t * Display frustum\n\t */\n this.enableFrustumDisplay = () => {\n if (this.camera && !cameraHelper) {\n cameraHelper = new THREE.CameraHelper(this.camera);\n scene.add(cameraHelper);\n }\n }\n\n /*\n\t * Hide frustum\n\t */\n this.disableFrustumDisplay = () => {\n if (cameraHelper) {\n scene.remove(cameraHelper);\n cameraHelper.dispose();\n cameraHelper = undefined;\n }\n }\n\n /*\n\t * Remove object from temporary objects list\n\t */\n this.removeTemporaryPrimitive = (object) => {\n tempGroup.remove(object);\n object.geometry.dispose();\n object.material.dispose();\n }\n\n /*\n\t * Remove all temporary primitives.\n * Return number of primitives removed;\n\t */\n this.clearTemporaryPrimitives = () => {\n let i = 0;\n const children = tempGroup.children;\n children.forEach(child => {\n child.geometry.dispose();\n child.material.dispose();\n i++;\n });\n tempGroup.clear();\n return i;\n }\n\n /*\n\t * Create primitive based on the bounding box of scene and\n * add to specify region and group name.\n\t */\n this.addBoundingBoxPrimitive = (regionPath, group, colour, opacity,\n visibility, boundingBox = undefined) => {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n const box = boundingBox ? boundingBox : this.getBoundingBox();\n _v3.set(0.0, 0.0, 0.0);\n const dim = _v3.subVectors(box.max, box.min);\n const boxGeo = new THREE.BoxGeometry(dim.x, dim.y, dim.z);\n const primitive = region.createGeometryFromThreeJSGeometry(\n group, boxGeo, colour, opacity, visibility, 10000);\n dim.addVectors(box.min, box.max).multiplyScalar( 0.5 );\n primitive.setPosition(dim.x, dim.y, dim.z);\n return primitive;\n }\n\n /*\n\t * Create primitive based on the bounding box of scene and\n * add to specify region and group name.\n\t */\n this.addSlicesPrimitive = (regionPath, groups, colours, opacity,\n visibility, boundingBox = undefined) => {\n if (groups && groups.length >= 3 &&\n colours && colours.length >= 3) {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n const box = boundingBox ? boundingBox : this.getBoundingBox();\n _v3.set(0.0, 0.0, 0.0);\n const dim = _v3.subVectors(box.max, box.min);\n const directions = [\"x\", \"y\", \"z\"];\n const primitives = [];\n let index = 0;\n directions.forEach((direction) => {\n let planeGeo = undefined;\n switch(direction) {\n //YZ plane\n case \"x\":\n planeGeo = new THREE.PlaneGeometry(dim.z, dim.y);\n planeGeo.rotateY(Math.PI / 2);\n // code block\n break;\n //XZ plane\n case \"y\":\n planeGeo = new THREE.PlaneGeometry(dim.x, dim.z);\n planeGeo.rotateX(Math.PI / 2);\n // code block\n break;\n //XY plane\n case \"z\":\n planeGeo = new THREE.PlaneGeometry(dim.x, dim.y);\n // code block\n break;\n default:\n break;\n }\n const primitive = region.createGeometryFromThreeJSGeometry(\n groups[index], planeGeo, colours[index], opacity, visibility, 10001);\n primitives.push(primitive);\n index++;\n });\n\n dim.addVectors(box.min, box.max).multiplyScalar( 0.5 );\n primitives.forEach((primitive) => {\n primitive.setPosition(dim.x, dim.y, dim.z);\n });\n return primitives;\n }\n }\n\n /*\n\t * Enable marker cluster to work with markers\n\t */\n this.enableMarkerCluster = (flag) => {\n if (flag) {\n markerCluster.markerUpdateRequired = true;\n markerCluster.enable();\n } else {\n markerCluster.markerUpdateRequired = false;\n markerCluster.disable();\n }\n this.forcePickableObjectsUpdate = true;\n }\n\n /*\n\t * Destory static axis display object\n\t */\n this.destroyAxisDisplay = () => {\n this.displayMiniAxes = false;\n if (axisDisplay.main) {\n this.enableAxisDisplay(false, false);\n axisDisplay.main.forEach(axis => {\n if (axis.dispose) {\n axis.dispose();\n }\n });\n }\n if (axisDisplay.mini) {\n this.enableAxisDisplay(false, true);\n axisDisplay.mini.forEach(axis => {\n if (axis.dispose) {\n axis.dispose();\n }\n });\n }\n axisDisplay = {\n main: [],\n mini: [],\n };\n }\n\n /*\n\t * Create static axis display object\n\t */\n this.createAxisDisplay = (fitBoundingBox = false) => {\n this.destroyAxisDisplay();\n const XYZ = [\n {\n name: \"x\",\n dir: new THREE.Vector3(1, 0, 0),\n colour: \"red\",\n hex: 0xFF5555\n },\n {\n name: \"y\",\n dir: new THREE.Vector3(0, 1, 0),\n colour: \"green\",\n hex: 0x55FF55\n },\n {\n name: \"z\",\n dir: new THREE.Vector3(0, 0, 1),\n colour: \"blue\",\n hex: 0x5555FF\n }\n ];\n const boundingBox = this.getBoundingBox();\n const size = boundingBox.min.distanceTo(boundingBox.max);\n let origin = new THREE.Vector3(0, 0, 0);\n if (fitBoundingBox) {\n origin.copy(boundingBox.min);\n }\n XYZ.forEach((xyzObj) => {\n const arrowHelper = new THREE.ArrowHelper(xyzObj.dir, origin, size, xyzObj.hex);\n axisDisplay.main.push(arrowHelper);\n const miniArrowHelper = new THREE.ArrowHelper(xyzObj.dir, boundingBox.getCenter(_v3), size / 2, xyzObj.hex);\n axisDisplay.mini.push(miniArrowHelper);\n\n /*\n const miniLabel = createNewSpriteText(xyzObj.name, 0.1, xyzObj.colour, \"Asap\", 120, 400);\n const miniPosition = xyzObj.dir.clone().multiplyScalar(size/2).add(_v3[xyzObj.name]);\n miniLabel.position.set(miniPosition.x, miniPosition.y, miniPosition.z);\n axisDisplay.mini.push(miniLabel);\n */\n\n const axesLabel = createNewSpriteText(xyzObj.name, 0.036, xyzObj.colour, \"Asap\", 120, 700);\n const position = xyzObj.dir.clone().multiplyScalar(size).add(origin);\n axesLabel.position.set(position.x, position.y, position.z);\n axisDisplay.main.push(axesLabel);\n })\n }\n\n /*\n\t * Enable static axis display, createAxisDisplay must be called\n * before the axis can be display.\n\t */\n this.enableAxisDisplay = (enable, miniaxes = false) => {\n if (miniaxes && axisDisplay?.mini?.length) {\n this.displayMiniAxes = enable;\n axisDisplay.mini.forEach(axis => {\n enable ? miniAxesScene.add(axis) : miniAxesScene.remove(axis);\n });\n } else if (!miniaxes && axisDisplay.main) {\n axisDisplay.main.forEach(axis => {\n enable ? scene.add(axis) : scene.remove(axis);\n });\n }\n }\n}\n\nexport { Scene };\n","import * as THREE from 'three';\nimport { ResizeSensor } from 'css-element-queries';\nimport { Scene } from './scene';\n/**\n * Create a Zinc 3D renderer in the container provided.\n * The primary function of a Zinc 3D renderer is to display the current\n * scene (@link Scene} set to the renderer and each scene may contain as\n * many geometries, glyphset and other primitives as the system can support.\n * Zinc.Renderer also allows additional scenes to be displayed.\n *\n * @param {Object} containerIn - Container to create the renderer on.\n * @class\n * @author Alan Wu\n * @return {Renderer}\n */\nconst Renderer = function (containerIn) {\n\n\tlet container = containerIn;\n\n\tconst stats = 0;\n\n\tlet renderer = undefined;\n\tlet currentScene = undefined;\n\n\t//myGezincGeometriestains a tuple of the threejs mesh, timeEnabled, morphColour flag, unique id and morph\n\tconst clock = new THREE.Clock(false);\n\tthis.playAnimation = true;\n /* default animation update rate, rate is 1000 and duration\n is default to 6000, 6s to finish a full animation */\n\tlet playRate = 1000;\n\tlet preRenderCallbackFunctions = {};\n\tlet preRenderCallbackFunctions_id = 0;\n\tlet postRenderCallbackFunctions = {};\n\tlet postRenderCallbackFunctions_id = 0;\n\tlet contextLostCallbackFunctions = {};\n\tlet contextLostCallbackFunctions_id = 0;\n\tlet contextRestoredCallbackFunctions = {};\n\tlet contextRestoredCallbackFunctions_id = 0;\n\tlet animated_id = undefined;\n\tlet cameraOrtho = undefined, sceneOrtho = undefined, logoSprite = undefined;\n\tlet sceneMap = [];\n\tlet additionalActiveScenes = [];\n\tlet scenesGroup = new THREE.Group();\n\tlet canvas = undefined;\n let sensor = undefined;\n let isRendering = false;\n\tlet isInitialised = false;\n\tconst _this = this;\n\tconst currentSize = [0, 0];\n\tconst currentOffset = [0, 0];\n\n\tthis.getDrawingWidth = () => {\n\t\tif (container) {\n\t\t\treturn container.clientWidth;\n\t\t} else if (canvas)\n\t\t\tif (typeof canvas.clientWidth !== 'undefined')\n\t\t\t\treturn Math.round(canvas.clientWidth);\n\t\t\telse\n\t\t\t\treturn Math.round(canvas.width);\n\t\treturn 0;\n\t}\n\n\tthis.getDrawingHeight = () => {\n\t\tif (container) {\n\t\t\treturn container.clientHeight;\n\t\t} else if (canvas)\n\t\t\tif (typeof canvas.clientHeight !== 'undefined')\n\t\t\t\treturn Math.round(canvas.clientHeight);\n\t\t\telse\n\t\t\t\treturn Math.round(canvas.height);\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Call this to resize the renderer, this is normally call automatically.\n\t */\n\tthis.onWindowResize = () => {\n\t\tcurrentScene.onWindowResize();\n\t\tconst width = this.getDrawingWidth();\n\t\tconst height = this.getDrawingHeight();\n\t\tif (renderer != undefined) {\n\t\t\tlet localRect = undefined;\n\t\t\tif (container) {\n\t\t\t\tlocalRect = container.getBoundingClientRect();\n\t\t\t\trenderer.setSize(width, height);\n\t\t\t} else if (canvas) {\n\t\t\t\tif (typeof canvas.getBoundingClientRect !== 'undefined') {\n\t\t\t\t\tlocalRect = canvas.getBoundingClientRect();\n\t\t\t\t\tcanvas.width = width;\n\t\t\t\t\tcanvas.height = height;\n\t\t\t\t\trenderer.setSize(width, height, false);\n\t\t\t\t} else {\n\t\t\t\t\trenderer.setSize(width, height, false);\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (localRect) {\n\t\t\t\tcurrentOffset[0] = localRect.left;\n\t\t\t\tcurrentOffset[1] = localRect.top;\n\t\t\t}\n\t\t\tconst target = new THREE.Vector2();\n\t\t\trenderer.getSize(target);\n\t\t\tcurrentSize[0] = target.x;\n\t\t\tcurrentSize[1] = target.y;\n\t\t}\n\t}\n\n\t/**\n\t * Initialise the renderer and its visualisations.\n\t */\n\tthis.initialiseVisualisation = parameters => {\n\t\tif (!isInitialised) {\n\t\t\tparameters = parameters || {};\n\t\t\tif (parameters['antialias'] === undefined) {\n\t\t\t\tlet onMobile = false;\n\t\t\t\ttry {\n\t\t\t\t\tif( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {\n\t\t\t\t\t\tonMobile = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(err) {\n\t\t\t\t\tonMobile = false;\n\t\t\t\t}\n\t\t\t\tif (onMobile)\n\t\t\t\t\tparameters['antialias'] = false;\n\t\t\t\telse\n\t\t\t\t\tparameters['antialias'] = true;\n\t\t\t}\n\t\t\tif (parameters[\"canvas\"]) {\n\t\t\t\tcontainer = undefined;\n\t\t\t\tcanvas = parameters[\"canvas\"];\n\t\t\t}\n\t\t\trenderer = new THREE.WebGLRenderer(parameters);\n\t\t\tif (container !== undefined) {\n\t\t\t\tcontainer.appendChild( renderer.domElement );\n\t\t\t}\n\t\t\trenderer.setClearColor( 0xffffff, 1);\n\t\t\tif (canvas && canvas.style) {\n\t\t\t\tcanvas.style.height = \"100%\";\n\t\t\t\tcanvas.style.width = \"100%\";\n\t\t\t}\n\t\t\tconst domCanvas = renderer.domElement;\n\t\t\tdomCanvas.addEventListener(\"webglcontextlost\", onContextLost, false);\n\t\t\tdomCanvas.addEventListener(\"webglcontextrestored\", onContextRestored, false);\n\n\t\t\trenderer.autoClear = false;\n\t\t\tconst scene = this.createScene(\"default\");\n\t\t\tthis.setCurrentScene(scene);\n\t\t\tisInitialised = true;\n\t\t}\n\t}\n\n const onContextLost = event => {\n event.preventDefault();\n for (let key of Object.keys(preRenderCallbackFunctions)) {\n if (contextLostCallbackFunctions.hasOwnProperty(key)) {\n contextLostCallbackFunctions[key].call();\n }\n }\n }\n\n const onContextRestored = event => {\n event.preventDefault();\n for (let key of Object.keys(preRenderCallbackFunctions)) {\n if (contextRestoredCallbackFunctions.hasOwnProperty(key)) {\n contextRestoredCallbackFunctions[key].call();\n }\n }\n }\n\n\t/**\n\t * Get the current scene on display.\n\t * @return {Zinc.Scene};\n\t */\n\tthis.getCurrentScene = () => {\n\t\treturn currentScene;\n\t}\n\n\t/**\n\t * Set the current scene on display.\n\t *\n\t * @param {Zinc.Scene} sceneIn - The scene to be set, only scene created by this instance\n\t * of ZincRenderer is supported currently.\n\t */\n\tthis.setCurrentScene = sceneIn => {\n\t\tif (sceneIn) {\n\t\t\tthis.removeActiveScene(sceneIn);\n\t\t\tconst oldScene = currentScene;\n\t\t\tcurrentScene = sceneIn;\n\t\t\tif (oldScene) {\n\t\t\t\toldScene.setInteractiveControlEnable(false);\n\t\t\t}\n\t\t\tcurrentScene.setInteractiveControlEnable(true);\n\t\t\tcurrentScene.setAdditionalScenesGroup(scenesGroup);\n\t\t\tthis.onWindowResize();\n\t\t}\n\t}\n\n\t/**\n\t * Return scene with the matching name if scene with that name has been created.\n\t *\n\t * @param {String} name - Name to match\n\t * @return {Zinc.Scene}\n\t */\n\tthis.getSceneByName = name => {\n\t\treturn sceneMap[name];\n\t}\n\n\t/**\n\t * Create a new scene with the provided name if scene with the same name exists,\n\t * return undefined.\n\t *\n\t * @param {String} name - Name of the scene to be created.\n\t * @return {Zinc.Scene}\n\t */\n\tthis.createScene = name => {\n\t\tif (sceneMap[name] != undefined){\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tlet new_scene = undefined;\n\t\t\tif (canvas)\n\t\t\t\tnew_scene = new Scene(canvas, renderer);\n\t\t\telse\n\t\t\t\tnew_scene = new Scene(container, renderer);\n\t\t\tsceneMap[name] = new_scene;\n\t\t\tnew_scene.sceneName = name;\n\t\t\treturn new_scene;\n\t\t}\n\t}\n\n\tconst updateOrthoScene = () => {\n\t\tif (logoSprite != undefined) {\n\t\t\tconst material = logoSprite.material;\n\t\t\tif (material.map) {\n\t\t\t\tconst width = this.getDrawingWidth();\n\t\t\t\tconst height = this.getDrawingHeight();\n\t\t\t\tconst calculatedWidth = (width - material.map.image.width)/2;\n\t\t\t\tconst calculatedHeight = (-height + material.map.image.height)/2;\n\t\t\t\tlogoSprite.position.set(calculatedWidth, calculatedHeight, 1 );\n\t\t\t}\n\t\t}\n\t};\n\n\tconst updateOrthoCamera = () => {\n\t\tif (cameraOrtho != undefined) {\n\t\t\tconst width = this.getDrawingWidth();\n\t\t\tconst height = this.getDrawingHeight();\n\t\t\tcameraOrtho.left = -width / 2;\n\t\t\tcameraOrtho.right = width / 2;\n\t\t\tcameraOrtho.top = height / 2;\n\t\t\tcameraOrtho.bottom = -height / 2;\n\t\t\tcameraOrtho.updateProjectionMatrix();\n\t\t}\n\t};\n\n\t/**\n\t * Reset the viewport of the current scene to its original state.\n\t */\n\tthis.resetView = () => {\n\t\tcurrentScene.resetView();\n\t}\n\n\t/**\n\t * Adjust zoom distance to include all primitives in scene and also the additional scenes\n\t * but the lookat direction and up vectors will remain constant.\n\t */\n\tthis.viewAll = () => {\n\t\tif (currentScene) {\n\t\t\tconst boundingBox = currentScene.getBoundingBox();\n\t\t\tif (boundingBox) {\n\t\t\t for(let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\t const boundingBox2 = additionalActiveScenes[i].getBoundingBox();\n\t\t\t if (boundingBox2) {\n\t\t\t\t\t\t\t\tboundingBox.union(boundingBox2);\n\t\t\t }\n\t\t\t }\n\t\t\t\tcurrentScene.viewAllWithBoundingBox(boundingBox);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load a legacy model(s) format with the provided URLs and parameters. This only loads the geometry\n\t * without any of the metadata. Therefore, extra parameters should be provided. This should be\n\t * called from {@link Zinc.Scene}.\n\t *\n\t * @deprecated\n\t */\n\tthis.loadModelsURL = (urls, colours, opacities, timeEnabled, morphColour, finishCallback) => {\n\t\tcurrentScene.loadModelsURL(urls, colours, opacities, timeEnabled, morphColour, finishCallback);\n\t}\n\n\tconst loadView = viewData => {\n\t\tcurrentScene.loadView(viewData);\n\t};\n\n\t/**\n\t * Load the viewport from an external location provided by the url. This should be\n\t * called from {@link Zinc.Scene};\n\t * @param {String} URL - address to the file containing viewport information.\n\t * @deprecated\n\t */\n\tthis.loadViewURL = url => {\n\t\tcurrentScene.loadViewURL(url);\n\t}\n\n\t/**\n\t * Load a legacy file format containing the viewport and its model file from an external\n\t * location provided by the url. Use the new metadata format with\n\t * {@link Zinc.Scene#loadMetadataURL} instead. This should be\n\t * called from {@link Zinc.Scene};\n\t *\n\t * @param {String} URL - address to the file containing viewport and model information.\n\t * @deprecated\n\t */\n\tthis.loadFromViewURL = (jsonFilePrefix, finishCallback) => {\n\t\tcurrentScene.loadFromViewURL(jsonFilePrefix, finishCallback);\n\t}\n\n\tthis.updateDirectionalLight = () => {\n\t\tcurrentScene.updateDirectionalLight();\n\t}\n\n let runAnimation = () => {\n if (isRendering) {\n animated_id = requestAnimationFrame( runAnimation );\n this.render();\n } else {\n cancelAnimationFrame(animated_id);\n animated_id = undefined;\n }\n }\n\n\t/**\n\t * Stop the animation and renderer to get into the render loop.\n\t */\n\tthis.stopAnimate = () => {\n if (isRendering) {\n clock.stop();\n isRendering = false;\n }\n\t}\n\n\t/**\n\t * Start the animation and begin the rendering loop.\n\t */\n\tthis.animate = () => {\n if (!isRendering) {\n clock.start();\n isRendering = true;\n runAnimation();\n }\n\t}\n\n\tconst prevTime = Date.now();\n\n\t/**\n\t * Add a callback function which will be called when the gl context is lost.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addContextLostCallbackFunction = callbackFunction => {\n\t\tcontextLostCallbackFunctions_id = contextLostCallbackFunctions_id + 1;\n\t\tcontextLostCallbackFunctions[contextLostCallbackFunctions_id] = callbackFunction;\n\t\treturn contextLostCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the renderer.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeContextLostCallbackFunction = id => {\n\t\tif (id in contextLostCallbackFunctions) {\n\t\t\tdelete contextLostCallbackFunctions[id];\n\t\t}\n\t}\n\n\t/**\n\t * Add a callback function which will be called when the gl context is restored.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addContextRestoredCallbackFunction = callbackFunction => {\n\t\tcontextRestoredCallbackFunctions_id = contextRestoredCallbackFunctions_id + 1;\n\t\tcontextRestoredCallbackFunctions[contextRestoredCallbackFunctions_id] = callbackFunction;\n\t\treturn contextRestoredCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the renderer.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeContextRestoredCallbackFunction = id => {\n\t\tif (id in contextRestoredCallbackFunctions_id) {\n\t\t\tdelete contextRestoredCallbackFunctions_id[id];\n\t\t}\n\t}\n\n\t/**\n\t * Add a callback function which will be called everytime before the renderer renders its scene.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addPreRenderCallbackFunction = callbackFunction => {\n\t\tpreRenderCallbackFunctions_id = preRenderCallbackFunctions_id + 1;\n\t\tpreRenderCallbackFunctions[preRenderCallbackFunctions_id] = callbackFunction;\n\t\treturn preRenderCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removePreRenderCallbackFunction = id => {\n\t\tif (id in preRenderCallbackFunctions) {\n\t\t\tdelete preRenderCallbackFunctions[id];\n\t\t}\n\t}\n\n\t/**\n\t * Add a callback function which will be called everytime after the renderer renders its scene.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addPostRenderCallbackFunction = callbackFunction => {\n\t\tpostRenderCallbackFunctions_id = postRenderCallbackFunctions_id + 1;\n\t\tpostRenderCallbackFunctions[postRenderCallbackFunctions_id] = callbackFunction;\n\t\treturn postRenderCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removePostRenderCallbackFunction = id => {\n\t\tif (id in postRenderCallbackFunctions) {\n\t\t\tdelete postRenderCallbackFunctions[id];\n\t\t}\n\t}\n\n\t/**\n\t * Get the current play rate, playrate affects how fast an animated object animates.\n\t * Also see {@link Zinc.Scene#duration}.\n\t */\n\tthis.getPlayRate = () => {\n\t\treturn playRate;\n\t}\n\n\t/**\n\t * Set the current play rate, playrate affects how fast an animated object animates.\n\t * @param {Number} PlayRateIn - value to set the playrate to.\n\t * Also see {@link Zinc.Scene#duration}.\n\t */\n\tthis.setPlayRate = playRateIn => {\n\t\tplayRate = playRateIn;\n\t}\n\n\tthis.getCurrentTime = () => {\n\t\treturn currentScene.getCurrentTime();\n\t}\n\n\n\t/**\n\t * Get the current play rate, playrate affects how fast an animated object animates.\n\t * Also see {@link Zinc.Scene#duration}.\n\t */\n\tthis.setMorphsTime = time => {\n\t\tcurrentScene.setMorphsTime(time);\n\t}\n\n\t/**\n\t * Get {Zinc.Geoemtry} by its id. This should be called from {@link Zinc.Scene};\n\t *\n\t * @depreacted\n\t * @return {Zinc.Geometry}\n\t */\n\tthis.getZincGeometryByID = id => {\n\t\treturn currentScene.getZincGeometryByID(id);\n\t}\n\n\t/**\n\t * Add {Three.Object} to the current scene.\n\t */\n\tthis.addToScene = object => {\n\t\tcurrentScene.addObject(object)\n\t}\n\n\t/**\n\t * Add {Three.Object} to the ortho scene, objects added to the ortho scene are rendered in\n\t * normalised coordinates and overlay on top of current scene.\n\t *\n\t */\n\tthis.addToOrthoScene = object => {\n\t\tif (sceneOrtho == undefined)\n\t\t\tsceneOrtho = new THREE.Scene();\n\t\tif (cameraOrtho == undefined) {\n\t\t\tconst width = this.getDrawingWidth();\n\t\t\tconst height = this.getDrawingHeight();\n\t\t\tcameraOrtho = new THREE.OrthographicCamera( -width / 2,\n\t\t\t\t\twidth / 2, height/ 2, -height / 2, 1, 10 );\n\t\t\tcameraOrtho.position.z = 10;\n\t\t}\n\t\tsceneOrtho.add(object)\n\t}\n\n\tconst createHUDSprites = logoSprite => {\n\t\treturn texture => {\n\t\t\ttexture.needsUpdate = true;\n\t\t\tconst material = new THREE.SpriteMaterial( { map: texture } );\n\t\t\tconst imagewidth = material.map.image.width;\n\t\t\tconst imageheight = material.map.image.height;\n\t\t\tlogoSprite.material = material;\n\t\t\tlogoSprite.scale.set( imagewidth, imageheight, 1 );\n\t\t\tconst width = this.getDrawingWidth();\n\t\t\tconst height = this.getDrawingHeight();\n\t\t\tlogoSprite.position.set( (width - imagewidth)/2, (-height + imageheight)/2, 1 );\n\t\t\tthis.addToOrthoScene(logoSprite);\n\t\t};\n\t};\n\n\tthis.addLogo = () => {\n\t\tlogoSprite = new THREE.Sprite();\n\t\tconst logo = THREE.ImageUtils.loadTexture(\n\t\t\t\t\"images/abi_big_logo_transparent_small.png\", undefined, createHUDSprites(logoSprite));\n\t}\n\n\t/**\n\t * Render the current and all additional scenes. It will first update all geometries and glyphsets\n\t * in scenes, clear depth buffer and render the ortho scene, call the preRenderCallbackFunctions stack\n\t * , render the scenes then postRenderCallback.\n\t */\n\tthis.render = () => {\n\t\tif (!sensor) {\n\t\t\tif (container) {\n\t\t\t\tif (container.clientWidth > 0 && container.clientHeight > 0) {\n\t\t\t\t\tsensor = new ResizeSensor(container, this.onWindowResize);\n\t\t\t\t}\n\t\t\t} else if (canvas) {\n\t\t\t\tif (canvas.width > 0 && canvas.height > 0)\n\t\t\t\t\tsensor = new ResizeSensor(canvas, this.onWindowResize);\n\t\t\t}\n\t\t}\n\t\tconst delta = clock.getDelta();\n\t\tcurrentScene.renderGeometries(playRate, delta, this.playAnimation);\n\t for(let i = 0; i < additionalActiveScenes.length; i++) {\n\t const sceneItem = additionalActiveScenes[i];\n\t sceneItem.renderGeometries(playRate, delta, this.playAnimation);\n\t }\n\t\tif (cameraOrtho != undefined && sceneOrtho != undefined) {\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.render( sceneOrtho, cameraOrtho );\n\t\t}\n for (let key of Object.keys(preRenderCallbackFunctions)) {\n if (preRenderCallbackFunctions.hasOwnProperty(key)) {\n preRenderCallbackFunctions[key].call();\n }\n }\n currentScene.render(renderer);\n for (let key of Object.keys(postRenderCallbackFunctions)) {\n if (postRenderCallbackFunctions.hasOwnProperty(key)) {\n postRenderCallbackFunctions[key].call();\n }\n }\n\t}\n\n\tthis.forceContextLoss = () => {\n\t\trenderer.forceContextLoss();\n\t}\n\n\tthis.forceContextRestore= () => {\n\t\trenderer.forceContextRestore();\n\t}\n\n\t/**\n\t * Get the internal {@link Three.Renderer}, to gain access to ThreeJS APIs.\n\t */\n\tthis.getThreeJSRenderer = () => {\n\t\treturn renderer;\n\t}\n\n\t/**\n\t * Check if a scene is currently active.\n\t * @param {Zinc.Scene} sceneIn - Scene to check if it is currently\n\t * rendered.\n\t */\n\tthis.isSceneActive = sceneIn => {\n\t\tif (currentScene === sceneIn) {\n\t\t\treturn true;\n\t\t} else {\n\t\t for(let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\t\t\tconst sceneItem = additionalActiveScenes[i];\n\t\t\t\t\tif (sceneItem === sceneIn)\n\t\t\t\t\t\treturn true;\n\t\t }\n\t\t}\n\t return false;\n\t}\n\n\t/**\n\t * Add additional active scene for rendering, this scene will also be rendered but\n\t * viewport of the currentScene will be used.\n\t * @param {Zinc.Scene} additionalScene - Scene to be added to the rendering.\n\t */\n\tthis.addActiveScene = additionalScene => {\n\t\tif (!this.isSceneActive(additionalScene)) {\n\t\t\tadditionalActiveScenes.push(additionalScene);\n\t\t\tscenesGroup.add(additionalScene.getThreeJSScene());\n\t\t}\n\t}\n\n\t/**\n\t * Remove a currenrtly active scene from the renderer, this scene will also be rendered but\n\t * viewport of the currentScene will be used.\n\t * @param {Zinc.Scene} additionalScene - Scene to be removed from rendering.\n\t */\n\tthis.removeActiveScene = additionalScene => {\n\t\tfor(let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\tconst sceneItem = additionalActiveScenes[i];\n\t\t\tif (sceneItem === additionalScene) {\n\t\t\t\tadditionalActiveScenes.splice(i, 1);\n\t\t\t\tscenesGroup.remove(additionalScene.getThreeJSScene());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clear all additional scenes from rendering except for curentScene.\n\t */\n\tthis.clearAllActiveScene = () => {\n\t\tfor (let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\tscenesGroup.remove(additionalActiveScenes[i].getThreeJSScene());\n\t\t}\n\t\tadditionalActiveScenes.splice(0,additionalActiveScenes.length);\n\t}\n\n /**\n * Dispose all memory allocated, this will effetively destroy all scenes.\n */\n this.dispose = () => {\n if (isRendering)\n cancelAnimationFrame(animated_id);\n for (const key in sceneMap) {\n if (sceneMap.hasOwnProperty(key)) {\n sceneMap[key].clearAll();\n }\n }\n sceneMap = [];\n additionalActiveScenes = [];\n scenesGroup = new THREE.Group();\n this.stopAnimate();\n preRenderCallbackFunctions = {};\n preRenderCallbackFunctions_id = 0;\n postRenderCallbackFunctions = {};\n postRenderCallbackFunctions = 0;\n contextLostCallbackFunctions = {};\n contextLostCallbackFunctions_id = 0;\n contextRestoredCallbackFunctions = {};\n contextRestoredCallbackFunctions_id = 0;\n cameraOrtho = undefined;\n sceneOrtho = undefined;\n logoSprite = undefined;\n const scene = this.createScene(\"default\");\n this.setCurrentScene(scene);\n sensor = undefined;\n renderer?.dispose();\n }\n\n\t/**\n\t * Transition from the current viewport to the endingScene's viewport in the specified duration.\n\t *\n\t * @param {Zinc.Scene} endingScene - Viewport of this scene will be used as the destination.\n\t * @param {Number} duration - Amount of time to transition from current viewport to the\n\t * endingScene's viewport.\n\t */\n\tthis.transitionScene = (endingScene, duration) => {\n\t\tif (currentScene) {\n\t\t\tconst currentCamera = currentScene.getZincCameraControls();\n\t\t\tconst boundingBox = endingScene.getBoundingBox();\n\t\t\tif (boundingBox) {\n\t\t\t\tconst radius = boundingBox.min.distanceTo(boundingBox.max)/2.0;\n\t\t\t\tconst centreX = (boundingBox.min.x + boundingBox.max.x) / 2.0;\n\t\t\t\tconst centreY = (boundingBox.min.y + boundingBox.max.y) / 2.0;\n\t\t\t\tconst centreZ = (boundingBox.min.z + boundingBox.max.z) / 2.0;\n\t\t\t\tconst clip_factor = 4.0;\n\t\t\t\tconst endingViewport = currentCamera.getViewportFromCentreAndRadius(centreX, centreY, centreZ, radius, 40, radius * clip_factor );\n\t\t\t\tconst startingViewport = currentCamera.getCurrentViewport();\n\t\t\t\tcurrentCamera.cameraTransition(startingViewport, endingViewport, duration);\n\t\t\t\tcurrentCamera.enableCameraTransition();\n\t\t\t}\n\t\t}\n\t}\n\n this.isWebGL2 = () => {\n if (renderer)\n return renderer.capabilities.isWebGL2;\n return false;\n }\n};\n\nexport { Renderer };","import * as THREE from 'three';\nimport PACKAGE from '../package.json';\n\n// Import all internal primitives and modules\nimport { Geometry } from './primitives/geometry';\nimport { Glyph } from './primitives/glyph';\nimport { Glyphset } from './primitives/glyphset';\nimport { Pointset } from './primitives/pointset';\nimport { Label } from './primitives/label';\nimport { Lines } from './primitives/lines';\nimport { TextureArray } from './texture/textureArray';\nimport { TextureSlides } from './primitives/textureSlides';\nimport { Renderer } from './renderer';\nimport { Scene } from './scene';\n//import { GeometryCSG } from './geometryCSG';\n//import { GlyphsetCSG } from './glyphsetCSG';\nimport {\n Viewport,\n CameraControls,\n SmoothCameraTransition,\n RayCaster,\n CameraAutoTumble,\n StereoEffect\n} from './controls';\nimport { loadExternalFile, loadExternalFiles } from './utilities';\n\nconst version = PACKAGE.version;\n\n/**\n * Provides a global namespace for the Zinc javascript library and some default parameters for it.\n *\n * @namespace\n * @author Alan Wu\n */\nconst Zinc = function() {\n this.Revision = version;\n this.defaultMaterialColor = 0xFFFFFF;\n this.defaultOpacity = 1.0;\n this.modelPrefix = undefined;\n // Assign hoisted modules to the instance\n this.Geometry = Geometry;\n this.Glyph = Glyph;\n this.Glyphset = Glyphset;\n this.Pointset = Pointset;\n this.Label = Label;\n this.Lines = Lines;\n this.TextureArray = TextureArray;\n this.TextureSlides = TextureSlides;\n this.Renderer = Renderer;\n this.Scene = Scene;\n //this.GeometryCSG = GeometryCSG;\n //this.GlyphsetCSG = GlyphsetCSG;\n this.Viewport = Viewport;\n this.CameraControls = CameraControls;\n this.SmoothCameraTransition = SmoothCameraTransition;\n this.RayCaster = RayCaster;\n this.CameraAutoTumble = CameraAutoTumble;\n this.StereoEffect = StereoEffect;\n this.loadExternalFile = loadExternalFile;\n this.loadExternalFiles = loadExternalFiles;\n this.THREE = THREE;\n};\n\nexport default new Zinc();\n"],"names":["_m1","Matrix4","_obj","Object3D","_offset","Vector3","_temp","Geometry","MathUtils","EventDispatcher","matrix","normalMatrix","Matrix3","i","il","face","j","jl","angle","x","y","z","vector","geometry","scope","index","attributes","position","normal","color","uv","uv2","Color","addFace","a","b","c","materialIndex","vertexColors","vertexNormals","Face3","Vector2","groups","group","start","count","center","radius","s","cb","ab","f","fl","vA","vB","vC","areaWeighted","vertices","v","vl","tmpGeo","dstNormalsFace","dstNormalsVertex","faceNormal","morphNormals","Box3","Sphere","m","morphTargets1","morphTargets2","n","morphColors1","morphColors2","l","morphTarget1","morphTarget2","k","kl","vertexCopy","morphColor1","morphColor2","materialIndexOffset","vertexOffset","vertices1","vertices2","normals2","faces1","faces2","colors1","colors2","faceVertexNormals","faceVertexColors","faceCopy","faceVertexUvs2","uvs2","uvsCopy","mesh","precisionPoints","verticesMap","unique","changes","precision","key","faceIndicesToRemove","indices","idx","diff","points","point","faces","length","materialIndexSort","uvs1","newUvs1","newUvs2","id","data","parameters","vertex","normals","normalsHash","colors","colorsHash","uvs","uvsHash","hasMaterial","hasFaceUv","hasFaceVertexUv","hasFaceNormal","hasFaceVertexNormal","hasFaceColor","hasFaceVertexColor","faceType","setBit","faceVertexUvs","getUvIndex","getNormalIndex","getColorIndex","value","enabled","hash","source","morphTargets","morphTarget","morphNormal","srcVertexNormal","destVertexNormal","skinWeights","skinIndices","lineDistances","boundingBox","boundingSphere","DirectGeometry","buffergeometry","BufferGeometry","positions","BufferAttribute","name","array","attribute","Float32BufferAttribute","buffer","colorArray","colorsArray","normalsArray","object","hasFaceVertexUv2","morphTargetsLength","morphTargetsPosition","morphNormalsLength","morphTargetsNormal","hasSkinIndices","hasSkinWeights","vertexUvs","discPNG","SpriteText","SpriteTextModule","resolveURL","url","actualURL","prefix","Zinc","createNewURL","target","reference","getNewURL","newURL","paramsStrings","urls","getBoundingBox","cachedBox","b1","v1","v2","influences","found","loadExternalFile","callback","errorCallback","request","loadExternalFiles","numUrls","numComplete","result","partialCallback","text","urlIndex","getColorsRGB","index_in_colors","remainder","hex_value","mycolor","THREE","updateMorphColorAttribute","targetGeometry","morph","morphColors","bound","morphArray","toBufferGeometry","geometryIn","options","THREEGeometry","copyMorphColorsToIndexedBufferGeometry","bufferGeometry","morphColor","mergeAttributes","TypedArray","itemSize","normalized","gpuType","arrayLength","offset","tupleOffset","mergeGeometries","geometries","useGroups","isIndexed","attributesUsed","morphAttributesUsed","morphAttributes","morphTargetsRelative","mergedGeometry","attributesCount","indexOffset","mergedIndex","mergedAttribute","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","createBufferGeometry","coords","coord","getCircularTexture","image","texture","createNewSpriteText","height","colour","font","pixel","weight","sprite","isRegionGroup","regionPath","groupName","comparePath","region","r","g","removeVertexAtIndex","maintainLength","positionAttribute","normalAttribute","deleteCount","removed","removeElements","newArray","augmentMorphColor","shader","_start","_end","_inverseMatrix","_ray","Ray","_sphere","_morphA","_morphB","_tempA","_tempB","Line","material","LineBasicMaterial","raycaster","intersects","matrixWorld","threshold","drawRange","morphPosition","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","step","end","calculatePosition","distance","keys","morphAttribute","ml","morphInfluences","influence","LineSegments","LOD","parent","distanceIn","levelObject","loader","level","preload","currentOnly","updateGeometryColour","flag","order","camera","levels","visibleIndex","optimalIndex","marker","myImage","markerImage","size","spriteMaterial","Marker","zincObject","ZincObject","userTexture","userMaterial","userSprite","userUrl","defaultDisplay","number","label","initialise","min","max","scale","porportion","userImage","numberIn","visible","uniqueiId","getUniqueId","durationIn","localTimeEnabled","localMorphColour","isPickable","anatomicalId","groupNameIn","ratio","time","timeChanged","actualDuration","newTime","alpha","isTransparent","hex","closestIndex","currentDistance","applyMatrixWorld","playAnimation","ndcToBeUpdated","renderOrder","scene","inView","mode","delta","cameraControls","targetTime","primitivesLoader","sources","createMeshForGeometry","materialIn","videoTexture","this","range","v3","wireframe","Label","textIn","colourIn","fontWeight","originalScale","scaling","sizeIn","fontWeightIn","Glyph","idIn","glyphsetIn","labelString","_position","meshIn","axis1","axis2","axis3","Loader","regex","file","handlers","materials","texturePath","crossOrigin","BlendingMode","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","textureLoader","TextureLoader","materialLoader","MaterialLoader","textures","loadTexture","path","repeat","wrap","anisotropy","fullPath","RepeatWrapping","MirroredRepeatWrapping","uuid","json","BackSide","DoubleSide","VertexColors","FaceColors","VideoHandler","srcIn","_this","src","duration","actualTime","AnimationClip","DefaultLoadingManager","FileLoader","LoaderUtils","Vector4","JSONLoader","manager","onLoad","onProgress","onError","metadata","type","e","parseModel","isBitSet","fi","zLength","colorIndex","normalIndex","uvIndex","isQuad","faceA","faceB","uvLayer","u","nUvLayers","parseSkin","influencesPerVertex","w","d","parseMorphing","dstVertices","srcVertices","dstNormals","srcNormals","cl","dstColors","srcColors","parseAnimations","outputAnimations","animations","clip","morphAnimationClips","videoHandler","Glyphset","glyphList","axis1s","axis2s","axis3s","scales","labels","numberOfTimeSteps","numberOfVertices","baseSize","scaleFactors","repeat_mode","morphColours","morphVertices","_transformMatrix","_bot_colour","_top_colour","_boundingBox1","_boundingBox2","_boundingBox3","_current_positions","_current_axis1s","_current_axis2s","_current_axis3s","_current_scales","_current_colors","_glyph_axis_array","glyphsetData","glyphURL","finishCallback","isInline","displayLabels","instancedMesh","meshloader","resolve_glyph_axes","return_arrays","axis_scale","final_axis1","final_axis2","final_axis3","final_point","mirrored_axis1","mirrored_axis2","mirrored_axis3","mirrored_point","sign","number_of_glyphs","use_axis1","use_axis2","use_scale","final_scale1","magnitude","updateGlyphsetTransformation","current_positions","current_axis1s","current_axis2s","current_axis3s","current_scales","numberOfGlyphs","numberOfPositions","current_glyph_index","current_index","current_position","current_axis1","current_axis2","current_axis3","current_scale","arrays","glyph","updateGlyphsetHexColors","current_colors","numberOfColours","hex_values","updateMorphGlyphsets","current_time","bottom_frame","proportion","top_frame","bottom_positions","top_positions","bottom_axis1","top_axis1","bottom_axis2","top_axis2","bottom_axis3","top_axis3","bottom_scale","top_scale","bottom_colors","top_colors","createGlyphs","callbackFunction","tempGeometry","Points","PointsMaterial","testPoint","rayPointDistanceSq","intersectPoint","Pointset","labelSets","labelSize","labelDepthTest","labelVisibility","addLabel","labelText","colourHex","removeLabel","current","maxIndex","oldName","Lines","line","width","Texture","img","resolve","reject","instance","canvas","ctx","srcArrays","TextureArray","h","dataStacks","fullArray","transparent","side","glslVersion","fs","vs","getUniforms","TexturePrimitive","textureIn","textureData","imgArray","tArray","TextureSlides","textureSettings","idTextureMap","edgesLine","flipY","flipZ","brightness","contrast","nChannels","maskTexture","maskEnabled","discardAlpha","lt0","lt1","prevTime","slideSettings","slide","setUniformSlideSettingsOfMesh","settings","uniforms","rotation","shader.getUniforms","shader.fs","shader.vs","shader.glslVersion","item","expandBoxWithSettings","box","quaternion","locations","edges","val","brightnessIn","contrastIn","numbersIn","maskTextureIn","normalisedTime","iTime","t0","t1","Viewport","nearPlane","farPlane","eyePosition","targetPosition","upVector","CameraControls","domElement","renderer","MODE","STATE","ROTATE_DIRECTION","KEYBOARD","CLICK_ACTION","inbuildTime","cameraPath","numberOfCameraPoint","updateLightWithPathFlag","playRate","deviceOrientationControl","defaultViewport","currentMode","smoothCameraTransitionObject","rotateCameraTransitionObject","cameraAutoTumbleObject","zoomSize","rotateMode","zincRayCaster","rect","_a","_b","_c","_new_b","_new_c","_axis","_v","_rel_eye","sceneSphere","_tempEye","hasUpdated","ndcControl","maxDist","viewports","currentDist","updateNearAndFarPlane","travalDist","viewportName","viewport","defaultName","depth","cameraOffset","vFOV","wHeight","positionIn","updateRect","out_x","out_y","buttonName","actionName","setCanvasTabindex","element","checkTravelDistance","newDist","translateViewport","translation","onDocumentMouseDown","event","minimapCoordinates","onDocumentMouseMove","onDocumentMouseUp","onDocumentMouseLeave","onDocumentTouchStart","len","dx","dy","onDocumentTouchMove","onDocumentTouchEnd","onDocumentEnter","forced","observer","entries","entry","onDocumentWheelEvent","onDocumentKeydownEvent","unit","onDocumentKeyupEvent","translate","fact","translate_rate","axis","rel_eyea","rel_eyeb","rel_eyec","upa","upb","upc","cos_angle","sin_angle","returned_values","tumble","delta_x","delta_y","tangent_dist","phi","calculateZoomDelta","dist","flyZoom","directionalLightIn","pathData","path_url","xmlhttp","requestURL","playRateIn","updateTime","timeIn","targetTimeFrame","updatePath","time_frame","bot_pos","top_pos","handleSyncControl","controlEnabled","updated","ModifiedDeviceOrientationControls","newViewport","centreX","centreY","centreZ","view_angle","clip_distance","localTargetPosition","eye_distance","localEyePosition","localFarPlane","localNearPlane","nearClippingFactor","radiusScale","currentViewport","startingViewport","endingViewport","SmoothCameraTransition","RotateCameraTransition","tumbleDirectionIn","tumbleRateIn","stopOnCameraInputIn","CameraAutoTumble","sceneIn","callbackFunctionIn","hoverCallbackFunctionIn","RayCaster","NDCCameraControl","targetCameraIn","startingEyePosition","startingTargetPosition","startingUp","endingEyePosition","endingTargetPosition","endingUp","targetCamera","completed","newDuration","updateCameraSettings","axisIn","angleIn","previousTime","hostSceneIn","rendererIn","hostScene","hoverCallbackFunction","mouse","awaiting","lastHoveredDate","lastHoveredEmpty","timeDiff","pickedObjects","lastPosition","pickableObjects","zincCamera","threejsScene","objects","zincObjects","origin","direction","hovered","awaitMove","tumbleAxis","tumbleDirection","computeTumbleAxisAngle","StereoCameraZoomFixed","focus","fov","aspect","near","far","zoom","eyeRight","eyeLeft","projectionMatrix","eyeSep","eyeSepOnProjection","ymax","xmin","xmax","StereoEffect","_stereo","onDeviceOrientationChangeEvent","onScreenOrientationChangeEvent","setObjectQuaternion","zee","euler","q0","q1","cameraObject","beta","gamma","orient","eventCallback","cameraIn","defaultViewportIn","scaledDelta","mapMarkerOrange","MarkerCluster","sprites","_v21","_v22","_radius","createNewSprite","localGroup","activateSpriteForCluster","cluster","drawClusters","clusters","currentIndex","getCluster","markersObj","first","newCluster","prop","Minimap","targetScene","positionAttributes","_box","_center","setCurrentCameraSettings","diameter","v4","cameraControl","_vector","LineSegmentsGeometry","InstancedBufferGeometry","lineSegments","instanceBuffer","InstancedInterleavedBuffer","InterleavedBufferAttribute","instanceColorBuffer","WireframeGeometry","maxRadiusSq","UniformsLib","ShaderLib","UniformsUtils","LineMaterial","ShaderMaterial","_start4","_end4","_ssOrigin","_ssOrigin3","_mvMatrix","_line","Line3","_closestPoint","_clipToWorldVector","LineSegments2","Mesh","instanceStart","instanceEnd","instanceDistanceBuffer","ray","resolution","lineWidth","ssMaxWidth","distanceToSphere","sphereMargin","distanceToBox","boxMargin","isBehindCameraNear","deltaDist","t","param","zPos","isInClipSpace","isInside","pointOnLine","Lines2","arrayIn","linesGeometry","faceIndex","vIndex","Region","parentIn","children","tMatrix","child","transformation","nameIn","paths","p","parentName","childRegion","childName","lowerChildName","pathArray","transverse","objectsList","boundingBox1","boundingBox2","objectsArray","childObjects","lowerObjectName","lowerGroupName","primitive","isNew","pointset","lines","opacity","visibility","zincGeometry","GLTFExporter","writer","GLTFLightExtension","GLTFMaterialsUnlitExtension","GLTFMaterialsPBRSpecularGlossiness","input","onDone","GLTFWriter","plugins","WEBGL_CONSTANTS","THREE_TO_WEBGL","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","ClampToEdgeWrapping","PATH_PROPERTIES","GLB_HEADER_BYTES","GLB_HEADER_MAGIC","GLB_VERSION","GLB_CHUNK_PREFIX_BYTES","GLB_CHUNK_TYPE_JSON","GLB_CHUNK_TYPE_BIN","equalArray","array1","array2","stringToArrayBuffer","isIdentityMatrix","getMinMax","output","getPaddedBufferSize","bufferSize","getPaddedArrayBuffer","arrayBuffer","paddingByte","paddedLength","cachedCanvas","buffers","extensionsUsed","blob","extensionsUsedList","reader","binaryChunk","binaryChunkPrefix","jsonChunk","jsonChunkPrefix","header","headerView","totalByteLength","glbBlob","glbReader","base64data","objectDef","extensionName","error","cache","mapDef","didTransform","transformDef","componentType","componentSize","byteLength","dataView","bufferViewDef","types","end2","minMax","bufferViewTarget","bufferView","accessorDef","format","pending","cachedImages","mimeType","RGBAFormat","imageDef","RGBFormat","bufferViewIndex","map","samplerDef","textureDef","ext","materialDef","metalRoughMapDef","baseColorMapDef","emissive","maxEmissiveComponent","emissiveMapDef","normalMapDef","occlusionMapDef","meshCacheKeyParts","meshCacheKey","meshDef","primitives","targets","nameConversion","originalNormal","modifiedAttribute","attributeName","accessor","weights","targetNames","reverseDictionary","warned","gltfAttributeName","baseAttribute","relativeAttribute","isMultiMaterial","cacheKey","isOrtho","cameraDef","root","nodeMap","tracks","channels","samplers","track","trackBinding","PropertyBinding","trackNode","trackProperty","inputItemSize","outputItemSize","interpolation","InterpolateDiscrete","node","skeleton","rootJoint","joints","inverseBindMatrices","temporaryBoneInverse","nodeDef","meshIndex","nodeIndex","sceneDef","nodes","Scene","objectsWithoutScene","func","light","lightDef","lights","extensionDef","specularFactor","specularMapDef","valueSize","times","values","interpolant","mergedTracks","sourceTracks","sourceTrack","sourceTrackBinding","sourceTrackNode","InterpolateLinear","targetCount","targetIndex","mergedTrack","sourceInterpolant","keyframeIndex","SceneExporter","binary","exporter","gltf","GLTFToZincJSLoader","allCompletedCallback","filename","GLTFLoader","_object_pattern","_material_library_pattern","_material_use_pattern","_map_use_pattern","_vA","_vB","_vC","_ab","_cb","ParserState","state","fromDeclaration","previousMaterial","libraries","previous","cloned","lastMultiMaterial","mi","declared","dst","ua","ub","uc","na","nb","nc","vLen","ia","ib","ic","nLen","uvLen","vi","uvi","OBJLoader","lineFirstChar","lineLength","trimLeft","vertexData","faceVertices","vertexParts","lineParts","lineVertices","lineUVs","li","llen","parts","pointData","container","Group","isLine","isPoints","hasVertexColors","createdMaterials","miLen","sourceMaterial","materialHash","materialLine","Material","materialPoints","MeshPhongMaterial","mergeGlyphData","glyphData","merge","glyphData1","glyphData2","field","geometry1","geometry2","IndexedSourcesHandler","urlIn","onDownloadedCallback","fileLoader","jsonLoader","onDownloaded","downloading","finished","items","processItemDownloaded","modelData","obj","processItemError","args","errorHandling","xhr","progressHandling","MultiSourcesHandler","onLoadCallback","allData","totalDownloaded","isGlyphData","PrimitivesLoader","concurrentDownloads","MAX_DOWNLOAD","jsonloader","fileloader","waitingList","indexedLoaders","loadFromMultipleSources","msHandler","newOptions","loadFromSingleSource","handleIndexedSource","indexedLoader","onFinally","onErrorCallback","STLLoader","isBinary","face_size","n_faces","solid","off","matchDataViewAt","query","parseBinary","hasColors","defaultR","defaultG","defaultB","dataOffset","faceLength","normalX","normalY","normalZ","packedColor","vertexstart","componentIdx","parseASCII","patternSolid","patternFace","faceCounter","patternFloat","patternVertex","patternNormal","groupCount","startVertex","endVertex","vertexCountPerFace","normalCountPerFace","ensureString","ensureBinary","array_buffer","binData","TubeLines","dataIn","geometryConfig","getTubeLinesGeometry","radialSegments","smooth","finalGeometry","curve","tubeGeometry","SceneLoader","viewLoaded","errorDownload","totalSize","totalLoaded","unknownFound","progress","loadMultipleViews","referenceURL","views","defaultView","promises","response","zincCameraControls","viewData","colours","opacities","timeEnabled","morphColour","targetRegion","jsonFilePrefix","filename_prefix","linesloader","lod","tubeLines","newLines","glyphsetloader","glyphurl","newGlyphset","myCallback","metaurl","pointsetloader","newPointset","loadSurfaceURL","fileFormat","metaFinishCallback","numberOfDownloaded","downloadedItem","newTexture","onLoadTextureReady","addZincGeometry","newGeometry","parseDuration","durationString","years","months","weeks","days","hours","mins","secs","readPrimitivesItem","newGeometryURL","readViewAndSettingsItem","loadRegions","currentRegion","regions","regionName","supplementPrimitivesArray","include","exclude","supplementMetadataInArray","getNumberOfDownloadsInArray","includeViews","getNumberOfObjectsInRegions","regionJson","counts","getNumberOfObjects","readVersionOneRegionPath","loadVersionOne","filteredMetada","numberOfObjects","loadVersionTwo","defaultMetadata","defaultDuration","containerIn","cameraHelper","sceneLoader","minimap","zincObjectAddedCallbacks","zincObjectAddedCallbacks_id","zincObjectRemovedCallbacks","zincObjectRemovedCallbacks_id","miniAxesScene","rootRegion","tempGroup","stereoEffectFlag","stereoEffect","scissor","_markerTarget","pickableObjectsList","markerCluster","axisDisplay","_v3","getDrawingWidth","getDrawingHeight","viewPort","GroupName","widthHalf","heightHalf","currentTime","videoHandlerIn","scenesGroup","getWindowsPosition","align","x_offset","y_offset","renderer_width","renderer_height","renderMinimap","stereoFlag","transitionTime","newVec1","newVec2","newVec3","scaleRadius","oldViewport","offsetY","convertDurationObjectTomSec","convertDurationObjectToString","string","millisec","dim","boxGeo","directions","planeGeo","fitBoundingBox","XYZ","xyzObj","arrowHelper","miniArrowHelper","axesLabel","enable","miniaxes","Renderer","currentScene","clock","preRenderCallbackFunctions","preRenderCallbackFunctions_id","postRenderCallbackFunctions","postRenderCallbackFunctions_id","contextLostCallbackFunctions","contextLostCallbackFunctions_id","contextRestoredCallbackFunctions","contextRestoredCallbackFunctions_id","animated_id","cameraOrtho","sceneOrtho","logoSprite","sceneMap","additionalActiveScenes","sensor","isRendering","isInitialised","localRect","onMobile","domCanvas","onContextLost","onContextRestored","oldScene","new_scene","runAnimation","createHUDSprites","imagewidth","imageheight","ResizeSensor","additionalScene","endingScene","currentCamera","version","PACKAGE","zinc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zinc.js","sources":["../src/three/Geometry.js","../src/assets/disc.png","../src/utilities.js","../src/primitives/augmentShader.js","../src/three/line/Line.js","../src/three/line/LineSegments.js","../src/primitives/lod.js","../src/assets/mapMarker.svg","../src/primitives/marker.js","../src/primitives/zincObject.js","../src/primitives/geometry.js","../src/primitives/label.js","../src/primitives/glyph.js","../src/three/Loader.js","../src/videoHandler.js","../src/loaders/JSONLoader.js","../src/primitives/glyphset.js","../src/three/Points.js","../src/primitives/pointset.js","../src/primitives/lines.js","../src/texture/texture.js","../src/texture/textureArray.js","../src/shaders/textureSlide.js","../src/primitives/texturePrimitive.js","../src/primitives/textureSlides.js","../src/controls.js","../src/assets/mapMarkerOrange.svg","../src/primitives/markerCluster.js","../src/minimap.js","../src/three/line/LineSegmentsGeometry.js","../src/three/line/LineMaterial.js","../src/three/line/LineSegments2.js","../src/primitives/lines2.js","../src/region.js","../src/three/GLTFExporter.js","../src/sceneExporter.js","../src/loaders/GLTFToZincJSLoader.js","../src/loaders/OBJLoader.js","../src/loaders/primitivesLoader.js","../src/loaders/STLLoader.js","../src/primitives/tubeLines.js","../src/sceneLoader.js","../src/scene.js","../src/renderer.js","../src/zinc.js"],"sourcesContent":["import {\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tEventDispatcher,\n\tFloat32BufferAttribute,\n\tMatrix3,\n\tMatrix4,\n\tMathUtils,\n\tObject3D,\n\tSphere,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst _m1 = new Matrix4();\nconst _obj = new Object3D();\nconst _offset = new Vector3();\nconst _temp = new Vector3();\n\nfunction Geometry() {\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 this.normals = [];\n this.uvs = [];\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\tthis.morphNormalsReady = 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.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\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.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\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\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 ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.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\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 return vertices;\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\tlet vertexNormals = tmpGeo.computeVertexNormals();\n\n if (vertexNormals && vertexNormals.length > 0) {\n this.morphTargets[i].normals = new Array( this.vertices.length );\n\n for ( let v = 0; v < vertexNormals.length; v ++ ) {\n \n this.morphTargets[i].normals[ v ] = vertexNormals[v].clone();\n \n }\n }\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 this.morphNormalsReady = true;\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\tmergeMorph: function ( geometry, matrix ) {\n\n\t\tconst m = this.morphTargets.length,\n\t\t\tmorphTargets1 = this.morphTargets,\n\t\t\tmorphTargets2 = geometry.morphTargets,\n\t\t\tn = this.morphColors.length,\n\t\t\tmorphColors1 = this.morphColors,\n\t\t\tmorphColors2 = geometry.morphColors;\n\n if ( m > 0 && m == morphTargets2.length) {\n\n\t\t\tfor ( let i = 0, l = morphTargets1.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphTarget1 = morphTargets1[ i ];\n\t\t\t\tconst morphTarget2 = morphTargets2[ i ];\n\n\t\t\t\tfor ( let k = 0, kl = morphTarget2.vertices.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst vertex = morphTarget2.vertices[ k ];\n\t\t\n\t\t\t\t\tconst vertexCopy = vertex.clone();\n\t\t\n\t\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\t\t\n\t\t\t\t\tmorphTarget1.vertices.push( vertexCopy );\n\t\t\n\t\t\t\t}\n\n\t\t\t\tif ( morphTarget1.normals && morphTarget2.normals ) {\n\t\t\t\t\t\n\t\t\t\t\tfor ( let k = 0; k < morphTarget2.normals.length; k = k + 3) {\n\n\t\t\t\t\t\t_temp.set(morphTarget2.normals2[k], morphTarget2.normals2[k + 1], morphTarget2.normals2[k + 2]);\n\t\t\t\n\t\t\t\t\t\tif ( matrix !== undefined ) _temp.applyMatrix4( matrix );\n\t\t\t\n\t\t\t\t\t\tmorphTarget1.normals.push(_temp.x, _temp.y, _temp.z);\n\t\t\t\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 ( n > 0 && n == morphColors2.length) {\n\n\t\t\tfor ( let i = 0, l = morphColors1.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphColor1 = morphColors1[ i ];\n\t\t\t\tconst morphColor2 = morphColors2[ i ];\n\n\t\t\t\tfor ( let k = 0, kl = morphColor2.colors; k < kl; k ++ ) {\n\n\t\t\t\t\tmorphColor1.colors.push( morphColor2.colors[ k ].clone() );\n\t\t\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\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\tnormals2 = geometry.normals,\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\tfor ( let i = 0; i < normals2.length; i = i + 3) {\n\n\t\t\t_temp.set(normals2[i], normals2[i + 1], normals2[i + 2]);\n\n\t\t\tif ( matrix !== undefined ) _temp.applyMatrix4( matrix );\n\n\t\t\tthis.normals.push(_temp.x, _temp.y, _temp.z);\n\n\t\t}\n\n\t\t// colors\n\n\t\tfor ( let i = 0, il = colors2.length; i < il; i ++ ) {\n\t\t\tif ((typeof colors2[ i ] === \"number\")) {\n\t\t\t\tcolors1.push( colors2[ i ] );\n\t\t\t} else {\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\t\t\t}\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\tthis.mergeMorph( geometry, matrix );\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\n\tcomputeGroups( ) {\n\n\t\tconst groups = [];\n\n\t\tlet group, i;\n\t\tlet materialIndex = undefined;\n\n\t\tconst faces = this.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\treturn groups;\n\n\t},\n\n\ttoBufferGeometry: function () {\n\n\t\tconst geometry = new DirectGeometry().fromGeometry( this );\n\n\t\tconst buffergeometry = new BufferGeometry();\n\n\t\tconst positions = new Float32Array( geometry.vertices.length * 3 );\n\t\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t}\n\n\t\t// groups\n\n\t\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.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\tbuffergeometry.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tbuffergeometry.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t},\n\n toIndexedBufferGeometry: function () {\n\n\t\t//const geometry = new DirectGeometry().fromGeometry( this );\n\n\t\tconst buffergeometry = new BufferGeometry();\n\n\t\tconst positions = new Float32Array( this.vertices.length * 3 );\n\t\tbuffergeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( this.vertices ) );\n\n\t\tif ( this.normals.length > 0 ) {\n\t\t\tconst normals = new Float32Array( this.normals.length );\n let buffer = new BufferAttribute( normals, 3 ).copyArray( this.normals );\n\t\t\tbuffergeometry.setAttribute( 'normal', buffer);\n\t\t}\n if ( this.uvs.length > 0 && this.uvs[0].length > 0 ) {\n\n\t\t\tconst uvs = new Float32Array( this.uvs[0].length * 2 );\n\t\t\tbuffergeometry.setAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyArray( this.uvs[0] ) );\n\t\t}\n\n\t\tif ( this.uvs.length > 1 && this.uvs[1].length > 0 ) {\n\t\t\tconst uvs2 = new Float32Array( this.uvs[1].length * 2 );\n\t\t\tbuffergeometry.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyArray( this.uvs[1] ) );\n\t\t}\n\n if ( this.colors.length > 0) {\n\n const colorArray = [];\n for (let i = 0 ; i < this.colors.length; i++) {\n colorArray.push(new Color( this.colors[ i ] ));\n }\n const colors = new Float32Array( colorArray.length * 3 );\n\t\t\tbuffergeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( colorArray ) );\n\n } else {\n\n const colorsArray = new Float32Array( this.vertices.length * 3 );\n for (let i = 0; i < this.vertices.length * 3; i++) {\n colorsArray[i] = 1.0;\n }\n buffergeometry.setAttribute( 'color', new BufferAttribute( colorsArray, 3 ) );\n \n }\n\n if (this.faces.length > 0) {\n\n let colors = [];\n\n let indices = [];\n\n for (let i = 0 ; i < this.faces.length; i++) {\n\n indices.push(this.faces[i].a, this.faces[i].b, this.faces[i].c);\n\n const vertexColors = this.faces[i].vertexColors;\n \n if ( vertexColors.length === 3 ) {\n \n colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n \n } else {\n \n const color = this.faces[i].color;\n \n colors.push( color, color, color );\n \n }\n\n }\n\n // if ( colors.length > 0 ) {\n\n// const colorsArray = new Float32Array( colors.length * 3 );\n// buffergeometry.setAttribute( 'color', new BufferAttribute( colorsArray, 3 ).copyColorsArray( colors ) );\n \n// }\n\n buffergeometry.setIndex( indices );\n\n buffergeometry.groups = this.computeGroups();\n\n }\n\n\t\t// morphs\n\n if (this.morphTargets.length > 0) {\n\n\t\t\tconst array = [];\n const normalsArray = [];\n\n\t\t\tfor ( let i = 0, l = this.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphTarget = this.morphTargets[ i ];\n\n\t\t\t\tconst attribute = new Float32BufferAttribute( morphTarget.vertices.length * 3, 3 );\n\t\t\t\tattribute.name = morphTarget.name;\n\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget.vertices ) );\n\n if (morphTarget.normals) {\n\n\n const attribute = new Float32BufferAttribute( morphTarget.normals.length * 3, 3 );\n attribute.name = morphTarget.name;\n\n normalsArray.push( attribute.copyVector3sArray( morphTarget.normals ) );\n \n }\n\n\t\t\t}\n\n\t\t\tbuffergeometry.morphAttributes.position = array;\n buffergeometry.morphAttributes.normal = normalsArray;\n\n\t\t}\n\n\t\t// skinning\n\n\t\tif ( this.skinIndices.length > 0 ) {\n\n\t\t\tconst skinIndices = new Float32BufferAttribute( this.skinIndices.length * 4, 4 );\n\t\t\tbuffergeometry.setAttribute( 'skinIndex', skinIndices.copyVector4sArray( this.skinIndices ) );\n\n\t\t}\n\n\t\tif ( this.skinWeights.length > 0 ) {\n\n\t\t\tconst skinWeights = new Float32BufferAttribute( this.skinWeights.length * 4, 4 );\n\t\t\tbuffergeometry.setAttribute( 'skinWeight', skinWeights.copyVector4sArray( this.skinWeights ) );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tbuffergeometry.boundingSphere = this.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tbuffergeometry.boundingBox = this.boundingBox.clone();\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t},\n\n\tcomputeTangents: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t},\n\n\tcomputeLineDistances: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );\n\n\t},\n\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\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nGeometry.createBufferGeometryFromObject = function ( object ) {\n\n\tlet buffergeometry = new BufferGeometry();\n\n\tconst geometry = object.geometry;\n\n\tif ( object.isPoints || object.isLine ) {\n\n\t\tconst positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\tconst colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\tbuffergeometry.setAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\tbuffergeometry.setAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\tconst lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\tbuffergeometry.setAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tbuffergeometry.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tbuffergeometry.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t} else if ( object.isMesh ) {\n\n\t\tbuffergeometry = geometry.toBufferGeometry();\n\n\t}\n\n\treturn buffergeometry;\n\n};\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\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\nexport { Face3, Geometry };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sHDgwCEMBJZu0AAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAABM5JREFUWMO1V0tPG2cUPZ4Hxh6DazIOrjFNqJs0FIMqWFgWQkatsmvVbtggKlSVRVf5AWz4AWz4AUSKEChll19QJYSXkECuhFxsHjEhxCYm+DWGMZ5HF72DJq4bAzFXurI0M/I5997v3u9cC65vTJVn2lX/xHINQOYSBLTLEuIuCWw4Z3IGAEvf6ASmVHjNzHCXBG4A0AjACsAOwEbO0nsFQBnAGYASAIl+ZRMR7SolMEdsByD09fV5R0ZGgg8ePPjW5/N1iqLYpuu6RZblciKR2I9Go69evnwZnZ+fjwI4IS8AKBIRzeQfJWCANwKwh0KhtrGxsYehUOin1tbW+zzP23ietzY2NnIAoGmaLsuyUiqVyvl8XtrY2NiamZn589mzZxsAUgCOAeQAnFI2tI+VxIjaAeDzoaGh7xYWFuZOTk6OZVk+12uYqqq6JEnn0Wg0OT4+/geAXwGEAdwDIFJQXC1wO4DWR48e/RCPxxclSSroVzRFUbSDg4P848ePFwH8DuAhkWih83TRQWxFOXgAwvDwcOfo6OhvXV1d39tsNtuVBwTDWBwOh1UUxVsMw1hXVlbSdCgNV43uYSvrHg6H24aHh38eHBz85TrgF9FYLHA4HLzH43FvbW2d7u/vG+dANp8FpqIlbd3d3V8Fg8EfBUFw4BONZVmL3+9vHhkZCQL4AoAHgJPK8G+yzC0XDofdoVAo5PP5vkadTBAEtr+/39ff3x8gAp/RPOEqx2qjx+NpvXv3bk9DQ0NDvQgwDIOWlhZrMBj8kgi0UJdxRgYMArzL5XJ7vd57qLPZ7Xamp6fnNgBXtQxcjFuHw+Hyer3t9SYgCAITCAScAJoBNNEY/08GOFVVrfVMv7kMNDntFD1vjIAPrlRN0xjckOm6biFQ3jwNPwDMZrOnqVTqfb3Bi8Wivru7W/VCYkwPlKOjo0IikXh7EwQikYgE4Nw0CfXKDCipVCoTj8df3QABbW1tLUc6oUgkFPMkVACUNjc337148eKvw8PDbJ2jP1taWkoCyNDVXDSECmNSK4qiKNLq6urW8+fPI/UicHx8rD59+jSVy+WOAKSJhKENwFItLtoxk8mwsixzHR0dHe3t7c5PAU+n09rs7OzJkydPYqVSaQfANoDXALIk31S2smU1TWMPDg7K5XKZ7+3t9TudTut1U7+wsFCcmJiIpdPpbQBxADsAknQWymYCOukBHYCuKApisdhpMpnURFEU79y503TVyKenpzOTk5M7e3t7MQKPV0Zv1gNm+awB0MvlshqLxfLb29uyJElWURSbXC4XXyvqxcXFs6mpqeTc3Nzu3t7e3wQcA7BPZ8Cov1pNlJplmQtAG8MwHV6v95tAINA5MDBwPxAIuLu6upr8fr/VAN3c3JQjkcjZ+vp6fnl5+d2bN29SuVzuNYAEpf01CdRChUL+X1VskHACuA3Ay3Fcu9vt7nA6nZ7m5uYWQRCaNE3jVVW15PP580KhIGUymWw2m00DOAJwSP4WwPtq4LX2Ao6USxNlQyS/RcQcdLGwlNIz6vEMAaZpNzCk2Pll94LK/cDYimxERiBwG10sxjgvEZBE0UpE6vxj+0Ct5bTaXthgEhRmja8QWNkkPGsuIpfdjpkK+cZUWTC0KredVmtD/gdlSl6EG4AMvQAAAABJRU5ErkJggg==\"","import * as THREE from 'three';\nimport { Geometry as THREEGeometry } from './three/Geometry';\nimport SpriteTextModule from 'three-spritetext';\nconst SpriteText = SpriteTextModule.default || SpriteTextModule;\nimport Zinc from './zinc';\nimport discPNG from './assets/disc.png';\n\nfunction resolveURL(url) {\n\tlet actualURL = url;\n\tlet prefix = Zinc.modelPrefix;\n\n\tif (prefix) {\n\t\tif (prefix[prefix.length -1] != '/')\n\t\t\tprefix = prefix + '/';\n\t\tconst r = new RegExp('^(?:[a-z]+:)?//', 'i');\n\t\tif (!r.test(url)) {\n\t\t\tactualURL = prefix + url;\n\t\t}\n\t}\n\n\treturn actualURL;\n}\n\nfunction createNewURL(target, reference) {\n const getNewURL = (target, reference) => {\n try {\n let newURL = (new URL(target, reference)).href;\n //Make sure the target url does not contain parameters\n if (target && target.split(\"?\").length < 2) {\n const paramsStrings = reference.split(\"?\");\n //There are parameters, add them to the target\n if (paramsStrings.length === 2) {\n newURL = newURL + \"?\" + paramsStrings[1];\n }\n }\n return newURL;\n } catch {\n console.error(`There is an issue creating the url link with: ${target}.` );\n }\n }\n if (!Array.isArray(target)) {\n return getNewURL(target, reference);\n } else {\n const urls = [];\n target.forEach((url) => {\n urls.push(getNewURL(url, reference));\n });\n return urls;\n }\n}\n\n/*\n * Calculate the bounding box of a mesh, values will be\n * set for cachedBox, b1, v1 and v2 and they need to be\n * defined.\n */\nfunction getBoundingBox(mesh, cachedBox, b1, v1, v2) {\n let influences = mesh.morphTargetInfluences;\n let attributes = undefined;\n if (mesh.geometry)\n attributes = mesh.geometry.morphAttributes;\n let found = false;\n if (influences && attributes && attributes.position) {\n v1.set(0.0, 0.0, 0.0);\n v2.set(0.0, 0.0, 0.0);\n for (let i = 0; i < influences.length; i++) {\n if (influences[i] > 0) {\n found = true;\n b1.setFromArray(attributes.position[i].array);\n v1.add(b1.min.multiplyScalar(influences[i]));\n v2.add(b1.max.multiplyScalar(influences[i]));\n }\n }\n if (found) {\n cachedBox.set(v1, v2);\n }\n }\n if (!found) {\n cachedBox.setFromBufferAttribute(\n mesh.geometry.attributes.position);\n }\n mesh.updateWorldMatrix(true, true);\n cachedBox.applyMatrix4(mesh.matrixWorld);\n}\n\n\n//Convenient function\nfunction loadExternalFile(url, data, callback, errorCallback) {\n // Set up an asynchronous request\n fetch(resolveURL(url))\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then((responseText) => {\n callback(responseText, data);\n })\n .catch((error) => {\n console.error(`Fetch string payload retrieval failed for: ${requestURL}`, error);\n errorCallback(url);\n });\n}\n\nfunction loadExternalFiles(urls, callback, errorCallback) {\n const numUrls = urls.length;\n let numComplete = 0;\n const result = [];\n\n // Callback for a single file\n function partialCallback(text, urlIndex) {\n result[urlIndex] = text;\n numComplete++;\n\n // When all files have downloaded\n if (numComplete == numUrls) {\n callback(result);\n }\n }\n\n for (let i = 0; i < numUrls; i++) {\n \tloadExternalFile(urls[i], i, partialCallback, errorCallback);\n }\n}\n\n\n//Get the colours at index\nconst getColorsRGB = (colors, index) => {\n const index_in_colors = Math.floor(index/3);\n const remainder = index%3;\n let hex_value = 0;\n if (remainder == 0)\n {\n hex_value = colors[index_in_colors].r;\n }\n else if (remainder == 1)\n {\n hex_value = colors[index_in_colors].g;\n }\n else if (remainder == 2)\n {\n hex_value = colors[index_in_colors].b;\n }\n const mycolor = new THREE.Color(hex_value);\n return [mycolor.r, mycolor.g, mycolor.b];\n}\n\nconst updateMorphColorAttribute = function(targetGeometry, morph) {\n if (morph && targetGeometry && targetGeometry.morphAttributes &&\n targetGeometry.morphAttributes[ \"color\" ]) {\n const morphColors = targetGeometry.morphAttributes[ \"color\" ];\n const influences = morph.morphTargetInfluences;\n const length = influences.length;\n targetGeometry.deleteAttribute( 'morphColor0' );\n targetGeometry.deleteAttribute( 'morphColor1' );\n let bound = 0;\n let morphArray = [];\n for (let i = 0; (1 > bound) || (i < length); i++) {\n if (influences[i] > 0) {\n bound++;\n morphArray.push([i, influences[i]]);\n }\n }\n if (morphArray.length == 2) {\n targetGeometry.setAttribute('morphColor0', morphColors[ morphArray[0][0] ] );\n targetGeometry.setAttribute('morphColor1', morphColors[ morphArray[1][0] ] );\n } else if (morphArray.length == 1) {\n targetGeometry.setAttribute('morphColor0', morphColors[ morphArray[0][0] ] );\n targetGeometry.setAttribute('morphColor1', morphColors[ morphArray[0][0] ] );\n }\n }\n}\n\n\nconst toBufferGeometry = (geometryIn, options) => {\n let geometry = undefined;\n if (geometryIn instanceof THREEGeometry) {\n if (options.localTimeEnabled && !geometryIn.morphNormalsReady &&\n (geometryIn.morphNormals == undefined || geometryIn.morphNormals.length == 0))\n geometryIn.computeMorphNormals();\n geometry = geometryIn.toIndexedBufferGeometry();\n if (options.localMorphColour) {\n copyMorphColorsToIndexedBufferGeometry(geometryIn, geometry);\n }\n } else if (geometryIn instanceof THREE.BufferGeometry) {\n geometry = geometryIn.clone();\n }\n geometry.colorsNeedUpdate = true;\n geometry.computeBoundingBox();\n geometry.computeBoundingSphere();\n if (geometryIn._video)\n geometry._video = geometryIn._video;\n return geometry;\n}\n\nconst copyMorphColorsToBufferGeometry = (geometry, bufferGeometry) => {\n if (geometry && geometry.morphColors && geometry.morphColors.length > 0 ) {\n let array = [];\n let morphColors = geometry.morphColors;\n for ( var i = 0, l = morphColors.length; i < l; i ++ ) {\n let morphColor = morphColors[ i ];\n let colorArray = [];\n for ( var j = 0; j < geometry.faces.length; j ++ ) {\n let face = geometry.faces[j];\n let color = getColorsRGB(morphColor.colors, face.a);\n colorArray.push(color[0], color[1], color[2]);\n color = getColorsRGB(morphColor.colors, face.b);\n colorArray.push(color[0], color[1], color[2]);\n color = getColorsRGB(morphColor.colors, face.c);\n colorArray.push(color[0], color[1], color[2]);\n }\n var attribute = new THREE.Float32BufferAttribute( geometry.faces.length * 3 * 3, 3 );\n attribute.name = morphColor.name;\n array.push( attribute.copyArray( colorArray ) );\n }\n bufferGeometry.morphAttributes[ \"color\" ] = array;\n }\n}\n\n\nconst copyMorphColorsToIndexedBufferGeometry = (geometry, bufferGeometry) => {\n if (geometry && geometry.morphColors && geometry.morphColors.length > 0 ) {\n let array = [];\n let morphColors = geometry.morphColors;\n for ( let i = 0, l = morphColors.length; i < l; i ++ ) {\n const morphColor = morphColors[ i ];\n const colorArray = [];\n for ( let j = 0; j < morphColor.colors.length * 3; j ++ ) {\n let color = getColorsRGB(morphColor.colors, j);\n colorArray.push(color[0], color[1], color[2]);\n }\n const attribute = new THREE.Float32BufferAttribute( colorArray, 3 );\n attribute.name = morphColor.name;\n array.push( attribute );\n }\n bufferGeometry.morphAttributes[ \"color\" ] = array;\n }\n}\n\n/**\n * Merges a set of attributes into a single instance. All attributes must have compatible properties and types.\n * Instances of {@link InterleavedBufferAttribute} are not supported.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to merge.\n * @return {?BufferAttribute} The merged attribute. Returns `null` if the merge does not succeed.\n */\nfunction mergeAttributes( attributes ) {\n\n let TypedArray;\n let itemSize;\n let normalized;\n let gpuType = - 1;\n let arrayLength = 0;\n\n for ( let i = 0; i < attributes.length; ++ i ) {\n\n const attribute = attributes[ i ];\n\n if ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n if ( TypedArray !== attribute.array.constructor ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n return null;\n\n }\n\n if ( itemSize === undefined ) itemSize = attribute.itemSize;\n if ( itemSize !== attribute.itemSize ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n return null;\n\n }\n\n if ( normalized === undefined ) normalized = attribute.normalized;\n if ( normalized !== attribute.normalized ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n return null;\n\n }\n\n if ( gpuType === - 1 ) gpuType = attribute.gpuType;\n if ( gpuType !== attribute.gpuType ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n return null;\n\n }\n\n arrayLength += attribute.count * itemSize;\n\n }\n\n const array = new TypedArray( arrayLength );\n const result = new THREE.BufferAttribute( array, itemSize, normalized );\n let offset = 0;\n\n for ( let i = 0; i < attributes.length; ++ i ) {\n\n const attribute = attributes[ i ];\n if ( attribute.isInterleavedBufferAttribute ) {\n\n const tupleOffset = offset / itemSize;\n for ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n for ( let c = 0; c < itemSize; c ++ ) {\n\n const value = attribute.getComponent( j, c );\n result.setComponent( j + tupleOffset, c, value );\n\n }\n\n }\n\n } else {\n\n array.set( attribute.array, offset );\n\n }\n\n offset += attribute.count * itemSize;\n\n }\n\n if ( gpuType !== undefined ) {\n\n result.gpuType = gpuType;\n\n }\n\n return result;\n\n}\n\n/**\n * Merges a set of geometries into a single instance. All geometries must have compatible attributes.\n *\n * @param {Array<BufferGeometry>} geometries - The geometries to merge.\n * @param {boolean} [useGroups=false] - Whether to use groups or not.\n * @return {?BufferGeometry} The merged geometry. Returns `null` if the merge does not succeed.\n */\nconst mergeGeometries = ( geometries, useGroups = false ) => {\n\n const isIndexed = geometries[ 0 ].index !== null;\n\n const attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n const morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n const attributes = {};\n const morphAttributes = {};\n\n const morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n const mergedGeometry = new THREE.BufferGeometry();\n\n let offset = 0;\n\n for ( let i = 0; i < geometries.length; ++ i ) {\n\n const geometry = geometries[ i ];\n let attributesCount = 0;\n\n // ensure that all geometries are indexed, or none\n\n if ( isIndexed !== ( geometry.index !== null ) ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n return null;\n\n }\n\n // gather attributes, exit early if they're different\n\n for ( const name in geometry.attributes ) {\n\n if ( ! attributesUsed.has( name ) ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n return null;\n\n }\n\n if ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n attributes[ name ].push( geometry.attributes[ name ] );\n\n attributesCount ++;\n\n }\n\n // ensure geometries have the same number of attributes\n\n if ( attributesCount !== attributesUsed.size ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n return null;\n\n }\n\n // gather morph attributes, exit early if they're different\n\n if ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n return null;\n\n }\n\n for ( const name in geometry.morphAttributes ) {\n\n if ( ! morphAttributesUsed.has( name ) ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n return null;\n\n }\n\n if ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n morphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n }\n\n if ( useGroups ) {\n\n let count;\n\n if ( isIndexed ) {\n\n count = geometry.index.count;\n\n } else if ( geometry.attributes.position !== undefined ) {\n\n count = geometry.attributes.position.count;\n\n } else {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n return null;\n\n }\n\n mergedGeometry.addGroup( offset, count, i );\n\n offset += count;\n\n }\n\n }\n\n // merge indices\n\n if ( isIndexed ) {\n\n let indexOffset = 0;\n const mergedIndex = [];\n\n for ( let i = 0; i < geometries.length; ++ i ) {\n\n const index = geometries[ i ].index;\n\n for ( let j = 0; j < index.count; ++ j ) {\n\n mergedIndex.push( index.getX( j ) + indexOffset );\n\n }\n\n indexOffset += geometries[ i ].attributes.position.count;\n\n }\n\n mergedGeometry.setIndex( mergedIndex );\n\n }\n\n // merge attributes\n\n for ( const name in attributes ) {\n\n const mergedAttribute = mergeAttributes( attributes[ name ] );\n\n if ( ! mergedAttribute ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n return null;\n\n }\n\n mergedGeometry.setAttribute( name, mergedAttribute );\n\n }\n\n // merge morph attributes\n\n for ( const name in morphAttributes ) {\n\n const numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n if ( numMorphTargets === 0 ) break;\n\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[ name ] = [];\n\n for ( let i = 0; i < numMorphTargets; ++ i ) {\n\n const morphAttributesToMerge = [];\n\n for ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n morphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n }\n\n const mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n if ( ! mergedMorphAttribute ) {\n\n console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n return null;\n\n }\n\n mergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n }\n\n }\n\n return mergedGeometry;\n\n}\n\nconst mergeVertices = ( geometry, tolerance = 1e-4 ) => {\n\n tolerance = Math.max( tolerance, Number.EPSILON );\n\n // Generate an index buffer if the geometry doesn't have one, or optimize it\n // if it's already available.\n var hashToIndex = {};\n var indices = geometry.getIndex();\n var positions = geometry.getAttribute( 'position' );\n var vertexCount = indices ? indices.count : positions.count;\n\n // next value for triangle indices\n var nextIndex = 0;\n\n // attributes and new attribute arrays\n var attributeNames = Object.keys( geometry.attributes );\n var attrArrays = {};\n var morphAttrsArrays = {};\n var newIndices = [];\n var getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\n // initialize the arrays\n for ( var i = 0, l = attributeNames.length; i < l; i ++ ) {\n var name = attributeNames[ i ];\n\n attrArrays[ name ] = [];\n\n var morphAttr = geometry.morphAttributes[ name ];\n if ( morphAttr ) {\n\n morphAttrsArrays[ name ] = new Array( morphAttr.length ).fill().map( () => [] );\n\n }\n\n }\n\n // convert the error tolerance to an amount of decimal places to truncate to\n var decimalShift = Math.log10( 1 / tolerance );\n var shiftMultiplier = Math.pow( 10, decimalShift );\n for ( var i = 0; i < vertexCount; i ++ ) {\n\n var index = indices ? indices.getX( i ) : i;\n\n // Generate a hash for the vertex attributes at the current index 'i'\n var hash = '';\n for ( var j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n var name = attributeNames[ j ];\n var attribute = geometry.getAttribute( name );\n var itemSize = attribute.itemSize;\n\n for ( var k = 0; k < itemSize; k ++ ) {\n\n // double tilde truncates the decimal value\n hash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * shiftMultiplier ) },`;\n\n }\n\n }\n\n // Add another reference to the vertex if it's already\n // used by another index\n if ( hash in hashToIndex ) {\n\n newIndices.push( hashToIndex[ hash ] );\n\n } else {\n\n // copy data to the new index in the attribute arrays\n for ( var j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n var name = attributeNames[ j ];\n var attribute = geometry.getAttribute( name );\n var morphAttr = geometry.morphAttributes[ name ];\n var itemSize = attribute.itemSize;\n var newarray = attrArrays[ name ];\n var newMorphArrays = morphAttrsArrays[ name ];\n\n for ( var k = 0; k < itemSize; k ++ ) {\n\n var getterFunc = getters[ k ];\n newarray.push( attribute[ getterFunc ]( index ) );\n\n if ( morphAttr ) {\n\n for ( var m = 0, ml = morphAttr.length; m < ml; m ++ ) {\n\n newMorphArrays[ m ].push( morphAttr[ m ][ getterFunc ]( index ) );\n\n }\n\n }\n\n }\n\n }\n\n hashToIndex[ hash ] = nextIndex;\n newIndices.push( nextIndex );\n nextIndex ++;\n\n }\n\n }\n\n // Generate typed arrays from new attribute arrays and update\n // the attributeBuffers\n const result = geometry.clone();\n for ( var i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n var name = attributeNames[ i ];\n var oldAttribute = geometry.getAttribute( name );\n var attribute;\n\n var buffer = new oldAttribute.array.constructor( attrArrays[ name ] );\n if ( oldAttribute.isInterleavedBufferAttribute ) {\n\n attribute = new THREE.BufferAttribute( buffer, oldAttribute.itemSize, oldAttribute.itemSize );\n\n } else {\n\n attribute = geometry.getAttribute( name ).clone();\n attribute.setArray( buffer );\n\n }\n\n result.setAttribute( name, attribute );\n\n // Update the attribute arrays\n if ( name in morphAttrsArrays ) {\n\n for ( var j = 0; j < morphAttrsArrays[ name ].length; j ++ ) {\n\n var morphAttribute = geometry.morphAttributes[ name ][ j ].clone();\n morphAttribute.setArray( new morphAttribute.array.constructor( morphAttrsArrays[ name ][ j ] ) );\n result.morphAttributes[ name ][ j ] = morphAttribute;\n\n }\n\n }\n\n }\n\n // Generate an index buffer typed array\n var cons = Uint8Array;\n if ( newIndices.length >= Math.pow( 2, 8 ) ) cons = Uint16Array;\n if ( newIndices.length >= Math.pow( 2, 16 ) ) cons = Uint32Array;\n\n var newIndexBuffer = new cons( newIndices );\n var newIndices = null;\n if ( indices === null ) {\n\n newIndices = new THREE.BufferAttribute( newIndexBuffer, 1 );\n\n } else {\n\n newIndices = geometry.getIndex().clone();\n newIndices.setArray( newIndexBuffer );\n\n }\n\n result.setIndex( newIndices );\n\n return result;\n}\n\nfunction PhongToToon(materialIn) {\n\tif (materialIn.isMeshPhongMaterial) {\n\t\tlet material = new THREE.MeshToonMaterial({\n\t\t\tcolor : materialIn.color.clone(),\n\t\t\tmorphTargets : materialIn.morphTargets,\n\t\t\tmorphNormals : materialIn.morphNormals,\n\t\t\tvertexColors : materialIn.vertexColors,\n\t\t\ttransparent : materialIn.transparent,\n\t\t\topacity : materialIn.opacity,\n\t\t\tside : materialIn.side\n\t\t});\n\t\tif (materialIn.map)\n\t\t\tmaterial.map = materialIn.map;\n\t\treturn material;\n\t}\n\n\treturn materialIn;\n}\n\n/**\n * Create and return a new buffer geometry with the size of length,\n * and initial coords.\n */\nfunction createBufferGeometry(length, coords) {\n if (coords && (length >= coords.length)) {\n const geometry = new THREE.BufferGeometry()\n const vertices = new Float32Array(length * 3);\n let i = 0;\n coords.forEach(coord => {\n vertices[i++] = coord[0];\n vertices[i++] = coord[1];\n vertices[i++] = coord[2];\n });\n geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n geometry.setDrawRange(0, coords.length);\n return geometry;\n }\n return undefined;\n};\n\nfunction getCircularTexture() {\n const image = new Image();\n image.src = discPNG;\n const texture = new THREE.Texture();\n texture.image = image;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction createNewSpriteText(text, height, colour, font, pixel, weight) {\n const sprite = new SpriteText(text, height, colour, font, pixel, weight);\n sprite.fontFace = font;\n sprite.fontSize = pixel;\n sprite.fontWeight = weight;\n sprite.material.map.generateMipmaps = false;\n sprite.material.map.anisotropy = 4;\n sprite.material.sizeAttenuation = false;\n sprite.material.alphaTest = 0.5;\n sprite.material.transparent = true;\n sprite.material.depthWrite = false;\n sprite.material.depthTest = false;\n sprite.center.set(0.5, -1.2);\n sprite.renderOrder = 10000;\n return sprite;\n}\n\n/*\n * Check if the compare path match with the region or/and group.\n * comparePath should be in the form of regionPath/Group.\n * * can be used as wildcard.\n * comparePath will be used to compare both region and group if it\n * is a single string without /\n */\nfunction isRegionGroup(regionPath, groupName, comparePath) {\n if (comparePath) {\n const region = regionPath ? regionPath : \"\";\n const group = groupName ? groupName : \"\";\n const n = comparePath.lastIndexOf('/');\n if (n > -1) {\n let r = undefined;\n let g = undefined;\n r = comparePath.substring(0, n);\n g = comparePath.substring(n + 1);\n if (r === \"*\" || r === \"**\" || r.toLowerCase() === region.toLowerCase()) {\n if (g === \"*\" || g === \"**\" || g.toLowerCase() === group.toLowerCase()) {\n return true;\n }\n }\n } else {\n //one single value if one of the region / group matches\n if (region.toLowerCase() === comparePath.toLowerCase() ||\n group.toLowerCase() === comparePath.toLowerCase()) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction removeVertexAtIndex(geometry, index, maintainLength) {\n const positionAttribute = geometry.getAttribute('position');\n const normalAttribute = geometry.getAttribute('normal'); // Also update other attributes\n\n if (!positionAttribute) return;\n\n const itemSize = positionAttribute.itemSize; // e.g., 3 for x, y, z\n const start = index * itemSize;\n const deleteCount = itemSize;\n let removed = false;\n\n // Helper to remove elements from a typed array\n const removeElements = (attribute, name) => {\n let removed = false;\n const array = Array.from(attribute.array);\n if (array.length >= (start + deleteCount)) {\n array.splice(start, deleteCount); // Use splice for removal\n if (maintainLength) {\n array.concat(new Array(deleteCount).fill(0));\n }\n removed = true;\n const newArray = new Float32Array(array);\n geometry.setAttribute(name, new THREE.BufferAttribute(newArray, itemSize));\n geometry.getAttribute(name).needsUpdate = true;\n }\n // Create new BufferAttribute with the modified array\n\n return removed;\n };\n\n removed = removeElements(positionAttribute, 'position');\n if (normalAttribute) removeElements(normalAttribute, 'normal');\n // Repeat for 'uv', 'color', etc.\n\n // If the geometry is indexed, the index buffer will also need adjustment\n if (geometry.index !== null) {\n // This is more complex, typically easier to work with non-indexed geometry when modifying vertices\n console.warn(\"Removing vertices from indexed geometry requires index buffer recalculation.\");\n }\n\n return removed;\n\n}\n\n\nexport {\n copyMorphColorsToBufferGeometry,\n createBufferGeometry,\n createNewSpriteText,\n createNewURL,\n getBoundingBox,\n getCircularTexture,\n getColorsRGB,\n isRegionGroup,\n loadExternalFile,\n loadExternalFiles,\n mergeGeometries,\n mergeVertices,\n PhongToToon,\n removeVertexAtIndex,\n resolveURL,\n updateMorphColorAttribute,\n toBufferGeometry,\n };\n\n","\n/**\n * Provide additional shaders to render time dependent color.\n */\nconst augmentMorphColor = function() {\n return function(shader) {\n shader.vertexShader = shader.vertexShader.replace(\n '#include <color_pars_vertex>',\n [\n\t 'varying vec3 vColor;',\n 'attribute vec3 morphColor0;',\n 'attribute vec3 morphColor1;'\n ].join( '\\n' )\n );\n shader.vertexShader = shader.vertexShader.replace(\n '#include <color_vertex>',\n [\n 'vColor.xyz = color.xyz;',\n '#ifdef USE_MORPHTARGETS',\n 'vColor = morphColor0 * morphTargetInfluences[ 0 ];',\n 'vColor += morphColor1 * morphTargetInfluences[ 1 ];',\n '#endif'\n ].join( '\\n' )\n );\n };\n}\n\nexport { augmentMorphColor };","import {\n BufferGeometry,\n Float32BufferAttribute,\n LineBasicMaterial,\n\tMatrix4,\n Object3D,\n Ray,\n\tSphere,\n\tVector3\n} from 'three';\n\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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() {\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\tconsole.error( 'THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n const drawRange = geometry.drawRange;\n const morphPosition = geometry.morphAttributes.position;\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\t\t_sphere.radius += threshold;\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\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 start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n const b = index.getX( i + 1 );\n \n calculatePosition( vStart, vEnd, this, positionAttribute, morphPosition, a, b );\n\n\t\t\t\t\tconst distSq = _ray.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\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n calculatePosition( vStart, vEnd, this, positionAttribute, morphPosition, i, i+1 );\n\n\t\t\t\t\tconst distSq = _ray.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\tconsole.error( 'THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\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\nfunction calculatePosition( vStart, vEnd, object, position, morphPosition, a, b )\t{\n\n vStart.fromBufferAttribute( position, a );\n vEnd.fromBufferAttribute( position, b );\n\n var morphInfluences = object.morphTargetInfluences;\n\n if ( object.material.morphTargets && morphPosition && morphInfluences ) {\n\n _morphA.set( 0, 0, 0 );\n _morphB.set( 0, 0, 0 );\n\n for ( var i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n var influence = morphInfluences[ i ];\n var morphAttribute = morphPosition[ i ];\n\n if ( influence === 0 ) continue;\n\n _tempA.fromBufferAttribute( morphAttribute, a );\n _tempB.fromBufferAttribute( morphAttribute, b );\n\n _morphA.addScaledVector( _tempA.sub( vStart ), influence );\n _morphB.addScaledVector( _tempB.sub( vEnd ), influence );\n\n }\n\n vStart.add( _morphA );\n vEnd.add( _morphB );\n\n }\n\n}\n\nLine.prototype.isLine = true;\n\n\nexport { Line };","import { Line } from './Line.js';\nimport {\n Float32BufferAttribute,\n\tVector3\n} from 'three';\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\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.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t_end.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.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.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\tconsole.error( 'THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineSegments.prototype.isLineSegments = true;\n\nexport { LineSegments };","import * as THREE from 'three';\nimport { toBufferGeometry, updateMorphColorAttribute } from '../utilities';\nimport { LineSegments } from '../three/line/LineSegments';\n\n/**\n * Provides an object which stores meshes at different levels based\n * on specified distance.\n * This object is ued by zincObject to provide mesh at different LODs.\n * A layer is displayed when the distance from the camera is greater\n * than its specified distance and closest compared to other layers.\n * This is intended to be an internal object used only by Zinc Object.\n *\n * This object assumes the centroid and bounding box are consistent between\n * different level of layers.\n *\n * @class\n * @author Alan Wu\n * @return {LOD}\n */\nconst LOD = function (parent) {\n this.levels = [];\n this._currentLevel = 0;\n this._renderOrder = 1;\n this._material = undefined;\n this._secondaryMaterial = undefined;\n this._loader = undefined;\n //The owning Zinc Object\n this._parent = parent;\n\n /*\n * Add a level of LOD at the specified distance\n */\n this.addLevel = (object, distanceIn) => {\n if (object) {\n const distance = Math.abs(distanceIn);\n let l;\n for (l = 0; l < this.levels.length; l++) {\n if (distance < this.levels[l].distance) {\n break;\n }\n }\n const levelObject = {\n distance: distance,\n morph: object,\n loaded: true,\n loading: false,\n url: \"\",\n };\n this.levels.splice(l, 0, levelObject);\n object.renderOrder = this._renderOrder;\n //this.add( object );\n }\n }\n\n /*\n * This is called once an ondemand level is loaded\n */\n this.levelLoaded = (object, distanceIn) => {\n if (object) {\n const distance = Math.abs(distanceIn);\n for (let l = 0; l < this.levels.length; l++) {\n if (distance === this.levels[l].distance) {\n this._parent.group.add(object);\n this.levels[l].morph = object;\n this.levels[l].loaded = true;\n this.levels[l].loading = false;\n break;\n }\n }\n this.checkTransparentMesh();\n }\n }\n\n this.addLevelFromURL = (loader, level, url, index, preload) => {\n this._loader = loader;\n const distance = this.calculateDistance(level);\n const levelObject = {\n distance: distance,\n morph: undefined,\n loaded: false,\n loading: false,\n url: url,\n index: index,\n };\n let l;\n for (l = 0; l < this.levels.length; l++) {\n if (distance < this.levels[l].distance) {\n break;\n }\n }\n this.levels.splice(l, 0, levelObject);\n if (preload) {\n this.loadLevel(l);\n }\n }\n\n //load the mesh at index, return true if morph is not ready\n this.loadLevel = (index) => {\n const level = this.levels[index];\n if (!level.morph && !level.loaded &&\n !level.loading) {\n level.loading = true;\n this._loader.load(level.url, this.lodLoader(level.distance),\n undefined, undefined, {index: level.index});\n }\n return (level.morph === undefined);\n }\n\n\n this.calculateDistance = function (level) {\n this._parent.getBoundingBox();\n const radius = this._parent.radius;\n let distance = 0;\n if (level === \"far\") {\n distance = radius * 4.5;\n } else if (level === \"medium\") {\n distance = radius * 2.5;\n } else if (level === \"close\") {\n distance = 0;\n }\n return distance;\n }\n\n /**\n * Check if there are multiple levels.\n */\n this.containsLevels = () => {\n if (this.levels && this.levels.length > 1) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if material is transparent, create secondary mesh\n * for better rendering if required.\n */\n this.checkTransparentMesh = () => {\n const level = this.levels[this._currentLevel];\n if (this._material) {\n if (this._material.transparent) {\n if (!this._secondaryMaterial) {\n this._secondaryMaterial = this._material.clone();\n this._secondaryMaterial.side = THREE.FrontSide;\n }\n this._secondaryMaterial.opacity = this._material.opacity;\n if (this._secondaryMaterial.emissive) {\n this._secondaryMaterial.emissive.copy(this._material.emissive);\n }\n this._secondaryMaterial.needsUpdate = true;\n // THREE.Mesh - for utilities purpose such as rendering\n // transparent surfaces - one for front face and one for back face.\n if (!level.secondaryMesh) {\n level.secondaryMesh = new THREE.Mesh(level.morph.geometry,\n this._secondaryMaterial);\n level.secondaryMesh.renderOrder = level.morph.renderOrder + 1;\n level.secondaryMesh.userData = level.morph.userData;\n level.secondaryMesh.name = level.morph.name;\n }\n this._material.side = THREE.BackSide;\n this._material.needsUpdate = true;\n if (!level.secondaryMesh.parent) {\n level.morph.add(level.secondaryMesh);\n if (this._parent.animationGroup) {\n this._parent.animationGroup.add(level.secondaryMesh);\n }\n }\n } else {\n if (level.secondaryMesh) {\n //Do not delete this mesh, remove it from\n //rendering and animation group instead\n level.morph.remove(level.secondaryMesh);\n if (this._parent.animationGroup) {\n this._parent.animationGroup.uncache(level.secondaryMesh);\n this._parent.animationGroup.remove(level.secondaryMesh);\n }\n }\n this._material.side = THREE.DoubleSide;\n this._material.needsUpdate = true;\n }\n }\n }\n\n this.dispose = () => {\n this.levels.forEach((level) => {\n if (level.morph && level.morph.geometry) {\n level.morph.geometry.dispose();\n }\n });\n if (this._material) {\n this._material.dispose();\n }\n if (this._secondaryMaterial) {\n this._secondaryMaterial.dispose();\n }\n }\n\n this.getCurrentLevel = () => {\n return this._currentLevel;\n }\n\n this.getCurrentMorph = () => {\n const level = this.levels[this._currentLevel];\n if (level && level.morph) {\n return level.morph;\n }\n return this._parent.morph;\n }\n\n /**\n * Loader for lod object\n */\n this.lodLoader = function (distance) {\n return (geometryIn) => {\n const material = this._material;\n const options = {\n localTimeEnabled: this._parent.timeEnabled,\n localMorphColour: this._parent.morphColour,\n }\n const geometry = toBufferGeometry(geometryIn, options);\n let mesh = undefined;\n if (this._parent.isGeometry) {\n mesh = new THREE.Mesh(geometry, material);\n } else if (this._parent.isLines) {\n mesh = new LineSegments(geometry, material);\n }\n mesh.userData = this._parent;\n mesh.renderOrder = this._renderOrder;\n geometryIn.dispose();\n this.levelLoaded(mesh, distance);\n };\n }\n\n this.updateMorphColorAttribute = (currentOnly) => {\n //Multilayers - set all\n if (this._material) {\n if ((this._material.vertexColors == THREE.VertexColors) ||\n (this._material.vertexColors == true)) {\n if (currentOnly) {\n const morph = this.getCurrentMorph();\n updateMorphColorAttribute(morph.geometry, morph);\n } else {\n this.levels.forEach((level) => {\n if (level.morph && level.morph.geometry) {\n updateMorphColorAttribute(level.morph.geometry, level.morph);\n }\n });\n }\n }\n }\n }\n\n this.setColour = (colour) => {\n this._material.color = colour;\n if (this._secondaryMaterial) {\n this._secondaryMaterial.color = colour;\n }\n updateGeometryColour();\n }\n\n this.setFrustumCulled = (flag) => {\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.frustumCulled = flag;\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.frustumCulled = flag;\n }\n });\n }\n\n this.setMaterial = (material) => {\n if (material) {\n if (!this._material || (this._material.id !== material.id)) {\n this._material = material;\n if (this._secondaryMaterial) {\n this._secondaryMaterial.dispose();\n }\n this._secondaryMaterial = material.clone()\n this._secondaryMaterial.side = THREE.FrontSide;\n this._secondaryMaterial.transparent = true;\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.material = this._material;\n if (level.morph.geometry) {\n level.morph.geometry.colorsNeedUpdate = true;\n }\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.material = this._secondaryMaterial;\n }\n });\n }\n }\n }\n\n this.setName = (name) => {\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.name = name;\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.name = name;\n }\n });\n }\n\n this.setRenderOrder = (order) => {\n this._renderOrder = order;\n this.levels.forEach((level) => {\n if (level.morph) {\n level.morph.renderOrder = order;\n }\n if (level.secondaryMesh) {\n level.secondaryMesh.renderOrder = order;\n }\n });\n }\n\n this.setVertexColors = (vertexColors) => {\n this._material.vertexColors = vertexColors;\n updateGeometryColour();\n if (this._secondaryMaterial) {\n this._secondaryMaterial.vertexColors = vertexColors;\n }\n }\n\n /* Update layers based on the */\n this.update = (camera, center) => {\n const levels = this.levels;\n if (levels.length > 1) {\n const distance = camera.cameraObject.position.distanceTo(center);\n let visibleIndex = -1;\n let optimalIndex = -1;\n let i, l;\n //Found a visible index that is within range of the LOD\n for (i = 0, l = levels.length; i < l; i++) {\n if (distance >= levels[i].distance) {\n //Check if a level is loading\n if (levels[i].morph) {\n if (visibleIndex > -1 && levels[visibleIndex].morph) {\n levels[visibleIndex].morph.visible = false;\n }\n visibleIndex = i;\n levels[i].morph.visible = true;\n optimalIndex = -1;\n }\n else {\n optimalIndex = i;\n }\n } else {\n break;\n }\n }\n if (optimalIndex > -1) {\n this.loadLevel(optimalIndex);\n }\n for (; i < l; i++) {\n if (levels[i].morph) {\n //Set visibility of other morph to false\n //and set the closest lod to true if\n //none is found\n if (visibleIndex > -1) {\n levels[i].morph.visible = false;\n } else {\n levels[i].morph.visible = true;\n visibleIndex = i;\n }\n }\n }\n if (this._currentLevel != visibleIndex) {\n this._currentLevel = visibleIndex;\n this.checkTransparentMesh();\n }\n }\n }\n\n this.toggleMarker = (marker, flag) => {\n this.levels.forEach((level) => {\n if (level.morph) {\n if (flag) {\n level.morph.add(marker);\n } else {\n level.morph.remove(marker);\n }\n }\n });\n }\n\n const updateGeometryColour = () => {\n this.levels.forEach((level) => {\n if (level.morph && level.morph.geometry) {\n level.morph.geometry.colorsNeedUpdate = true;\n }\n });\n }\n}\n\nexport { LOD };\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'%20?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20version='1.1'%20width='365'%20height='560'%20viewBox='0%200%20365%20560'%20xml:space='preserve'%3e%3cdesc%3eCreated%20with%20Fabric.js%205.2.4%3c/desc%3e%3cdefs%3e%3c/defs%3e%3crect%20x='0'%20y='0'%20width='100%25'%20height='100%25'%20fill='transparent'%3e%3c/rect%3e%3cg%20transform='matrix(0%200%200%200%200%200)'%20id='808ed283-2524-440f-88ae-3bdb47bb5749'%20%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%20182.5%20280)'%20id='db30413d-5bff-4b98-ab59-464497ee199e'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-182.5'%20y='-280'%20rx='0'%20ry='0'%20width='365'%20height='560'%20/%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0.99%200%200%200.99%20182.5%20280)'%20%3e%3cg%20style=''%20vector-effect='non-scaling-stroke'%20%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-540'%20y='-540'%20rx='0'%20ry='0'%20width='1080'%20height='1080'%20/%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3cpath%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(0,89,116);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20transform='%20translate(-182.9,%20-279.85)'%20d='M%20182.9%20551.7%20C%20182.9%20551.8000000000001%20183.1%20552%20183.1%20552%20C%20183.1%20552%20358.3%20283%20358.3%20194.6%20C%20358.3%2064.5%20269.5%207.900000000000006%20182.9%207.699999999999989%20C%2096.3%207.9%207.5%2064.5%207.5%20194.6%20C%207.5%20283%20182.8%20552%20182.8%20552%20C%20182.8%20552%20182.9%20551.7%20182.9%20551.7%20z%20M%20122.2%20187.2%20C%20122.2%20153.6%20149.4%20126.39999999999999%20183%20126.39999999999999%20C%20216.6%20126.39999999999999%20243.8%20153.6%20243.8%20187.2%20C%20243.8%20220.79999999999998%20216.5%20248%20182.9%20248%20C%20149.4%20248%20122.2%20220.8%20122.2%20187.2%20z'%20stroke-linecap='round'%20/%3e%3c/g%3e%3cg%20transform='matrix(3.82%200%200%203.82%200%20-100.77)'%20%3e%3ccircle%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20cx='0'%20cy='0'%20r='35'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","import * as THREE from 'three';\nimport myImage from '../assets/mapMarker.svg';\nimport { createNewSpriteText } from '../utilities';\nimport { ZincObject } from './zincObject';\n\nconst markerImage = new Image(128, 128);\nmarkerImage.src = myImage;\nconst texture = new THREE.Texture();\ntexture.image = markerImage;\ntexture.needsUpdate = true;\nconst size = [0.02, 0.03, 1];\nconst spriteMaterial = new THREE.SpriteMaterial({\n map: texture,\n alphaTest: 0.5,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n sizeAttenuation: false\n});\n\n/**\n * A special graphics type with a tear drop shape.\n * It is currently used to mark the location of a\n * {@link zincObject}.\n *\n * @class\n * @author Alan Wu\n * @return {Marker}\n */\nconst Marker = function(zincObject) {\n if (Object.getPrototypeOf(this) !== ZincObject.prototype) {\n Object.setPrototypeOf(Marker.prototype, ZincObject.prototype);\n }\n\n ZincObject.call(this);\n this.texture = texture;\n let sprite = undefined;\n let userTexture = undefined;\n let userMaterial = undefined;\n let userSprite = undefined;\n let userUrl = undefined;\n let defaultDisplay = true;\n this.morph = new THREE.Group();\n this.group = this.morph;\n this.parent = zincObject;\n this.isMarker = true;\n let enabled = false;\n this.ndc = new THREE.Vector3();\n let number = undefined;\n let label = undefined;\n\n\tlet initialise = () => {\n sprite = new THREE.Sprite(spriteMaterial);\n sprite.center.set(0.5, 0);\n this.morph.add(sprite);\n this.morph.position.set(0, 0, 0);\n this.morph.renderOrder = 10000;\n sprite.scale.set(size[0], size[1], size[2]);\n sprite.userData = this;\n }\n\n this.updateVisual = (min, max) => {\n let scale = 1;\n let porportion = 0;\n if (min !== max) {\n porportion = (1 - (this.ndc.z - min) / (max - min));\n scale = 0.6 + porportion * 0.4;\n }\n this.setSpriteSize(scale);\n }\n\n this.updateNDC = camera => {\n this.ndc.copy(this.morph.position);\n this.ndc.project(camera);\n this.ndc.z = Math.min(Math.max(this.ndc.z, 0), 1);\n return this.ndc;\n }\n\n /**\n * Set the position of the marker.\n *\n * @param {Number} x - x coordinate to be set.\n * @param {Number} y - y coordinate to be set.\n * @param {Number} z - z coordinate to be set.\n */\n this.setPosition = (x, y, z) => {\n this.morph.position.set(x, y, z);\n }\n\n /**\n * Set the size of the marker.\n *\n * @param {Number} size - size to be set.\n */\n this.setSpriteSize = size => {\n sprite.scale.set(0.015, 0.02, 1);\n sprite.scale.multiplyScalar(size);\n }\n\n this.setUserSprite = () => {\n if (userSprite) {\n this.morph.add(userSprite);\n if (defaultDisplay) {\n this.morph.remove(sprite);\n if (label) {\n this.morph.remove(label);\n }\n defaultDisplay = false;\n }\n }\n }\n\n this.setImageForUserSprite = (image, size) => {\n if (userSprite) {\n this.morph.remove(userSprite);\n userSprite = undefined;\n }\n if (userTexture) userTexture.dispose();\n if (userMaterial) userMaterial.dispose();\n userTexture = new THREE.Texture();\n userTexture.image = image;\n userTexture.needsUpdate = true;\n userMaterial = new THREE.SpriteMaterial({\n map: userTexture,\n alphaTest: 0.5,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n sizeAttenuation: false\n });\n if (!size) {\n size = [0.05, 0.05, 1];\n }\n userSprite = new THREE.Sprite(userMaterial);\n userSprite.center.set(0.5, 0);\n userSprite.scale.set(size[0], size[1], size[2]);\n userSprite.userData = this;\n this.setUserSprite();\n }\n\n this.setDefaultSprite = () => {\n if (!defaultDisplay) {\n defaultDisplay = true;\n this.morph.add(sprite);\n if (userSprite) this.morph.remove(userSprite);\n if (label) this.morph.add(label);\n }\n }\n\n this.loadUserSprite = (url, size) => {\n if (url) {\n if (url !== userUrl) {\n userUrl = url;\n const userImage = new Image(128, 128);\n userImage.crossOrigin = \"anonymous\"\n userImage.onload = () => {\n this.setImageForUserSprite(userImage, size);\n };\n userImage.src = url;\n } else {\n this.setUserSprite();\n }\n }\n }\n\n /**\n * Clean up this object,\n */\n this.dispose = () => {\n if (this.morph) {\n this.morph.clear();\n }\n if (sprite) {\n sprite.clear();\n sprite = undefined;\n }\n if (label) {\n label.material.map.dispose();\n label.material.dispose();\n label = undefined;\n }\n }\n\n this.isEnabled = () => {\n return enabled;\n }\n\n this.setNumber = (numberIn) => {\n if (!numberIn || (number != numberIn)) {\n //remove label\n if (label) {\n this.morph.remove(label);\n label.material.map.dispose();\n label.material.dispose();\n label = undefined;\n }\n }\n if (!label && numberIn) {\n label = createNewSpriteText(numberIn, 0.012, \"black\", \"Asap\", 120, 700);\n this.morph.add(label);\n }\n number = numberIn;\n }\n\n this.getNumber = () => {\n return number ? number : 1;\n }\n\n /**\n * Set the visibility of this Geometry.\n *\n * @param {Boolean} visible - a boolean flag indicate the visibility to be set\n */\n this.setVisibility = function(visible) {\n if (visible !== this.visible) {\n this.visible = visible;\n this.group.visible = visible;\n if (this.parent.region) this.parent.region.pickableUpdateRequired = true;\n }\n }\n\n /**\n * Enable and visualise the marker.\n */\n this.enable = () => {\n enabled = true;\n this.morph.visible = true;\n this.visible = true;\n }\n\n /**\n * Disable and hide the marker.\n */\n this.disable = () => {\n enabled = false;\n this.morph.visible = false;\n this.visible = false;\n }\n\n\tinitialise();\n\n}\n\nexport { Marker };\n","import * as THREE from 'three';\nimport {\n createBufferGeometry,\n getBoundingBox,\n removeVertexAtIndex,\n resolveURL\n} from '../utilities';\nimport { LOD } from './lod';\nimport { Marker } from './marker';\n\nlet uniqueiId = 0;\n\nconst getUniqueId = function () {\n return \"pr\" + uniqueiId++;\n}\n\n/**\n * Provides the base object for other primitive types.\n * This class contains multiple base methods.\n *\n * @class\n * @author Alan Wu\n * @return {ZincObject}\n */\nconst ZincObject = function() {\n this.isZincObject = true;\n this.geometry = undefined;\n // THREE.Mesh\n this.morph = undefined;\n this.group = new THREE.Group();\n this._lod = new LOD(this);\n /**\n\t * Groupname given to this geometry.\n\t */\n this.groupName = undefined;\n this.timeEnabled = false;\n this.morphColour = false;\n this.inbuildTime = 0;\n this.mixer = undefined;\n this.animationGroup = undefined;\n\t/**\n\t * Total duration of the animation, this value interacts with the\n\t * {@link Renderer#playRate} to produce the actual duration of the\n\t * animation. Actual time in second = duration / playRate.\n\t */\n this.duration = 6000;\n this.clipAction = undefined;\n this.userData = {};\n this.videoHandler = undefined;\n this.marker = undefined;\n this.markerNumber = undefined;\n this.markerUpdateRequired = true;\n this.closestVertexIndex = -1;\n this.boundingBoxUpdateRequired = true;\n this.cachedBoundingBox = new THREE.Box3();\n this.anatomicalId = undefined;\n this.region = undefined;\n this.animationClip = undefined;\n this.markerMode = \"inherited\";\n this.uuid = getUniqueId();\n this._v1 = new THREE.Vector3();\n this._v2 = new THREE.Vector3();\n this._b1 = new THREE.Box3();\n this.center = new THREE.Vector3();\n this.radius = 0;\n this.visible = true;\n //Draw range is only used by primitives added\n //programatically with addVertices function\n this.drawRange = -1;\n //Default value of colour\n this.origColour = undefined;\n this.origVertexColors = false;\n this.isPickable = true;\n}\n\n/**\n * Set the duration of the animation of this object.\n *\n * @param {Number} durationIn - Duration of the animation.\n */\nZincObject.prototype.setDuration = function(durationIn) {\n this.duration = durationIn;\n if (this.clipAction) {\n this.clipAction.setDuration(this.duration);\n }\n}\n\n/**\n * Get the duration of the animation of this object.\n *\n * @return {Number}\n */\nZincObject.prototype.getDuration = function() {\n return this.duration;\n}\n\n/**\n * Set the region this object belongs to.\n *\n * @param {Region} region\n */\nZincObject.prototype.setRegion = function(region) {\n this.region = region;\n}\n\n/**\n * Get the region this object belongs to.\n *\n * @return {Region}\n */\nZincObject.prototype.getRegion = function() {\n return this.region;\n}\n\n/**\n * Get the threejs object3D.\n *\n * @return {Object}\n */\n ZincObject.prototype.getMorph = function() {\n const morph = this._lod.getCurrentMorph();\n return morph ? morph : this.morph;\n}\n\n/**\n * Get the threejs object3D.\n *\n * @return {Object}\n */\n ZincObject.prototype.getGroup = function() {\n return this.group;\n}\n\n/**\n * Set the internal threejs object3D.\n */\n ZincObject.prototype.setMorph = function(mesh) {\n this.morph = mesh;\n this.group.add(this.morph);\n //this is the base level object\n const distance = this._lod.calculateDistance(\"far\");\n this._lod.addLevel(mesh, distance);\n this._lod.setMaterial(mesh.material);\n}\n\n/**\n * Handle transparent mesh, create a clone for backside rendering if it is\n * transparent.\n */\nZincObject.prototype.checkTransparentMesh = function() {\n return;\n}\n\n/**\n * Set the mesh function for zincObject.\n *\n * @param {THREE.Mesh} mesh - Mesh to be set for this zinc object.\n * @param {Boolean} localTimeEnabled - A flag to indicate either the mesh is\n * time dependent.\n * @param {Boolean} localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\nZincObject.prototype.setMesh = function(mesh, localTimeEnabled, localMorphColour) {\n //Note: we assume all layers are consistent with time frame\n //Thus adding them to the same animation group should work.\n //This step is only required for the primary (level 0) mesh.\n this.animationGroup = new THREE.AnimationObjectGroup(mesh);\n this.mixer = new THREE.AnimationMixer(this.animationGroup);\n const geometry = mesh.geometry;\n this.geometry = mesh.geometry;\n this.clipAction = undefined;\n if (geometry && geometry.morphAttributes) {\n let morphAttribute = geometry.morphAttributes.position;\n if (!morphAttribute) {\n morphAttribute = geometry.morphAttributes.color ?\n geometry.morphAttributes.color :\n geometry.morphAttributes.normal;\n }\n if (morphAttribute) {\n this.animationClip = THREE.AnimationClip.CreateClipsFromMorphTargetSequences(\n morphAttribute, 10, true);\n if (this.animationClip && (this.animationClip[0] != undefined)) {\n this.clipAction = this.mixer.clipAction(this.animationClip[0]).setDuration(\n this.duration);\n this.clipAction.loop = THREE.loopOnce;\n this.clipAction.clampWhenFinished = true;\n this.clipAction.play();\n }\n }\n }\n this.timeEnabled = localTimeEnabled;\n this.morphColour = localMorphColour;\n mesh.userData = this;\n mesh.matrixAutoUpdate = false;\n this.setMorph(mesh);\n this.checkTransparentMesh();\n if (this.timeEnabled) {\n this.setFrustumCulled(false);\n } else {\n if (this.morphColour) {\n geometry.setAttribute('morphTarget0', geometry.getAttribute( 'position' ) );\n geometry.setAttribute('morphTarget1', geometry.getAttribute( 'position' ) );\n }\n }\n this.boundingBoxUpdateRequired = true;\n}\n\n/**\n * Set isPickable for this ZincObject.\n *\n * @param {String} isPickable - Boolean to enable object pick.\n */\nZincObject.prototype.setIsPickable = function(isPickable) {\n if (this.isPickable !== isPickable) {\n this.isPickable = isPickable;\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n}\n\n/**\n * Set the anatomicalId for this ZincObject.\n *\n * @param {String} anatomicalId - Id to be set.\n */\nZincObject.prototype.setAnatomicalId = function(anatomicalId) {\n this.anatomicalId = anatomicalId;\n}\n\n/**\n * Set the name for this ZincObject.\n *\n * @param {String} groupNameIn - Name to be set.\n */\nZincObject.prototype.setName = function(groupNameIn) {\n this.groupName = groupNameIn;\n this._lod.setName(groupNameIn);\n}\n\n/**\n * Get the local time of this geometry, it returns a value between\n * 0 and the duration.\n *\n * @return {Number}\n */\nZincObject.prototype.getCurrentTime = function() {\n if (this.clipAction) {\n const ratio = this.clipAction.time / this.clipAction._clip.duration;\n return this.duration * ratio;\n } else {\n return this.inbuildTime;\n }\n}\n\n/**\n * Set the local time of this geometry.\n *\n * @param {Number} time - Can be any value between 0 to duration.\n */\nZincObject.prototype.setMorphTime = function(time) {\n let timeChanged = false;\n if (this.clipAction) {\n const ratio = time / this.duration;\n const actualDuration = this.clipAction._clip.duration;\n let newTime = ratio * actualDuration;\n if (newTime != this.clipAction.time) {\n this.clipAction.time = newTime;\n timeChanged = true;\n }\n if (timeChanged && this.isTimeVarying()) {\n this.mixer.update( 0.0 );\n }\n } else {\n let newTime = time;\n if (time > this.duration)\n newTime = this.duration;\n else if (0 > time)\n newTime = 0;\n else\n newTime = time;\n if (newTime != this.inbuildTime) {\n this.inbuildTime = newTime;\n timeChanged = true;\n }\n }\n if (timeChanged) {\n this.boundingBoxUpdateRequired = true;\n this._lod.updateMorphColorAttribute(true);\n if (this.timeEnabled)\n this.markerUpdateRequired = true;\n }\n}\n\n/**\n * Check if the geometry is time varying.\n *\n * @return {Boolean}\n */\nZincObject.prototype.isTimeVarying = function() {\n if (this.timeEnabled || this.morphColour)\n return true;\n return false;\n}\n\n/**\n * Get the visibility of this Geometry.\n *\n */\nZincObject.prototype.getVisibility = function() {\n return this.visible;\n}\n\n/**\n * Set the visibility of this Geometry.\n *\n * @param {Boolean} visible - a boolean flag indicate the visibility to be set\n */\nZincObject.prototype.setVisibility = function(visible) {\n if (visible !== this.visible) {\n this.visible = visible;\n this.group.visible = visible;\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n}\n\n/**\n * Set the opacity of this Geometry. This function will also set the isTransparent\n * flag according to the provided alpha value.\n *\n * @param {Number} alpah - Alpha value to set for this geometry,\n * can be any value between from 0 to 1.0.\n */\nZincObject.prototype.setAlpha = function(alpha) {\n const material = this._lod._material;\n let isTransparent = false;\n if (alpha < 1.0)\n isTransparent = true;\n material.opacity = alpha;\n material.transparent = isTransparent;\n this.checkTransparentMesh();\n}\n\n/**\n * The rendering will be culled if it is outside of the frustrum\n * when this flag is set to true, it should be set to false if\n * morphing is enabled.\n *\n * @param {Boolean} flag - Set frustrum culling on/off based on this flag.\n */\nZincObject.prototype.setFrustumCulled = function(flag) {\n //multilayers - set for all layers\n this._lod.setFrustumCulled(flag);\n}\n\n/**\n * Set rather a zinc object should be displayed using per vertex colour or\n * not.\n *\n * @param {Boolean} vertexColors - Set display with vertex color on/off.\n */\nZincObject.prototype.setVertexColors = function(vertexColors) {\n //multilayers - set for all\n this._lod.setVertexColors(vertexColors);\n\n}\n\n/**\n * Get the colour of the mesh.\n *\n * @return {THREE.Color}\n */\nZincObject.prototype.getColour = function() {\n if (this._lod._material)\n return this._lod._material.color;\n\treturn undefined;\n}\n\n/**\n * Set the colour of the mesh.\n *\n * @param {THREE.Color} colour - Colour to be set for this geometry.\n */\nZincObject.prototype.setColour = function(colour) {\n this._lod.setColour(colour);\n}\n\n/**\n * Set the colour of the mesh.\n *\n * @param {THREE.Color} colour - Colour to be set for this geometry.\n */\nZincObject.prototype.setGreyScale = function(flag) {\n if (flag) {\n if (!this.origColour) {\n if (this._lod._material) {\n this.origColour = this._lod._material.color;\n this.origVertexColors = this._lod._material.vertexColors;\n this._lod.setVertexColors(false);\n this._lod.setColour(new THREE.Color().setHex( 0xBBBBBB ));\n return true;\n }\n }\n } else {\n if (this.origColour) {\n this._lod.setColour(this.origColour);\n this._lod.setVertexColors(this.origVertexColors);\n this.origColour = undefined;\n return true;\n }\n }\n return false;\n}\n\n/**\n * Get the colour of the mesh in hex string form.\n *\n * @return {String}\n */\nZincObject.prototype.getColourHex = function() {\n if (!this.morphColour) {\n if (this._lod._material && this._lod._material.color)\n return this._lod._material.color.getHexString();\n }\n return undefined;\n}\n\n/**\n * Set the colour of the mesh using hex in string form.\n *\n * @param {String} hex - The colour value in hex form.\n */\nZincObject.prototype.setColourHex = function(hex) {\n this._lod._material.color.setHex(hex);\n if (this._lod._secondaryMaterial) {\n this._lod._secondaryMaterial.color.setHex(hex);\n }\n}\n\n/**\n * Set the emissive rgb of the mesh using rgb.\n *\n * @param {String} colour - The colour value in rgb form.\n */\nZincObject.prototype.setEmissiveRGB = function(colour) {\n if (this._lod._material && this._lod._material.emissive) {\n this._lod._material.emissive.setRGB(...colour);\n }\n if (this._lod._secondaryMaterial) {\n this._lod._secondaryMaterial.emissive.setRGB(...colour);\n }\n}\n\n\n/**\n * Set the material of the geometry.\n *\n * @param {THREE.Material} material - Material to be set for this geometry.\n */\nZincObject.prototype.setMaterial = function(material) {\n this._lod.setMaterial(material);\n}\n\n/**\n * Get the index of the closest vertex to centroid.\n *\n * @return {Number} - integer index in the array\n */\nZincObject.prototype.getClosestVertexIndex = function() {\n let closestIndex = -1;\n const morph = this.getMorph();\n if (morph && morph.geometry) {\n let position = morph.geometry.attributes.position;\n if (position) {\n this._b1.setFromBufferAttribute(position);\n this._b1.getCenter(this._v1);\n let distance = -1;\n let currentDistance = 0;\n for (let i = 0; i < position.count; i++) {\n this._v2.fromArray(position.array, i * 3);\n currentDistance = this._v2.distanceTo(this._v1);\n if (distance == -1)\n distance = currentDistance;\n else if (distance > (currentDistance)) {\n distance = currentDistance;\n closestIndex = i;\n }\n }\n }\n }\n return closestIndex;\n}\n\n/**\n * Get the closest vertex to centroid.\n *\n * @return {THREE.Vector3}\n */\nZincObject.prototype.getClosestVertex = function(applyMatrixWorld) {\n let position = new THREE.Vector3();\n if (this.closestVertexIndex == -1) {\n this.closestVertexIndex = this.getClosestVertexIndex();\n }\n const morph = this.getMorph();\n if (morph && morph.geometry && this.closestVertexIndex >= 0) {\n let influences = morph.morphTargetInfluences;\n let attributes = morph.geometry.morphAttributes;\n if (influences && attributes && attributes.position) {\n let found = false;\n for (let i = 0; i < influences.length; i++) {\n if (influences[i] > 0) {\n found = true;\n this._v1.fromArray(\n attributes.position[i].array, this.closestVertexIndex * 3);\n position.add(this._v1.multiplyScalar(influences[i]));\n }\n }\n if (found) {\n return applyMatrixWorld ? position.applyMatrix4(morph.matrixWorld) : position;\n }\n } else {\n position.fromArray(morph.geometry.attributes.position.array,\n this.closestVertexIndex * 3);\n return applyMatrixWorld ? position.applyMatrix4(morph.matrixWorld) : position;\n }\n }\n //Matrix world has already been applied\n this.getBoundingBox();\n position.copy(this.center);\n return position;\n}\n\n/**\n * Get the bounding box of this geometry.\n *\n * @return {THREE.Box3}.\n */\nZincObject.prototype.getBoundingBox = function() {\n if (this.visible) {\n let morph = this._lod.getCurrentMorph();\n if (morph && morph.visible) {\n if (this.boundingBoxUpdateRequired) {\n getBoundingBox(morph, this.cachedBoundingBox, this._b1, this._v1, this._v2);\n this.cachedBoundingBox.getCenter(this.center);\n this.radius = this.center.distanceTo(this.cachedBoundingBox.max);\n this.boundingBoxUpdateRequired = false;\n }\n return this.cachedBoundingBox;\n }\n }\n return undefined;\n}\n\n/**\n * Clear this geometry and free the memory.\n */\nZincObject.prototype.dispose = function() {\n //multilayyers\n this._lod.dispose();\n this.animationGroup = undefined;\n this.mixer = undefined;\n this.morph = undefined;\n this.group = undefined;\n this.clipAction = undefined;\n this.groupName = undefined;\n}\n\n/**\n * Check if marker is enabled based on the objects settings with\n * the provided scene options.\n *\n * @return {Boolean}\n */\nZincObject.prototype.markerIsRequired = function(options) {\n if (this.visible &&\n (this.markerMode === \"on\" || (options && options.displayMarkers &&\n (this.markerMode === \"inherited\")))) {\n return true;\n }\n return false;\n}\n\n/**\n * Update the marker's position and size based on current viewport.\n */\nZincObject.prototype.updateMarker = function(playAnimation, options) {\n if ((playAnimation == false) &&\n (this.markerIsRequired(options)))\n {\n let ndcToBeUpdated = options.ndcToBeUpdated;\n if (this.groupName) {\n if (!this.marker) {\n this.marker = new Marker(this);\n this.markerUpdateRequired = true;\n }\n if (this.markerUpdateRequired) {\n let position = this.getClosestVertex(false);\n if (position) {\n this.marker.setPosition(position.x, position.y, position.z);\n this.markerUpdateRequired = false;\n }\n }\n if (!this.marker.isEnabled()) {\n if (options.markersList &&\n (!(this.marker.uuid in options.markersList))) {\n ndcToBeUpdated = true;\n options.markersList[this.marker.uuid] = this.marker;\n }\n this.marker.enable();\n this.group.add(this.marker.morph);\n }\n this.marker.setNumber(this.markerNumber);\n if (this.markerImgURL) {\n this.marker.loadUserSprite(this.markerImgURL);\n } else {\n this.marker.setDefaultSprite();\n }\n if (options && options.camera && (ndcToBeUpdated ||\n options.markerCluster.markerUpdateRequired)) {\n this.marker.updateNDC(options.camera.cameraObject);\n options.markerCluster.markerUpdateRequired = true;\n }\n }\n } else {\n if (this.marker && this.marker.isEnabled()) {\n this.marker.disable();\n this.group.remove(this.marker.morph);\n if (options.markersList &&\n (this.marker.uuid in options.markersList)) {\n options.markerCluster.markerUpdateRequired = true;\n delete options.markersList[this.marker.uuid];\n }\n }\n this.markerUpdateRequired = true;\n }\n}\n\nZincObject.prototype.processMarkerVisual = function(min, max) {\n if (this.marker && this.marker.isEnabled()) {\n this.marker.updateVisual(min, max);\n }\n}\n\nZincObject.prototype.initiateMorphColor = function() {\n //Multilayers - set all\n if (this.morphColour == 1) {\n this._lod.updateMorphColorAttribute(false);\n }\n}\n\nZincObject.prototype.setRenderOrder = function(renderOrder) {\n //multiilayers\n this._lod.setRenderOrder(renderOrder);\n}\n\n/**\n * Get the windows coordinates.\n *\n * @return {Object} - position and rather the closest vertex is on screen.\n */\nZincObject.prototype.getClosestVertexDOMElementCoords = function(scene) {\n if (scene && scene.camera) {\n let inView = true;\n const position = this.getClosestVertex(true);\n position.project(scene.camera);\n position.z = Math.min(Math.max(position.z, 0), 1);\n if (position.x > 1 || position.x < -1 || position.y > 1 || position.y < -1) {\n inView = false;\n }\n scene.getZincCameraControls().getRelativeCoordsFromNDC(position.x, position.y, position);\n return {position, inView};\n } else {\n return undefined;\n }\n}\n\n/**\n * Set marker mode for this zinc object which determine rather the\n * markers should be displayed or not.\n *\n * @param {string} mode - There are three options:\n * \"on\" - marker is enabled regardless of settings of scene\n * \"off\" - marker is disabled regardless of settings of scene\n * \"inherited\" - Marker settings on scene will determine the visibility\n * of the marker.\n *\n * @return {Boolean}\n */\n ZincObject.prototype.setMarkerMode = function(mode, options) {\n if (mode !== this.markerMode) {\n if (mode === \"on\" || mode === \"off\") {\n this.markerMode = mode;\n } else {\n this.markerMode = \"inherited\";\n }\n if (this.region) {\n this.region.pickableUpdateRequired = true;\n }\n }\n if (options) {\n this.markerNumber = options.number;\n this.markerImgURL = options.imgURL;\n }\n}\n\n//Update the geometry and colours depending on the morph.\nZincObject.prototype.render = function(delta, playAnimation,\n cameraControls, options) {\n if (this.visible && !(this.timeEnabled && playAnimation)) {\n this._lod.update(cameraControls, this.center);\n }\n if (playAnimation == true) {\n if ((this.clipAction) && this.isTimeVarying()) {\n this.mixer.update( delta );\n }\n else {\n let targetTime = this.inbuildTime + delta;\n if (targetTime > this.duration)\n targetTime = targetTime - this.duration;\n this.inbuildTime = targetTime;\n }\n //multilayers\n if (this.visible && delta != 0) {\n this.boundingBoxUpdateRequired = true;\n if (this.morphColour == 1) {\n this._lod.updateMorphColorAttribute(true);\n }\n }\n }\n this.updateMarker(playAnimation, options);\n}\n\n/**\n * Add lod from an url into the lod object.\n */\nZincObject.prototype.addLOD = function(loader, level, url, index, preload) {\n this._lod.addLevelFromURL(loader, level, url, index, preload);\n}\n\n/**\n * Add lod from an url into the lod object.\n */\nZincObject.prototype.addVertices = function(coords) {\n let mesh = this.getMorph();\n let geometry = undefined;\n if (!mesh) {\n geometry = createBufferGeometry(500, coords);\n this.drawRange = coords.length;\n } else {\n if (this.drawRange > -1) {\n const positionAttribute = mesh.geometry.getAttribute( 'position' );\n coords.forEach(coord => {\n positionAttribute.setXYZ(this.drawRange, coord[0], coord[1], coord[2])\n ++this.drawRange;\n });\n positionAttribute.needsUpdate = true;\n mesh.geometry.setDrawRange(0, this.drawRange);\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n geometry = mesh.geoemtry;\n this.boundingBoxUpdateRequired = true;\n }\n }\n return geometry;\n}\n\n/**\n * Add lod from an url into the lod object.\n */\nZincObject.prototype.deleteVertices = function(index) {\n let mesh = this.getMorph();\n if (mesh?.geometry && this.drawRange >= index) {\n if (removeVertexAtIndex(mesh.geometry, index, true)) {\n --this.drawRange;\n mesh.geometry.setDrawRange(0, this.drawRange);\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n return true;\n }\n }\n return false;\n}\n\n/**\n * Set the objects position.\n */\nZincObject.prototype.setPosition = function(x, y, z) {\n const group = this.getGroup();\n if (group) {\n group.position.set(x, y, z);\n group.matrixWorldNeedsUpdate = true;\n group.updateMatrix();\n group.updateWorldMatrix(true, true);\n this.boundingBoxUpdateRequired = true;\n }\n}\n\nZincObject.prototype.loadAdditionalSources = function(primitivesLoader, sources) {\n primitivesLoader.load(resolveURL(filename), meshloader(region, colour, opacity, localTimeEnabled, localMorphColour, undefined, undefined,\n undefined, undefined, finishCallback), this.onProgress(filename), this.onError(finishCallback));\n}\n\n/**\n * Set the objects scale.\n */\nZincObject.prototype.setScaleAll = function(scale) {\n const group = this.getGroup();\n if (group) {\n group.scale.set(scale, scale, scale);\n group.updateMatrix();\n this.boundingBoxUpdateRequired = true;\n }\n}\n\nexport { ZincObject };\n\n","import * as THREE from 'three';\nimport { toBufferGeometry } from '../utilities';\nimport { augmentMorphColor } from './augmentShader';\nimport { ZincObject} from './zincObject';\n\nconst createMeshForGeometry = (geometryIn, materialIn, options) => {\n // First copy the geometry\n let geometry = toBufferGeometry(geometryIn, options);\n\n let isTransparent = false;\n if (1.0 > options.opacity)\n isTransparent = true;\n\n let material = undefined;\n if (geometry._video === undefined) {\n const morphTargets = options.localTimeEnabled || options.localMorphColour;\n if (materialIn) {\n material = materialIn;\n material.morphTargets = morphTargets;\n material.morphNormals = options.localTimeEnabled;\n } else {\n if (geometry instanceof THREE.BufferGeometry && geometry.attributes.color === undefined) {\n material = new THREE.MeshPhongMaterial({\n color : options.colour,\n morphTargets : morphTargets,\n morphNormals : options.localTimeEnabled,\n transparent : isTransparent,\n opacity : options.opacity,\n side : THREE.DoubleSide\n });\n } else {\n material = new THREE.MeshPhongMaterial({\n color : options.colour,\n morphTargets : morphTargets,\n morphNormals : options.localTimeEnabled,\n vertexColors : THREE.VertexColors,\n transparent : isTransparent,\n opacity : options.opacity,\n side : THREE.DoubleSide\n });\n }\n }\n //material = PhongToToon(material);\n if (options.localMorphColour && geometry.morphAttributes[ \"color\" ]) {\n material.onBeforeCompile = augmentMorphColor();\n }\n } else {\n let videoTexture = geometry._video.createCanvasVideoTexture();\n material = new THREE.MeshBasicMaterial({\n morphTargets : options.localTimeEnabled,\n color : new THREE.Color(1, 1, 1),\n transparent : isTransparent,\n opacity : options.opacity,\n map : videoTexture,\n side : THREE.DoubleSide\n });\n this.videoHandler = geometry._video;\n }\n return new THREE.Mesh(geometry, material);\n}\n\n/**\n * Provides an object which stores geometry and provides method which controls its animations.\n * This is created when a valid json file containging geometry is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Geometry}\n */\nconst Geometry = function () {\n ZincObject.call(this);\n\t// THREE.Geometry or THREE.BufferGeometry\n\tthis.videoHandler = undefined;\n this.isGeometry = true;\n\n /**\n * Create the mesh for rendering\n *\n * @param {THREE.Geomtry} geometryIn - Geometry to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the geometry.\n * @param {Object} options - Provide various options\n * @param {THREE.Color} options.colour - colour to be set for the geometry\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the geometry is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n * @param {Number} options.opacity - Opacity to be set for the geometry\n */\n\tthis.createMesh = (geometryIn, materialIn, options) => {\n //Skip if there is a morph already\n\t\tif (this.morph && this.morph.geometry && (geometryIn != undefined))\n\t\t\treturn;\n\t\tconst mesh = createMeshForGeometry(geometryIn, materialIn, options);\n\t\tthis.setMesh(mesh, options.localTimeEnabled, options.localMorphColour);\n\t}\n\n /**\n * Calculate the UV for texture rendering.\n */\n\tthis.calculateUVs = () => {\n //Multilayers\n\t\tthis.geometry.computeBoundingBox();\n\t\tconst max = this.geometry.boundingBox.max, min = this.geometry.boundingBox.min;\n\t\tconst offset = new THREE.Vector2(0 - min.x, 0 - min.y);\n\t\tconst range = new THREE.Vector2(max.x - min.x, max.y - min.y);\n\t\tthis.geometry.faceVertexUvs[0] = [];\n\t\tfor (let i = 0; i < this.geometry.faces.length ; i++) {\n\t\t const v1 = this.geometry.vertices[this.geometry.faces[i].a];\n\t\t const v2 = this.geometry.vertices[this.geometry.faces[i].b];\n\t\t const v3 = this.geometry.vertices[this.geometry.faces[i].c];\n\t\t geometry.faceVertexUvs[0].push(\n\t\t [\n\t\t new THREE.Vector2((v1.x + offset.x)/range.x ,(v1.y + offset.y)/range.y),\n\t\t new THREE.Vector2((v2.x + offset.x)/range.x ,(v2.y + offset.y)/range.y),\n\t\t new THREE.Vector2((v3.x + offset.x)/range.x ,(v3.y + offset.y)/range.y)\n\t\t ]);\n\t\t}\n\t\tgeometry.uvsNeedUpdate = true;\n\t}\n\n /**\n * Handle transparent mesh, create a clone for backside rendering if it is\n * transparent.\n */\n this.checkTransparentMesh = function() {\n this._lod.checkTransparentMesh();\n }\n\n\t/**\n\t * Set wireframe display for this geometry.\n\t *\n\t * @param {Boolean} wireframe - Flag to turn on/off wireframe display.\n\t */\n\tthis.setWireframe = wireframe => {\n\t\tthis.morph.material.wireframe = wireframe;\n\t}\n\n /**\n * Edit Vertice in index.\n */\n this.editVertices = function(coords, i) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n const attribute = mesh.geometry.getAttribute(\"position\");\n if (!mesh || 0 > i) {\n return;\n } else {\n let index = i * 3;\n coords.forEach(coord => {\n attribute.array[index++] = coord[0];\n attribute.array[index++] = coord[1];\n attribute.array[index++] = coord[2];\n });\n attribute.needsUpdate = true;\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n }\n\n\n}\n\nGeometry.prototype = Object.create(ZincObject.prototype);\nexport { Geometry };\n","import SpriteTextModule from 'three-spritetext';\nconst SpriteText = SpriteTextModule.default || SpriteTextModule;\n\n/**\n * Bitmap labels, this is used with {@link Glyph} to\n * provide labels.\n *\n * @param {String} textIn - Text to be displayed dwith the label.\n * @param {THREE.Color} colour - Colour to be set for the label.\n *\n * @class\n * @author Alan Wu\n * @return {Label}\n */\nconst Label = function (textIn, colourIn) {\n let text = textIn;\n let sprite = undefined;\n const position = [0, 0, 0];\n let colour = colourIn;\n let size = 1.0;\n let fontWeight = 500;\n if (colourIn)\n sprite = new SpriteText(text, 0.012, colourIn.getStyle());\n else\n sprite = new SpriteText(text, 0.012);\n sprite.fontFace = \"Asap\";\n sprite.fontWeight = fontWeight;\n sprite.material.map.generateMipmaps = false;\n sprite.material.sizeAttenuation = false;\n sprite.center.x = -0.05;\n sprite.center.y = 0;\n const originalScale = [sprite.scale.x, sprite.scale.y];\n\n /**\n * Get the current position in an array containing the x, y and z\n * coordinates.\n *\n * @return {Array}\n */\n this.getPosition = () => {\n if (sprite)\n return [sprite.position.x, sprite.position.y, sprite.position.z];\n return [0, 0, 0];\n }\n\n /**\n * Set the position of the label in 3D coordinates.\n *\n * @param {Number} x - x coordinate to be set.\n * @param {Number} y - y coordinate to be set.\n * @param {Number} z - z coordinate to be set.\n */\n this.setPosition = (x, y, z) => {\n position[0] = x;\n position[1] = y;\n position[2] = z;\n\n if (sprite) {\n sprite.position.set(x, y, z);\n }\n }\n\n /**\n * Set the colour of the label\n *\n * @param {THREE.Color} colour - colour to be set\n */\n this.setColour = colourIn => {\n if (colourIn) {\n sprite.color = colourIn.getStyle();\n colour = colourIn;\n }\n }\n\n /**\n * Scale the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setScale = scaling => {\n if (sprite && scaling > 0.0)\n sprite.scale.set(scaling, scaling, 1.0);\n }\n\n /**\n * Set depth test for sprite object.\n *\n * @param {Boolean} flag - Enable/disable depth test\n */\n this.setDepthTest = flag => {\n if (flag && flag !== sprite.material.depthTest) {\n sprite.material.depthTest = flag;\n }\n }\n\n /**\n * Set a new text for the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setSize = sizeIn => {\n if (sizeIn > 0.0) {\n sprite.scale.x = originalScale[0] * sizeIn;\n sprite.scale.y = originalScale[1] * sizeIn;\n size = sizeIn;\n }\n }\n\n /**\n * Set a new text for the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setFontWeight = fontWeightIn => {\n if (fontWeightIn && fontWeightIn !== fontWeight) {\n sprite.fontWeight = fontWeightIn;\n fontWeight = fontWeightIn;\n }\n }\n\n /**\n * Set a new text for the label.\n *\n * @param {Number} scaling - Scale to be set.\n */\n this.setText = textIn => {\n if (textIn && textIn !== sprite.text) {\n sprite.text = textIn;\n text = textIn;\n }\n }\n\n /**\n * Set visibility of the label.\n *\n * @param {Boolean} flag - Visibility to set\n */\n this.setVisibility = flag => {\n sprite.visible = flag;\n }\n\n /**\n * Free up the memory\n */\n this.dispose = () => {\n //sprite.dispose();\n }\n\n /**\n * Get the intrnal sprite.\n *\n * @return {THREE.Sprite}\n */\n this.getSprite = () => {\n return sprite;\n }\n\n /**\n * Get the text.\n *\n * @return {String}\n */\n this.getString = () => {\n return text;\n }\n\n};\n\nexport { Label };\n\n\n\n","import * as THREE from 'three';\nimport { Label } from './label';\nimport { ZincObject } from './zincObject';\n\n/**\n * Zinc representation of glyph graphic, it contains the colours,\n * geometry and transformation of the glyph.\n *\n * @param {THREE.Geometry} geometry - Geometry of the glyph .\n * @param {THREE.Material} materialIn - Material of the glyph.\n * @param {Number} idIn - Id of the glyph.\n *\n * @class\n * @author Alan Wu\n * @return {Glyph}\n */\nconst Glyph = function (geometry, materialIn, idIn, glyphsetIn) {\n ZincObject.call(this);\n let material = undefined;\n if (materialIn) {\n material = materialIn.clone();\n material.vertexColors = THREE.FaceColors;\n }\n const parent = glyphsetIn;\n this.id = idIn;\n let label = undefined;\n let labelString = undefined;\n this.isGlyph = true;\n let _position = [0, 0, 0];\n\n /**\n * Create a glyph using mesh\n * @param {THREE.Mesh} meshIn - Mesh to create the glyph from\n *\n * @returns {Boolean} true if successful\n */\n this.fromMesh = meshIn => {\n if (meshIn && meshIn.isMesh) {\n this.morph = meshIn.clone();\n this.morph.userData = this;\n this.group.add(this.morph);\n return true;\n }\n return false;\n }\n\n if (geometry && material) {\n this.fromMesh(new THREE.Mesh(geometry, material));\n }\n\n /**\n * Get the {Glyphset} containing this glyph.\n *\n * @returns {Boolean} true if successful\n */\n this.getGlyphset = function () {\n return parent;\n }\n\n /**\n * Set and update the text containing this glyph.\n * @param {String} text - Label to be set for this instance\n */\n this.setLabel = text => {\n if (text && (typeof text === 'string' || text instanceof String)) {\n labelString = text;\n if (this.morph)\n this.morph.name = text;\n }\n }\n\n /**\n * Display label with the choosen colour. It will replace the current\n * label.\n * @param {THREE.Color} colour - Colour for the label.\n */\n this.showLabel = (colour) => {\n if (label) {\n _position = label.getPosition();\n this.group.remove(label.getSprite());\n label.dispose();\n label = undefined;\n }\n if (labelString && (typeof labelString === 'string' || labelString instanceof String)) {\n label = new Label(labelString, colour);\n label.setPosition(_position[0], _position[1], _position[2]);\n const sprite = label.getSprite();\n sprite.material.alphaTest = 0.5;\n sprite.material.transparent = true;\n sprite.material.depthWrite = false;\n this.group.add(label.getSprite());\n }\n }\n\n /**\n * Hide label with the choosen colour.\n */\n this.hideLabel = () => {\n if (label) {\n _position = label.getPosition();\n this.group.remove(label.getSprite());\n label.dispose();\n label = undefined;\n }\n }\n\n /**\n * Get the label of this glyph\n * @return {Label}\n */\n this.getLabel = () => {\n return labelString;\n }\n\n /**\n * Get the mesh of this glyph.\n * @return {THREE.Mesh}\n */\n this.getMesh = () => {\n return this.morph;\n }\n\n /**\n * Set the transformation of this glyph.\n * @param {Array} position - Three components vectors containing position of the\n * transformation.\n * @param {Array} axis1 - Three components vectors containing axis1 rotation of the\n * transformation.\n * @param {Array} axis2 - Three components vectors containing axis2 rotation of the\n * transformation.\n * @param {Array} position - Three components vectors containing axis3 rotation of the\n * transformation.\n */\n this.setTransformation = (position, axis1, axis2, axis3) => {\n if (this.morph) {\n this.morph.matrix.elements[0] = axis1[0];\n this.morph.matrix.elements[1] = axis1[1];\n this.morph.matrix.elements[2] = axis1[2];\n this.morph.matrix.elements[3] = 0.0;\n this.morph.matrix.elements[4] = axis2[0];\n this.morph.matrix.elements[5] = axis2[1];\n this.morph.matrix.elements[6] = axis2[2];\n this.morph.matrix.elements[7] = 0.0;\n this.morph.matrix.elements[8] = axis3[0];\n this.morph.matrix.elements[9] = axis3[1];\n this.morph.matrix.elements[10] = axis3[2];\n this.morph.matrix.elements[11] = 0.0;\n this.morph.matrix.elements[12] = position[0];\n this.morph.matrix.elements[13] = position[1];\n this.morph.matrix.elements[14] = position[2];\n this.morph.matrix.elements[15] = 1.0;\n this.morph.matrixAutoUpdate = false;\n }\n _position = [...position];\n if (label) {\n label.setPosition(position[0], position[1], position[2]);\n }\n }\n\n /**\n * Set the color of the glyph and its label.\n *\n * @param {THREE.Color} color - Colour to be set.\n */\n this.setColour = (color) => {\n if (label)\n label.setColour(color);\n if (this.secondaryMesh && this.secondaryMesh.material)\n this.secondaryMesh.material.color = colour;\n if (this.geometry) {\n this.geometry.colorsNeedUpdate = true;\n }\n }\n\n /**\n * Clear and free its memory.\n */\n this.dispose = () => {\n if (this.material)\n this.material.dispose();\n this.morph = undefined;\n }\n}\n\nGlyph.prototype = Object.create(ZincObject.prototype);\nexport { Glyph };\n","import {\n\tNoBlending,\n\tNormalBlending,\n\tAdditiveBlending,\n\tSubtractiveBlending,\n\tMultiplyBlending,\n\tCustomBlending,\n\n\tFaceColors,\n\tVertexColors,\n\n\tDoubleSide,\n\tBackSide,\n\n\tMirroredRepeatWrapping,\n RepeatWrapping,\n MathUtils,\n MaterialLoader,\n TextureLoader,\n Color\n} from 'three';\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Loader() {}\n\nLoader.Handlers = {\n\n\thandlers: [],\n\n\tadd: function ( regex, loader ) {\n\n\t\tthis.handlers.push( regex, loader );\n\n\t},\n\n\tget: function ( file ) {\n\n\t\tvar handlers = this.handlers;\n\n\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\tvar regex = handlers[ i ];\n\t\t\tvar loader = handlers[ i + 1 ];\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\nObject.assign( Loader.prototype, {\n\n\tcrossOrigin: 'anonymous',\n\n\tonLoadStart: function () {},\n\n\tonLoadProgress: function () {},\n\n\tonLoadComplete: function () {},\n\n\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\tvar array = [];\n\n\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t}\n\n\t\treturn array;\n\n\t},\n\n\tcreateMaterial: ( function () {\n\n\t\tvar BlendingMode = {\n\t\t\tNoBlending: NoBlending,\n\t\t\tNormalBlending: NormalBlending,\n\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\tCustomBlending: CustomBlending\n\t\t};\n\n\t\tvar color = new Color();\n\t\tvar textureLoader = new TextureLoader();\n\t\tvar materialLoader = new MaterialLoader();\n\n\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t// convert from old material format\n\n\t\t\tvar textures = {};\n\n\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\tvar texture;\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t}\n\n\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t}\n\n\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t}\n\n\t\t\t\tvar uuid = MathUtils.generateUUID();\n\n\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\treturn uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar json = {\n\t\t\t\tuuid: MathUtils.generateUUID(),\n\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t};\n\n\t\t\tfor ( var name in m ) {\n\n\t\t\t\tvar value = m[ name ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\tjson.normalScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\tcase 'opacity':\n\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\tcase 'transparent':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\treturn materialLoader.parse( json );\n\n\t\t};\n\n\t} )()\n\n} );\n\nexport { Loader };\n","import * as THREE from 'three';\n\n/**\n * Provide basic functionality to display video as texture.\n * VideoTexture is used for creating and updating a video projected onto a Three.js texture\n *\n * @class\n * @param {Object} containerIn - Container to create the renderer on.\n * @author Alan Wu\n * @return {VideoHandler}\n */\nconst VideoHandler = function(srcIn) {\n\n\tvar _this = this;\n\tthis.video = undefined;\n\tthis.videoTexture = undefined;\n\tvar src = srcIn;\n\tvar lastTime = 0;\n\tvar lastUpdate = 0;\n\tvar frameRate = 30;\n\tvar videoPlaneLoadedFlag = false;\n\tvar lastPlayPos = 0;\n\tvar currentPlayPos = 0;\n\tvar bufferingDetected = false;\n\n\tvar checkBuffering = function(delta, playAnimation) {\n\t currentPlayPos = _this.video.currentTime;\n\n\t // checking offset should be at most the check interval\n\t // but allow for some margin\n\t var offset = delta - 0.02;\n\n\t // if no buffering is currently detected,\n\t // and the position does not seem to increase\n\t // and the _this.video isn't manually paused...\n\t if (!bufferingDetected && (currentPlayPos < (lastPlayPos + offset)) &&\n\t \t\t!_this.video.paused) {\n\t bufferingDetected = true;\n\t }\n\n\t // if we were buffering but the _this.video has advanced,\n\t // then there is no buffering\n\t if (bufferingDetected && (currentPlayPos > (lastPlayPos + offset)) &&\n\t \t\t!_this.video.paused) {\n\t bufferingDetected = false;\n\t }\n\t lastPlayPos = currentPlayPos;\n\t}\n\n\tvar initialise = function(){\n\t\tif (document) {\n\t\t \t_this.video = document.createElement( 'video' );\n\t\t \t_this.video.crossOrigin = \"anonymous\";\n\t\t \t_this.video.src = src;\n\t\t \t_this.video.load();\n _this.video.loop = true;\n\n\t\t}\n\t}\n\n\tthis.setMorphTime = function(time, duration){\n\t\tvar actualTime = time / duration * _this.video.duration;\n\t\t_this.video.currentTime = actualTime;\n\t}\n\n\t// videoPlaneLoaded connects the video to the video texture once it has loaded\n\t this.getVideoDuration = function() {\n\t\t return _this.video.duration;\n\t}\n\n\tthis.createCanvasVideoTexture = function(){\n\t\t_this.videoTexture = new THREE.VideoTexture( _this.video );\n\t\t_this.videoTexture.minFilter = THREE.LinearFilter;\n\t\t_this.videoTexture.magFilter = THREE.LinearFilter;\n\t\t_this.videoTexture.format = THREE.RGBFormat;\n _this.video.currentTime = 0;\n\t\treturn _this.videoTexture;\n\t}\n\n\tthis.getCurrentTime = function(duration) {\n\t\tif (_this.video)\n\t\t\treturn duration * (_this.video.currentTime / _this.video.duration);\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tthis.isReadyToPlay = function(){\n\t\t// video.readyState 3 means we have data to load for the current time and foreseeable future\n\t\tif (_this.video && _this.video.readyState >= 3){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t//this should be handle by scene... check the sync at\n\tinitialise();\n\n}\n\nexport { VideoHandler }\n","import * as THREE from 'three';\nimport { Face3 } from '../three/Geometry';\nimport { Geometry } from '../three/Geometry';\nimport { Loader } from '../three/Loader';\nimport { VideoHandler } from '../videoHandler';\n\nconst AnimationClip = THREE.AnimationClip;\nconst Color = THREE.Color;\nconst DefaultLoadingManager = THREE.DefaultLoadingManager;\nconst FileLoader = THREE.FileLoader;\nconst LoaderUtils = THREE.LoaderUtils;\nconst Vector2 = THREE.Vector2;\nconst Vector3 = THREE.Vector3;\nconst Vector4 = THREE.Vector4;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction JSONLoader( manager ) {\n\n\tif ( typeof manager === 'boolean' ) {\n\n\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\tmanager = undefined;\n\n\t}\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\tthis.withCredentials = false;\n\n this.paramsString = \"\";\n\n}\n\nObject.assign( JSONLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url );\n\n\t\tvar loader = new FileLoader( this.manager );\n\n const params = url.split(\"?\");\n\n //There are parameters, add them to the target\n if (url.length === 2) {\n\n this.paramsString = paramsStrings[1];\n\n } else {\n\n this.paramsString = \"\";\n\n }\n\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = undefined;\n\t\t\ttry {\n json = JSON.parse(text);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\"The loader has encountered an error while parsing the content of a resource.\");\n\t\t\t\tif (onError) {\n\t\t\t\t\tonError({responseURL: url});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar metadata = json.metadata;\n\n\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\tvar type = metadata.type;\n\n\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n if (scope && scope.parse) {\n\t\t\t\ttry {\n\t\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\t\tonLoad( object.geometry, object.materials );\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(\"The loader has encountered aon loading the geometry\");\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t\tif (onError) {\n\t\t\t\t\t\tonError({responseURL: url});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetTexturePath: function ( value ) {\n\n\t\tthis.texturePath = value;\n\n\t},\n\n\tparse: ( function () {\n\n\t\tfunction parseModel( json, geometry ) {\n\n\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t}\n\n\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tscale = json.scale,\n\n\t\t\t\tnUvLayers = 0;\n\n\n\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t// disregard empty arrays\n\n\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = vertices.length;\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\tvertex = new Vector3();\n\n\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t}\n\n\t\t\toffset = 0;\n\t\t\tzLength = faces.length;\n\n if (json.uvs) {\n\n for ( i = 0; i < json.uvs.length; i ++ ) {\n\n geometry.uvs[i] = [];\n\n for ( let k = 0; k < json.uvs[i].length ; k++ ) {\n\n geometry.uvs[i][k] = json.uvs[i][k];\n\n }\n\n }\n\n }\n\n if (normals) {\n\n for ( i = 0; i < normals.length; i ++ ) {\n\n geometry.normals[i] = normals[i];\n\n }\n\n }\n\n if (colors) {\n\n for ( i = 0; i < colors.length; i ++ ) {\n\n geometry.colors[i] = colors[i];\n\n }\n\n }\n\n\n\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\ttype = faces[ offset ++ ];\n\n\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\thasFaceColor = isBitSet( type, 6 );\n\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\toffset += 4;\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\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 ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface = new Face3();\n\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\tface.c = faces[ offset ++ ];\n\n //A hack to get things going\n if (!face.b) face.b = face.a;\n if (!face.c) face.c = face.b;\n\n\n\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\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 ( hasFaceNormal ) {\n\n\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseSkin( json, geometry ) {\n\n\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.bones = json.bones;\n\n\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseMorphing( json, geometry ) {\n\n\t\t\tvar scale = json.scale;\n\n\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.morphNormals !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.morphNormals.length; i < l; i ++ ) {\n\n if (geometry.morphTargets[ i ]) {\n\n geometry.morphTargets[ i ].normals = [];\n\n var dstNormals = geometry.morphTargets[ i ].normals;\n var srcNormals = json.morphNormals[ i ].normals;\n\n for ( var v = 0, vl = srcNormals.length; v < vl; v += 3 ) {\n\n var normals = new Vector3();\n normals.x = srcNormals[ v ];\n normals.y = srcNormals[ v + 1 ] ;\n normals.z = srcNormals[ v + 2 ] ;\n\n dstNormals.push( normals );\n\n }\n\n geometry.morphNormalsReady = true;\n\n }\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.morphColors !== undefined ) {\n\n\t\t\t\tvar i, l, c, cl, dstColors, srcColors, color;\n\n\t\t\t\tfor ( i = 0, l = json.morphColors.length; i < l; i ++ ) {\n\n\t\t\t\t\tgeometry.morphColors[ i ] = {};\n\t\t\t\t\tgeometry.morphColors[ i ].name = json.morphColors[ i ].name;\n\t\t\t\t\tgeometry.morphColors[ i ].colors = [];\n\n\t\t\t\t\tdstColors = geometry.morphColors[ i ].colors;\n\t\t\t\t\tsrcColors = json.morphColors[ i ].colors;\n\n\t\t\t\t\tfor ( c = 0, cl = srcColors.length; c < cl; c += 3 ) {\n\n\t\t\t\t\t\tcolor = new THREE.Color( 0xffaa00 );\n\t\t\t\t\t\tcolor.setRGB( srcColors[ c ], srcColors[ c + 1 ], srcColors[ c + 2 ] );\n\t\t\t\t\t\tdstColors.push( color );\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 parseAnimations( json, geometry ) {\n\n\t\t\tvar outputAnimations = [];\n\n\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\tvar animations = [];\n\n\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\tanimations.push( json.animation );\n\n\t\t\t}\n\n\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t}\n\n\t\t\t// parse implicit morph animations\n\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t}\n\n\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t}\n\n\t\treturn function parse( json, texturePath ) {\n\n\t\t\tif ( json.data !== undefined ) {\n\n\t\t\t\t// Geometry 4.0 spec\n\t\t\t\tjson = json.data;\n\n\t\t\t}\n\n\t\t\tif ( json.scale !== undefined ) {\n\n\t\t\t\tjson.scale = 1.0 / json.scale;\n\n\t\t\t} else {\n\n\t\t\t\tjson.scale = 1.0;\n\n\t\t\t}\n\n\t\t\tvar geometry = new Geometry();\n\t\t\tgeometry.morphColors = [];\n\t\t\tparseModel( json, geometry );\n\t\t\tparseSkin( json, geometry );\n\t\t\tparseMorphing( json, geometry );\n\t\t\tparseAnimations( json, geometry );\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, 'Anonymous' );\n\n\n\t\t\t\tif (json.materials[0].video) {\n\n\t\t\t\t\tvar fullPath = texturePath + json.materials[0].video;\n\n if (this.paramsString) {\n\n fullPath = fullPath + `?${this.paramsString}`;\n\n }\n\n\t\t\t\t\tconst videoHandler = new VideoHandler(fullPath);\n\n\t\t\t\t\tgeometry._video = videoHandler;\n\n\t\t\t\t}\n\n\t\t\t\tif (materials && materials.length > 0) {\n\t\t\t\t\tif (json.materials[0].singleSided) {\n\t\t\t\t\t\tmaterials[0].side = THREE.FrontSide;\n\t\t\t\t\t} else if (json.materials[0].flipSided){\n\t\t\t\t\t\tmaterials[0].side = THREE.BackSide;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmaterials[0].side = THREE.DoubleSide;\n }\n if (json.materials[0].specularCoef) {\n materials[0].shininess = Math.floor(json.materials[0].specularCoef / 3);\n }\n\t\t\t\t}\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n} );\n\n\nexport { JSONLoader };\n","import * as THREE from 'three';\nimport { Glyph } from './glyph';\nimport { ZincObject } from './zincObject';\nimport { JSONLoader } from '../loaders/JSONLoader';\n\n/**\n * This is a container of {@link Glyph} and their graphical properties\n * including transformations, colors, number of time steps, duration of animations\n * and group name. Please note that all glyphs in the glyphset share the same geometry\n * however they may have different transformations.\n *\n * @class\n * @author Alan Wu\n * @return {Glyphset}\n */\nconst Glyphset = function () {\n ZincObject.call(this);\n const glyphList = [];\n let axis1s = undefined;\n let axis2s = undefined;\n let axis3s = undefined;\n let positions = undefined;\n let scales = undefined;\n let colors = undefined;\n let labels = undefined;\n let numberOfTimeSteps = 0;\n let numberOfVertices = 0;\n let baseSize = [0, 0, 0];\n let offset = [0, 0, 0];\n let scaleFactors = [0, 0, 0];\n let repeat_mode = \"NONE\";\n this.ready = false;\n let morphColours = false;\n let morphVertices = false;\n this.isGlyphset = true;\n let _transformMatrix = new THREE.Matrix4();\n const _bot_colour = new THREE.Color();\n const _top_colour = new THREE.Color();\n const _boundingBox1 = new THREE.Box3();\n const _boundingBox2 = new THREE.Box3();\n const _boundingBox3 = new THREE.Box3();\n const _points = [];\n const _current_positions = [];\n const _current_axis1s = [];\n const _current_axis2s = [];\n const _current_axis3s = [];\n const _current_scales = [];\n const _current_colors = [];\n const _glyph_axis_array = [];\n this.globalScale = 1;\n for (let i = 0; i < 8; i++) {\n _points[i] = new THREE.Vector3();\n }\n\n /**\n * Copy glyphset data into this glyphset then load the glyph's geoemtry\n * with the provided glyphURL. FinishCallback will be called once\n * glyph is loaded.\n *\n * @param {Array} glyphsetData - contains the informations about the glyphs.\n * @param {String} glyphURL - URL to the geometry which will be applied to all\n * all the glyphs in the glyphset once loaded.\n * @param {Function} finishCallback - User's function to be called once glyph's\n * geometry is loaded.\n */\n this.load = (glyphsetData, glyphURL, finishCallback, isInline, displayLabels) => {\n axis1s = glyphsetData.axis1;\n axis2s = glyphsetData.axis2;\n axis3s = glyphsetData.axis3;\n positions = glyphsetData.positions;\n scales = glyphsetData.scale;\n colors = glyphsetData.colors;\n labels = glyphsetData.label;\n morphColours = glyphsetData.metadata.MorphColours;\n morphVertices = glyphsetData.metadata.MorphVertices;\n numberOfTimeSteps = glyphsetData.metadata.number_of_time_steps;\n repeat_mode = glyphsetData.metadata.repeat_mode;\n numberOfVertices = glyphsetData.metadata.number_of_vertices;\n if (repeat_mode == \"AXES_2D\" || repeat_mode == \"MIRROR\")\n numberOfVertices = numberOfVertices * 2;\n else if (repeat_mode == \"AXES_3D\")\n numberOfVertices = numberOfVertices * 3;\n baseSize = glyphsetData.metadata.base_size;\n offset = glyphsetData.metadata.offset;\n scaleFactors = glyphsetData.metadata.scale_factors;\n const loader = new JSONLoader();\n this.geometry = new THREE.BufferGeometry();\n const instancedMesh = new THREE.InstancedMesh(this.geometry, undefined, numberOfVertices);\n this.setMorph(instancedMesh);\n if (isInline) {\n var object = loader.parse(glyphURL);\n (meshloader(finishCallback, displayLabels))(object.geometry, object.materials);\n object.geometry.dispose();\n } else {\n loader.crossOrigin = \"Anonymous\";\n loader.load(glyphURL, meshloader(finishCallback, displayLabels));\n }\n }\n\n /**\n * Calculate the actual transformation value that can be applied\n * to the transformation matrix.\n *\n * @returns {Array}\n */\n const resolve_glyph_axes = (point, axis1, axis2, axis3, scale, return_arrays) => {\n if (repeat_mode == \"NONE\" || repeat_mode == \"MIRROR\") {\n let axis_scale = [0.0, 0.0, 0.0];\n let final_axis1 = [0.0, 0.0, 0.0];\n let final_axis2 = [0.0, 0.0, 0.0];\n let final_axis3 = [0.0, 0.0, 0.0];\n let final_point = [0.0, 0.0, 0.0];\n const mirrored_axis1 = [0.0, 0.0, 0.0];\n const mirrored_axis2 = [0.0, 0.0, 0.0];\n const mirrored_axis3 = [0.0, 0.0, 0.0];\n const mirrored_point = [0.0, 0.0, 0.0];\n for (var j = 0; j < 3; j++) {\n var sign = (scale[j] < 0.0) ? -1.0 : 1.0;\n axis_scale[j] = (sign * baseSize[j] + scale[j] * scaleFactors[j]) * this.globalScale;\n }\n for (var j = 0; j < 3; j++) {\n final_axis1[j] = axis1[j] * axis_scale[0];\n final_axis2[j] = axis2[j] * axis_scale[1];\n final_axis3[j] = axis3[j] * axis_scale[2];\n final_point[j] = point[j]\n + offset[0] * final_axis1[j]\n + offset[1] * final_axis2[j]\n + offset[2] * final_axis3[j];\n if (repeat_mode == \"MIRROR\") {\n mirrored_axis1[j] = -final_axis1[j];\n mirrored_axis2[j] = -final_axis2[j];\n mirrored_axis3[j] = -final_axis3[j];\n mirrored_point[j] = final_point[j];\n if (scale[0] < 0.0) {\n // shift glyph origin to end of axis1\n final_point[j] -= final_axis1[j];\n mirrored_point[j] -= mirrored_axis1[j];\n }\n }\n }\n /* if required, reverse axis3 to maintain right-handed coordinate system */\n if (0.0 > (\n final_axis3[0] * (final_axis1[1] * final_axis2[2] -\n final_axis1[2] * final_axis2[1]) +\n final_axis3[1] * (final_axis1[2] * final_axis2[0] -\n final_axis1[0] * final_axis2[2]) +\n final_axis3[2] * (final_axis1[0] * final_axis2[1] -\n final_axis1[1] * final_axis2[0]))) {\n final_axis3[0] = -final_axis3[0];\n final_axis3[1] = -final_axis3[1];\n final_axis3[2] = -final_axis3[2];\n }\n return_arrays[0] = [final_point, final_axis1, final_axis2, final_axis3];\n if (repeat_mode == \"MIRROR\") {\n if (0.0 > (\n mirrored_axis3[0] * (mirrored_axis1[1] * mirrored_axis2[2] -\n mirrored_axis1[2] * mirrored_axis2[1]) +\n mirrored_axis3[1] * (mirrored_axis1[2] * mirrored_axis2[0] -\n mirrored_axis1[0] * mirrored_axis2[2]) +\n mirrored_axis3[2] * (mirrored_axis1[0] * mirrored_axis2[1] -\n mirrored_axis1[1] * mirrored_axis2[0]))) {\n mirrored_axis3[0] = -mirrored_axis3[0];\n mirrored_axis3[1] = -mirrored_axis3[1];\n mirrored_axis3[2] = -mirrored_axis3[2];\n }\n return_arrays[1] = [mirrored_point, mirrored_axis1, mirrored_axis2, mirrored_axis3];\n }\n }\n else if (repeat_mode == \"AXES_2D\" || repeat_mode == \"AXES_3D\") {\n let axis_scale = [0.0, 0.0, 0.0];\n let final_point = [0.0, 0.0, 0.0];\n for (var j = 0; j < 3; j++) {\n var sign = (scale[j] < 0.0) ? -1.0 : 1.0;\n axis_scale[j] = (sign * baseSize[0] + scale[j] * scaleFactors[0]) * this.globalScale;\n }\n for (var j = 0; j < 3; j++) {\n final_point[j] = point[j]\n + offset[0] * axis_scale[0] * axis1[j]\n + offset[1] * axis_scale[1] * axis2[j]\n + offset[2] * axis_scale[2] * axis3[j];\n }\n const number_of_glyphs = (glyph_repeat_mode == \"AXES_2D\") ? 2 : 3;\n for (let k = 0; k < number_of_glyphs; k++) {\n let use_axis1, use_axis2;\n const use_scale = scale[k];\n let final_axis1 = [0.0, 0.0, 0.0];\n let final_axis2 = [0.0, 0.0, 0.0];\n let final_axis3 = [0.0, 0.0, 0.0];\n if (k == 0) {\n use_axis1 = axis1;\n use_axis2 = axis2;\n }\n else if (k == 1) {\n use_axis1 = axis2;\n use_axis2 = (glyph_repeat_mode == \"AXES_2D\") ? axis1 : axis3;\n }\n else // if (k == 2)\n {\n use_axis1 = axis3;\n use_axis2 = axis1;\n }\n const final_scale1 = (baseSize[0] + use_scale * scaleFactors[0]) * this.globalScale;\n final_axis1[0] = use_axis1[0] * final_scale1;\n final_axis1[1] = use_axis1[1] * final_scale1;\n final_axis1[2] = use_axis1[2] * final_scale1;\n final_axis3[0] = final_axis1[1] * use_axis2[2] - use_axis2[1] * final_axis1[2];\n final_axis3[1] = final_axis1[2] * use_axis2[0] - use_axis2[2] * final_axis1[0];\n final_axis3[2] = final_axis1[0] * use_axis2[1] - final_axis1[1] * use_axis2[0];\n let magnitude = Math.sqrt(final_axis3[0] * final_axis3[0] + final_axis3[1] * final_axis3[1] + final_axis3[2] * final_axis3[2]);\n if (0.0 < magnitude) {\n let scaling = (baseSize[2] + use_scale * scaleFactors[2]) * this.globalScale / magnitude;\n if ((repeat_mode == \"AXES_2D\") && (k > 0)) {\n scaling *= -1.0;\n }\n final_axis3[0] *= scaling;\n final_axis3[1] *= scaling;\n final_axis3[2] *= scaling;\n }\n\n final_axis2[0] = final_axis3[1] * final_axis1[2] - final_axis1[1] * final_axis3[2];\n final_axis2[1] = final_axis3[2] * final_axis1[0] - final_axis1[2] * final_axis3[0];\n final_axis2[2] = final_axis3[0] * final_axis1[1] - final_axis3[1] * final_axis1[0];\n magnitude = Math.sqrt(final_axis2[0] * final_axis2[0] + final_axis2[1] * final_axis2[1] + final_axis2[2] * final_axis2[2]);\n if (0.0 < magnitude) {\n var scaling = (baseSize[1] + use_scale * scaleFactors[1]) * this.globalScale / magnitude;\n final_axis2[0] *= scaling;\n final_axis2[1] *= scaling;\n final_axis2[2] *= scaling;\n }\n return_arrays[k] = [final_point, final_axis1, final_axis2, final_axis3];\n }\n }\n return return_arrays;\n };\n\n /**\n * Update transformation for each of the glyph in this glyphset.\n */\n const updateGlyphsetTransformation = (\n current_positions,\n current_axis1s,\n current_axis2s,\n current_axis3s,\n current_scales\n ) => {\n let numberOfGlyphs = 1;\n if (repeat_mode == \"AXES_2D\" || repeat_mode == \"MIRROR\")\n numberOfGlyphs = 2;\n else if (repeat_mode == \"AXES_3D\")\n numberOfGlyphs = 3;\n const numberOfPositions = current_positions.length / 3;\n let current_glyph_index = 0;\n _glyph_axis_array.length = numberOfGlyphs;\n for (let i = 0; i < numberOfPositions; i++) {\n const current_index = i * 3;\n const current_position = [current_positions[current_index], current_positions[current_index + 1],\n current_positions[current_index + 2]];\n const current_axis1 = [current_axis1s[current_index], current_axis1s[current_index + 1],\n current_axis1s[current_index + 2]];\n const current_axis2 = [current_axis2s[current_index], current_axis2s[current_index + 1],\n current_axis2s[current_index + 2]];\n const current_axis3 = [current_axis3s[current_index], current_axis3s[current_index + 1],\n current_axis3s[current_index + 2]];\n const current_scale = [current_scales[current_index], current_scales[current_index + 1],\n current_scales[current_index + 2]];\n const arrays = resolve_glyph_axes(current_position, current_axis1, current_axis2,\n current_axis3, current_scale, _glyph_axis_array);\n if (arrays.length == numberOfGlyphs) {\n for (let j = 0; j < numberOfGlyphs; j++) {\n _transformMatrix.elements[0] = arrays[j][1][0];\n _transformMatrix.elements[1] = arrays[j][1][1];\n _transformMatrix.elements[2] = arrays[j][1][2];\n _transformMatrix.elements[3] = 0.0;\n _transformMatrix.elements[4] = arrays[j][2][0];\n _transformMatrix.elements[5] = arrays[j][2][1];\n _transformMatrix.elements[6] = arrays[j][2][2];\n _transformMatrix.elements[7] = 0.0;\n _transformMatrix.elements[8] = arrays[j][3][0];\n _transformMatrix.elements[9] = arrays[j][3][1];\n _transformMatrix.elements[10] = arrays[j][3][2];\n _transformMatrix.elements[11] = 0.0;\n _transformMatrix.elements[12] = arrays[j][0][0];\n _transformMatrix.elements[13] = arrays[j][0][1];\n _transformMatrix.elements[14] = arrays[j][0][2];\n _transformMatrix.elements[15] = 1.0;\n this.morph.setMatrixAt(current_glyph_index, _transformMatrix);\n const glyph = glyphList[current_glyph_index];\n if (glyph) {\n glyph.setTransformation(arrays[j][0], arrays[j][1],\n arrays[j][2], arrays[j][3]);\n }\n current_glyph_index++;\n }\n }\n }\n this.morph.instanceMatrix.needsUpdate = true;\n };\n\n /**\n * Update colour for each of the glyph in this glyphset.\n */\n const updateGlyphsetHexColors = current_colors => {\n let numberOfGlyphs = 1;\n if (repeat_mode == \"AXES_2D\" || repeat_mode == \"MIRROR\")\n numberOfGlyphs = 2;\n else if (repeat_mode == \"AXES_3D\")\n numberOfGlyphs = 3;\n const numberOfColours = current_colors.length;\n let current_glyph_index = 0;\n for (let i = 0; i < numberOfColours; i++) {\n const hex_values = current_colors[i];\n for (let j = 0; j < numberOfGlyphs; j++) {\n _bot_colour.setHex(hex_values)\n this.morph.setColorAt(current_glyph_index, _bot_colour);\n const glyph = glyphList[current_glyph_index];\n if (glyph)\n glyph.setColour(_bot_colour);\n current_glyph_index++;\n }\n }\n this.morph.instanceColor.needsUpdate = true;\n };\n\n /**\n * Update the current states of the glyphs in this glyphset, this includes transformation and\n * colour for each of them. This is called when glyphset and glyphs are initialised and whenever\n * the internal time has been updated.\n */\n const updateMorphGlyphsets = () => {\n let current_positions = _current_positions;\n let current_axis1s = _current_axis1s;\n let current_axis2s = _current_axis2s;\n let current_axis3s = _current_axis3s;\n let current_scales = _current_scales;\n let current_colors = _current_colors;\n\n const current_time = this.inbuildTime / this.duration * (numberOfTimeSteps - 1);\n const bottom_frame = Math.floor(current_time);\n const proportion = 1 - (current_time - bottom_frame);\n const top_frame = Math.ceil(current_time);\n if (morphVertices) {\n const bottom_positions = positions[bottom_frame.toString()];\n const top_positions = positions[top_frame.toString()];\n const bottom_axis1 = axis1s[bottom_frame.toString()];\n const top_axis1 = axis1s[top_frame.toString()];\n const bottom_axis2 = axis2s[bottom_frame.toString()];\n const top_axis2 = axis2s[top_frame.toString()];\n const bottom_axis3 = axis3s[bottom_frame.toString()];\n const top_axis3 = axis3s[top_frame.toString()];\n const bottom_scale = scales[bottom_frame.toString()];\n const top_scale = scales[top_frame.toString()];\n _current_positions.length = bottom_positions.length;\n _current_axis1s.length = bottom_positions.length;\n _current_axis2s.length = bottom_positions.length;\n _current_axis3s.length = bottom_positions.length;\n _current_scales.length = bottom_positions.length;\n\n for (let i = 0; i < bottom_positions.length; i++) {\n current_positions[i] = proportion * bottom_positions[i] + (1.0 - proportion) * top_positions[i];\n current_axis1s[i] = proportion * bottom_axis1[i] + (1.0 - proportion) * top_axis1[i];\n current_axis2s[i] = proportion * bottom_axis2[i] + (1.0 - proportion) * top_axis2[i];\n current_axis3s[i] = proportion * bottom_axis3[i] + (1.0 - proportion) * top_axis3[i];\n current_scales[i] = proportion * bottom_scale[i] + (1.0 - proportion) * top_scale[i];\n }\n } else {\n current_positions = positions[\"0\"];\n current_axis1s = axis1s[\"0\"];\n current_axis2s = axis2s[\"0\"];\n current_axis3s = axis3s[\"0\"];\n current_scales = scales[\"0\"];\n }\n updateGlyphsetTransformation(current_positions, current_axis1s, current_axis2s, current_axis3s,\n current_scales);\n this.boundingBoxUpdateRequired = true;\n if (colors != undefined) {\n if (morphColours) {\n const bottom_colors = colors[bottom_frame.toString()];\n const top_colors = colors[top_frame.toString()];\n current_colors.length = bottom_colors.length;\n for (let i = 0; i < bottom_colors.length; i++) {\n _bot_colour.setHex(bottom_colors[i]);\n _top_colour.setHex(top_colors[i]);\n _bot_colour.setRGB(_bot_colour.r * proportion + _top_colour.r * (1 - proportion),\n _bot_colour.g * proportion + _top_colour.g * (1 - proportion),\n _bot_colour.b * proportion + _top_colour.b * (1 - proportion));\n current_colors[i] = _bot_colour.getHex();\n }\n /*\n for (var i = 0; i < bottom_colors.length; i++) {\n current_colors.push(proportion * bottom_colors[i] + (1.0 - proportion) * top_colors[i]);\n }\n */\n } else {\n current_colors = colors[\"0\"];\n }\n updateGlyphsetHexColors(current_colors);\n }\n };\n\n /**\n * Get the assigned label for instance at index\n */\n this.getLabel = (index) => {\n if (labels && labels.length > index) {\n return labels[index];\n }\n return undefined;\n }\n\n\n /**\n * Display the label of the glyphs in the glyphset.\n */\n this.showLabel = () => {\n for (let i = 0; i < glyphList.length; i++) {\n glyphList[i].showLabel(this.morph.material ? this.morph.material.color : undefined);\n }\n }\n\n /**\n * Hide label with the choosen colour.\n */\n this.hideLabel = () => {\n for (let i = 0; i < glyphList.length; i++) {\n glyphList[i].hideLabel();\n }\n }\n\n /**\n * Create the glyphs in the glyphset.\n *\n * @param {Boolean} displayLabels -Flag to determine either the labels should be display or not.\n */\n const createGlyphs = (displayLabels) => {\n for (let i = 0; i < numberOfVertices; i++) {\n const glyph = new Glyph(undefined, undefined, i, this);\n let label = labels ? labels[i] : undefined;\n label = label ? label : this.groupName;\n if (label) {\n glyph.setLabel(label);\n }\n if (numberOfTimeSteps > 0) {\n glyph.setFrustumCulled(false);\n }\n glyphList[i] = glyph;\n this.morph.add(glyph.getGroup());\n }\n if (displayLabels) {\n this.showLabel();\n }\n //Update the transformation of the glyphs.\n updateGlyphsetTransformation(positions[\"0\"], axis1s[\"0\"],\n axis2s[\"0\"], axis3s[\"0\"], scales[\"0\"]);\n //Update the color of the glyphs.\n if (colors != undefined) {\n updateGlyphsetHexColors(colors[\"0\"]);\n }\n this.ready = true;\n this.boundingBoxUpdateRequired = true;\n };\n\n /**\n * Add a custom {@link Glyph} to this {@link Glyphset}.\n *\n * @param {Glyph} Glyph to be added.\n */\n this.addCustomGlyph = glyph => {\n if (glyph.isGlyph)\n glyphList.push(glyph);\n this.ready = true;\n this.boundingBoxUpdateRequired = true;\n }\n\n /**\n * Add a THREE.Mesh object to be displayed as glyph in this {@link Glyphset}.\n *\n * @param {THREE.Mesh} Mesh to be added.\n * @param {Number} id of the mesh.\n */\n this.addMeshAsGlyph = (mesh, id) => {\n if (mesh.isMesh) {\n const glyph = new Glyph(undefined, undefined, id, this);\n glyph.fromMesh(mesh);\n glyphList.push(glyph);\n this.morph.add(glyph.getGroup())\n this.ready = true;\n this.boundingBoxUpdateRequired = true;\n return glyph;\n }\n return undefined;\n }\n\n /**\n * A function which iterates through the list of glyphs and call the callback\n * function with the glyph as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the glyph\n * as an argument.\n */\n this.forEachGlyph = callbackFunction => {\n for (let i = 0; i < glyphList.length; i++) {\n callbackFunction(glyphList[i]);\n }\n }\n\n var meshloader = (finishCallback, displayLabels) => {\n return (geometry, materials) => {\n const tempGeometry = geometry.toBufferGeometry();\n this.geometry.copy(tempGeometry);\n this.geometry.computeBoundingSphere();\n this.geometry.computeBoundingBox();\n tempGeometry.dispose();\n if (materials && materials[0])\n this.morph.material = materials[0];\n createGlyphs(displayLabels);\n this.morph.name = this.groupName;\n this.morph.userData = this;\n this.setMorph(this.morph);\n geometry.dispose();\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(this);\n };\n }\n\n /**\n * Get the index of the closest vertex to centroid.\n */\n this.getClosestVertexIndex = function () {\n let closestIndex = -1;\n if (this.morph && this.ready) {\n this.getBoundingBox().getCenter(this._v1);\n let current_positions = positions[\"0\"];\n const numberOfPositions = current_positions.length / 3;\n let distance = -1;\n let currentDistance = 0;\n for (let i = 0; i < numberOfPositions; i++) {\n const current_index = i * 3;\n this._v2.set(current_positions[current_index],\n current_positions[current_index + 1],\n current_positions[current_index + 2]);\n currentDistance = this._v1.distanceTo(this._v2);\n if (distance == -1) {\n distance = currentDistance;\n closestIndex = i;\n } else if (distance > currentDistance) {\n distance = currentDistance;\n closestIndex = i;\n }\n }\n }\n return closestIndex;\n }\n\n /**\n * Get the closest vertex to centroid.\n */\n this.getClosestVertex = function () {\n\n if (this.closestVertexIndex == -1) {\n this.closestVertexIndex = this.getClosestVertexIndex();\n }\n if (this.closestVertexIndex >= 0) {\n /*\n if (glyphList && glyphList[this.closestVertexIndex]) {\n glyphList[this.closestVertexIndex].getBoundingBox().getCenter(position);\n }\n */\n if (this.morph) {\n let position = new THREE.Vector3();\n this.morph.getMatrixAt(this.closestVertexIndex, _transformMatrix);\n position.setFromMatrixPosition(_transformMatrix);\n return position;\n }\n }\n\n return undefined;\n }\n\n /**\n * Get the bounding box for the whole set of glyphs.\n *\n * @return {Three.Box3};\n */\n this.getBoundingBox = () => {\n if (this.morph && this.ready && this.morph.visible) {\n if (this.boundingBoxUpdateRequired) {\n _boundingBox1.setFromBufferAttribute(\n this.morph.geometry.attributes.position);\n for (let i = 0; i < numberOfVertices; i++) {\n this.morph.getMatrixAt(i, _transformMatrix);\n _boundingBox2.copy(_boundingBox1).applyMatrix4(_transformMatrix);\n if (i == 0) {\n _boundingBox3.copy(_boundingBox2);\n } else {\n _boundingBox3.union(_boundingBox2);\n }\n }\n if (_boundingBox3) {\n this.cachedBoundingBox.copy(_boundingBox3);\n this.morph.updateWorldMatrix(true, true);\n this.cachedBoundingBox.applyMatrix4(this.morph.matrixWorld);\n this.boundingBoxUpdateRequired = false;\n } else\n return undefined;\n }\n return this.cachedBoundingBox;\n }\n return undefined;\n }\n\n /**\n * Set the local time of this glyphset.\n *\n * @param {Number} time - Can be any value between 0 to duration.\n */\n this.setMorphTime = time => {\n if (time > this.duration)\n this.inbuildTime = this.duration;\n else if (0 > time)\n this.inbuildTime = 0;\n else\n this.inbuildTime = time;\n if (morphColours || morphVertices) {\n updateMorphGlyphsets();\n if (morphVertices)\n this.markerUpdateRequired = true;\n }\n }\n\n /**\n * Check if the glyphset is time varying.\n *\n * @return {Boolean}\n */\n this.isTimeVarying = () => {\n if (((this.ready === false) || (numberOfTimeSteps > 0)) &&\n (morphColours || morphVertices))\n return true;\n return false;\n }\n\n /**\n * Get the current inbuild time of the\n *\n * @return {Number}\n */\n this.getCurrentTime = () => {\n return this.inbuildTime;\n }\n\n /**\n * Set the objects scale.\n *\n * @return {THREE.Box3}.\n */\n this.setScaleAll = function(scale) {\n this.globalScale = scale;\n updateMorphGlyphsets();\n }\n\n /**\n * Clear this glyphset and its list of glyphs which will release them from the memory.\n */\n this.dispose = () => {\n for (let i = glyphList.length - 1; i >= 0; i--) {\n glyphList[i].dispose();\n }\n if (this.geometry)\n this.geometry.dispose();\n if (this.morph)\n this.morph.material.dispose();\n axis1s = undefined;\n axis2s = undefined;\n axis3s = undefined;\n positions = undefined;\n scales = undefined;\n colors = undefined;\n this.ready = false;\n this.groupName = undefined;\n }\n\n /**\n * Update the glyphsets if required the render.\n */\n this.render = (delta, playAnimation, options) => {\n if (playAnimation == true) {\n let targetTime = this.inbuildTime + delta;\n if (targetTime > this.duration)\n targetTime = targetTime - this.duration;\n this.inbuildTime = targetTime;\n if (morphColours || morphVertices) {\n updateMorphGlyphsets();\n }\n }\n this.updateMarker(playAnimation, options);\n }\n}\n\nGlyphset.prototype = Object.create(ZincObject.prototype);\nexport { Glyphset };\n","import {\n\tBufferGeometry,\n\tMatrix4,\n Object3D,\n PointsMaterial,\n Ray,\n\tSphere,\n\tVector3\n} from 'three';\n\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _tempA = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\t\tthis.sizePerPixel = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n const drawRange = geometry.drawRange;\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\t\t_sphere.radius += threshold;\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\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ) * this.material.size * this.sizePerPixel;\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 const morphPosition = geometry.morphAttributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\n calculatePosition( this, positionAttribute, morphPosition, a );\n\n\t\t\t\t\ttestPoint( _position, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n calculatePosition( this, positionAttribute, morphPosition, i );\n\n\t\t\t\t\ttestPoint( _position, 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\tconsole.error( 'THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\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\nPoints.prototype.isPoints = true;\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.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 calculatePosition( object, position, morphPosition, a )\t{\n\n _position.fromBufferAttribute( position, a );\n\n const morphInfluences = object.morphTargetInfluences;\n\n if ( object.material.morphTargets && morphPosition && morphInfluences ) {\n\n _morphA.set( 0, 0, 0 );\n\n for ( var i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n const influence = morphInfluences[ i ];\n const morphAttribute = morphPosition[ i ];\n\n if ( influence === 0 ) continue;\n\n _tempA.fromBufferAttribute( morphAttribute, a );\n\n _morphA.addScaledVector( _tempA.sub( _position ), influence );\n\n }\n\n _position.add( _morphA );\n\n }\n\n}\n\nexport { Points };","import * as THREE from 'three';\nimport { Label } from './label';\nimport { Points } from '../three/Points';\nimport { ZincObject } from './zincObject';\nimport { getCircularTexture, toBufferGeometry } from '../utilities';\n\n/**\n * Provides an object which stores points and provides method which controls its position.\n * This is created when a valid json file containing point is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Pointset}\n */\nconst Pointset = function () {\n ZincObject.call(this);\n this.isPointset = true;\n const labelSets = [];\n let labelSize = 1.0;\n let labelDepthTest = false;\n let fontWeight = 500;\n let labelVisibility = true;\n\n /**\n * Create the pointsets using geometry and material.\n *\n * @param {THREE.Geomtry} geometryIn - Geometry of points to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n this.createMesh = (geometryIn, materialIn, options) => {\n if (geometryIn && materialIn) {\n let geometry = toBufferGeometry(geometryIn, options);\n const texture = getCircularTexture();\n materialIn.map = texture;\n let point = new Points(geometry, materialIn);\n this.setMesh(point, options.localTimeEnabled,\n options.localMorphColour);\n }\n }\n\n const addLabel = (index, coord, labelText, colourHex) => {\n if (labelText) {\n const colour = new THREE.Color(colourHex);\n const label = new Label(labelText, colour);\n label.setPosition(coord[0], coord[1], coord[2]);\n const sprite = label.getSprite();\n sprite.material.sizeAttenuation = false;\n sprite.material.alphaTest = 0.5;\n sprite.material.transparent = true;\n sprite.material.depthWrite = false;\n sprite.material.depthTest = labelDepthTest;\n label.setFontWeight(fontWeight);\n label.setSize(labelSize);\n label.setVisibility(labelVisibility);\n this.group.add(sprite);\n labelSets[index] = label;\n }\n }\n\n const removeLabel = (index) => {\n const label = labelSets[index];\n if (label) {\n const sprite = label.getSprite();\n this.group.remove(sprite);\n label.dispose();\n labelSets.splice(index, 1);\n }\n }\n\n /**\n * Add points to existing mesh if it exists, otherwise\n * create a new one and add to it.\n * @param {Array} coords -An array of three components coordinates.\n * @param {Array|String} labels - An array of strings, these are only added\n * if the number of coords equals to the number labels provided.\n * @param {Number} colour - A hex value of the colour for the points\n */\n this.addPoints = (coords, labels, colour) => {\n if (coords && coords.length > 0) {\n let current = this.drawRange;\n if (current === -1) {\n current = 0;\n }\n const geometry = this.addVertices(coords);\n let mesh = this.getMorph();\n if (!mesh) {\n let material = new THREE.PointsMaterial({ alphaTest: 0.5, size: 10,\n color: colour, sizeAttenuation: false });\n const options = { localTimeEnabled: false, localMorphColour: false};\n geometry.colorsNeedUpdate = true;\n this.createMesh(geometry, material, options);\n }\n\n let end = current + coords.length;\n let index = 0;\n if ((Array.isArray(labels) && labels.length === coords.length) ||\n (typeof labels === \"string\")) {\n const size = labelSets.length;\n for (current; current + index < end;) {\n const labelText = typeof labels === \"string\" ? labels : labels[index];\n addLabel(current + index, coords[index], labelText, this._lod._material.color);\n index++;\n }\n }\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n }\n\n /**\n * Set the colour of the pointset and its label using the hex value\n *\n * @param {Number} hex - hex value of color to be set\n */\n this.setColourHex = function(hex) {\n this._lod._material.color.setHex(hex);\n if (this._lod._secondaryMaterial) {\n this._lod._secondaryMaterial.color.setHex(hex);\n }\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setColour(this._lod._material.color);\n }\n }\n }\n\n /**\n * Set the colour of the pointset and its label\n *\n * @param {THREE.Color} colour - colour to be set\n */\n this.setColour = (colour) => {\n this._lod.setColour(colour);\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setColour(this._lod._material.color);\n }\n }\n }\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Boolean} flag - Determin either size attenuation\n * should be on or off.\n */\n this.setLabelDepthTest = (flag) => {\n labelDepthTest = flag;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setDepthTest(flag);\n }\n }\n }\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Number} fontWeightIn - Default value is 700\n */\n this.setLabelFontWeight = (fontWeightIn) => {\n fontWeight = fontWeightIn;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setFontWeight(fontWeightIn);\n }\n }\n }\n\n /**\n * Set the size of the label\n *\n * @param {Number} size - Size to set, default\n * value is 1.\n */\n this.setLabelSize = (size) => {\n labelSize = size;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setSize(labelSize);\n }\n }\n }\n\n /**\n * Set visibility of Labels\n *\n * @param {boolean} flag - default value is true\n */\n this.displayLabels = (flag) => {\n labelVisibility = flag;\n for (let i = 0; i < labelSets.length; i++) {\n if (labelSets[i]) {\n labelSets[i].setVisibility(labelVisibility);\n }\n }\n }\n /**\n * Set the size of the points.\n *\n * @param {Number} size - size to be set.\n */\n this.setSize = size => {\n if (this.morph && this.morph.material) {\n this.morph.material.size = size;\n this.morph.material.needsUpdate = true;\n }\n }\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Boolean} flag - Determin either size attenuation\n * should be on or off.\n */\n this.setSizeAttenuation = flag => {\n if (this.morph && this.morph.material) {\n this.morph.material.sizeAttenuation = flag;\n this.morph.material.needsUpdate = true;\n }\n }\n\n /**\n * Get vertices at index\n */\n this.getVerticesByIndex = function(index) {\n if (index >= 0 && this.drawRange > index) {\n const positionAttribute = this.getMorph().geometry.getAttribute( 'position' );\n return [\n positionAttribute.getX(index),\n positionAttribute.getY(index),\n positionAttribute.getZ(index)\n ];\n }\n return undefined;\n }\n\n /**\n * Edit Vertice in index.\n */\n this.editVertices = function(coords, i) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n const maxIndex = i + coords.length - 1;\n if (!mesh || 0 > i || maxIndex >= this.drawRange) {\n return;\n } else {\n const positionAttribute = mesh.geometry.getAttribute( 'position' );\n let index = i;\n coords.forEach(coord => {\n const label = labelSets[index];\n if (label) {\n label.setPosition(coord[0], coord[1], coord[2]);\n }\n positionAttribute.setXYZ(index++, coord[0], coord[1], coord[2]);\n\n });\n positionAttribute.needsUpdate = true;\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n }\n\n /**\n * Delete a vertex in index.\n */\n this.deleteVertices = function(index) {\n let removed = Pointset.prototype.deleteVertices.call(this, index);\n if (removed) {\n removeLabel(index);\n }\n return this.drawRange;\n }\n\n /**\n * Set the name for this ZincObject.\n *\n * @param {String} groupNameIn - Name to be set.\n */\n this.setName = function(groupNameIn) {\n const oldName = this.groupName;\n Pointset.prototype.setName.call(this, groupNameIn);\n labelSets.forEach(label => {\n if (label.getString() === oldName) {\n label?.setText(groupNameIn);\n }\n })\n }\n\n\n /**\n * Turn size attenuation on/off based on the flag.\n *\n * @param {Boolean} flag - Determin either size attenuation\n * should be on or off.\n */\n this.render = (delta, playAnimation, cameraControls, options) => {\n if (this.morph && cameraControls) {\n this.morph.sizePerPixel = cameraControls.pixelHeight;\n }\n Pointset.prototype.render.call(this, delta, playAnimation, cameraControls, options);\n }\n\n}\n\nPointset.prototype = Object.create(ZincObject.prototype);\nexport { Pointset };\n","import * as THREE from 'three';\nimport { toBufferGeometry } from '../utilities';\nimport { augmentMorphColor } from './augmentShader';\nimport { LineSegments } from '../three/line/LineSegments';\nimport { ZincObject } from './zincObject';\n\n/**\n * Provides an object which stores lines.\n * This is created when a valid json file containing lines is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Lines}\n */\nconst Lines = function () {\n ZincObject.call(this);\n\tthis.isLines = true;\n\n /**\n * Create the line segements using geometry and material.\n *\n * @param {THREE.Geomtry} geometryIn - Geometry of lines to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n\tthis.createLineSegment = (geometryIn, materialIn, options) => {\n\t\tif (geometryIn && materialIn) {\n\t\t\tlet geometry = toBufferGeometry(geometryIn, options);\n\t\t\tif (options.localMorphColour && geometry.morphAttributes[ \"color\" ])\n\t\t\t\tmaterialIn.onBeforeCompile = augmentMorphColor();\n let line = new LineSegments(geometry, materialIn);\n this.setMesh(line, options.localTimeEnabled, options.localMorphColour);\n\t\t}\n\t}\n\n /**\n * Set the width for the lines.\n *\n * @param {Number} width - Width of the lines.\n */\n\tthis.setWidth = width => {\n\t\tif (this.morph && this.morph.material) {\n\t\t\tthis.morph.material.linewidth = width;\n\t\t\tthis.morph.material.needsUpdate = true;\n\t\t}\n\t}\n\n /**\n * Add new lines to existing lines if it exists, otherwise\n * create a new one and add to it.\n * @param {Array} coords -An array of three components coordinates.\n\n * @param {Number} colour - A hex value of the colour for the points\n */\n\tthis.addLines = (coords, colour) => {\n if (coords && coords.length > 0) {\n const geometry = this.addVertices(coords);\n let mesh = this.getMorph();\n if (!mesh) {\n let material = new THREE.LineBasicMaterial({color:colour});\n const options = { localTimeEnabled: false, localMorphColour: false};\n geometry.colorsNeedUpdate = true;\n this.createLineSegment(geometry, material, options);\n }\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n\t}\n}\n\nLines.prototype = Object.create(ZincObject.prototype);\nexport { Lines };\n","import * as THREE from 'three';\n\n/**\n * Base texture object for importing images and turning them into\n * texures unit that can be used by other texture primitives.\n *\n * @class\n * @author Alan Wu\n * @return {Texture}\n */\nconst Texture = function () {\n this.isTexture = true;\n this.impl = undefined;\n this.isLoading = false;\n this.size = {\n width: 1,\n height: 1,\n depth: 0\n };\n}\n\n/**\n * Read an image from src.\n *\n * @async\n * @param {Image} img - An image object.\n * @param {String} src - Source location of the image.\n *\n * @return {Promise} img on resolve.\n */\nTexture.prototype.loadImage = function (img, src) {\n return new Promise((resolve, reject) => {\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n })\n}\n\n/**\n @typedef IMAGE_UINT8_RETURN\n @type {Set}\n @property {Uint8Array} array - Array containing the uint8 image value.\n @property {Number} width - Phyiscal image width.\n @property {Number} height - Phyiscal image height.\n */\n/**\n * Read an image from src and turn it into Uint8Array.\n *\n * @async\n * @param {Image} img - An image object.\n * @param {String} src - Source location of the image.\n * @param {Canvas} canvas - Canvas html element used for the conversion.\n *\n * @return {IMAGE_UNIT8_RETURN}\n */\nTexture.prototype.imageToUint8Array = async function (instance, img, src, canvas) {\n await instance.loadImage(img, src);\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n return {\n array: new Uint8Array(ctx.getImageData(0, 0, canvas.width, canvas.height).data.buffer),\n width: canvas.width,\n height: canvas.height\n };\n}\n\nTexture.prototype.loadFromImages = async function (srcArrays) {\n return\n}\n\n/**\n * Return true if the texture is ready for consumption.\n *\n * @return {Boolean}\n */\nTexture.prototype.isReady = function () {\n if (this.impl && !this.isLoading)\n return true;\n return false;\n}\n\n/**\n * Return true if the texture is ready for consumption, otherwise false.\n *\n * @return {Boolean}\n */\nTexture.prototype.getMaterial = function () {\n if (this.impl) {\n return new THREE.MeshBasicMaterial({\n color: new THREE.Color(1, 1, 1),\n transparent: false,\n opacity: 1.0,\n map: this.impl,\n side: THREE.DoubleSide\n });\n }\n}\n\nexport { Texture };\n","import * as THREE from 'three';\nimport { Texture } from './texture';\n\n/**\n * Texture array object for holding array of images into\n * texures unit that can be used by other texture primitives.\n *\n * @class\n * @author Alan Wu\n * @return {TextureArray}\n */\nconst TextureArray = function () {\n Texture.call(this);\n this.isTextureArray = true;\n\n\n /**\n * Read images from an array containg src locations.\n *\n * @async\n * @param {Array} srcArrays - List of source location of the images.\n */\n this.loadFromImages = async (srcArrays) => {\n let w = 1;\n let h = 1;\n let d = 0;\n if (srcArrays && srcArrays.length) {\n this.isLoading = true;\n const image = new Image();\n image.crossOrigin = \"Anonymous\";\n const canvas = document.createElement(\"canvas\");\n let length = 0;\n const dataStacks = new Array(srcArrays.length);\n for (let i = 0; i < srcArrays.length; i++) {\n const data = await this.imageToUint8Array(this, image, srcArrays[i], canvas);\n if (data && data.array) {\n w = data.width;\n h = data.height;\n dataStacks[d] = data.array;\n length += dataStacks[d].length;\n d++;\n }\n }\n const fullArray = new Uint8Array(length);\n length = 0;\n dataStacks.forEach(data => {\n fullArray.set(data, length);\n length += data.length;\n });\n\n this.impl = new THREE.DataTexture2DArray(fullArray, w, h, d);\n this.size = {\n width: w,\n height: h,\n depth: d\n };\n this.isLoading = false;\n this.impl.needsUpdate = true;\n }\n }\n\n /**\n * Get and create the material containing shaders and the textures.\n * The texture must be read and ready before calling this function.\n *\n *\n * @param {Object} options - Customise the material with the options object.\n * @param {String} options.fs - string of the fragment shader used for\n * visualisation.\n * @param {String} options.vs - string of the vertex shader used for\n * visualisation.\n * @param {Object} options.uniforms - Containing the data to be passed into the shaders.\n * @param {String} options.glslVersion - Version of glsl used for compile this shader.\n *\n */\n this.getMaterial = (options) => {\n if (this.impl) {\n let material = undefined;\n if (options) {\n if (options.vs && options.fs) {\n let transparent = true;\n if (\"transparent\" in options) {\n transparent = options.transparent;\n }\n let side = THREE.FrontSide;\n if (options.side)\n side = options.side;\n material = new THREE.ShaderMaterial({\n transparent,\n uniforms: options.uniforms,\n vertexShader: options.vs,\n fragmentShader: options.fs,\n side\n });\n if (options.glslVersion) {\n material.glslVersion = options.glslVersion;\n }\n }\n } else {\n material = new THREE.MeshBasicMaterial({\n color: new THREE.Color(1, 1, 1),\n transparent: false,\n opacity: 1.0,\n map: this.impl,\n side: THREE.DoubleSide\n });\n }\n if (material) {\n material.needsUpdate = true;\n return material;\n }\n }\n }\n}\n\nTextureArray.prototype = Object.create(Texture.prototype);\nexport { TextureArray };\n","import * as THREE from 'three';\nconst glslVersion = THREE.GLSL3;\n\nconst fs =\n`\nprecision highp float;\nprecision highp int;\nprecision highp sampler2DArray;\n\nuniform sampler2DArray diffuse0;\nuniform sampler2DArray diffuse1;\nuniform sampler2DArray mask;\nuniform bool discardAlpha;\nuniform bool maskEnabled;\nuniform float brightness;\nuniform float contrast;\nuniform float time;\nuniform int nChannels;\nin vec3 vUw;\n\nout vec4 outColor;\n\nvoid main() {\n\n float color0 = texture( diffuse0, vUw ).r;\n float color1 = texture( diffuse1, vUw ).r;\n float color = mix(color0, color1, time);\n // discard if alpha is zero\n if (maskEnabled && discardAlpha) {\n float mask = texture(mask, vUw).r;\n if (mask == 0.0) discard;\n }\n\n // discard if alpha is zero\n //if (discardAlpha && color.a == 0.0) discard;\n // Apply brightness\n vec3 brightenedColor = vec3(color) + vec3(brightness);\n // Apply contrast\n vec3 contrastedColor = (brightenedColor - vec3(0.5)) * contrast + vec3(0.5);\n outColor = vec4(contrastedColor, 1.0);\n}\n`;\n\nconst vs =\n`\nout vec3 vUw;\nuniform float depth;\nuniform vec3 slide;\nuniform int direction;\nuniform bool flipY;\nuniform bool flipZ;\n\nvoid main() {\n\n vec3 slidePos = position.xyz;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position.xyz, 1.0 );\n\n if (direction == 1)\n slidePos = vec3(slide.x, position.y, position.x);\n if (direction == 2)\n slidePos = vec3(position.x, slide.y, position.y);\n if (direction == 3)\n slidePos = vec3(position.x, position.y, slide.z);\n\n if (flipY)\n slidePos.y = 1.0 - slidePos.y;\n if (flipZ)\n slidePos.z = 1.0 - slidePos.z;\n\n vUw.xyz = vec3(slidePos.x, slidePos.y, slidePos.z * depth);\n\n}\n`;\n\nconst getUniforms = function() {\n return {\n brightness: { value: 0},\n contrast: { value: 1},\n depth: { value: 1 },\n discardAlpha: {value: true},\n diffuse0: { value: undefined },\n diffuse1: { value: undefined },\n direction: { value: 1 },\n flipY: { value: true },\n flipZ: { value: false },\n nChannels: { value: 1 },\n mask: { value: undefined },\n maskEnabled: { value: false },\n slide: { value: new THREE.Vector3( 0, 0, 1 ) },\n time: { value: 0 }\n };\n}\n\nexport {\n fs,\n vs,\n glslVersion,\n getUniforms\n}\n","import { resolveURL } from '../utilities';\nimport { TextureArray } from '../texture/textureArray';\nimport { ZincObject } from './zincObject';\n/**\n * Provides a base class object which stores textures and rendering object.\n *\n * @class\n * @author Alan Wu\n * @return {TexturePrimitive}\n */\nconst TexturePrimitive = function (textureIn) {\n ZincObject.call(this);\n this.isTexturePrimitive = true;\n this.texture = textureIn;\n //List of textureArray object, which is used for\n //time variation for textureSlides object\n this.textureList = [];\n if (this.texture) {\n this.textureList.push(this.texture);\n }\n\n /**\n * Load texture data into this primitves.\n *\n * @param {Object} textureData - contains the informations about the textures.\n * @param {Function} finishCallback - User's function to be called once texture's\n * is loaded.\n */\n this.load = (textureData, finishCallback, isInline) => {\n if (textureData) {\n if (textureData.images && textureData.images.source) {\n const texture = new TextureArray();\n const imgArray = [];\n textureData.images.source.forEach(img => {\n imgArray.push(resolveURL(img));\n });\n const _this = this;\n texture.loadFromImages(imgArray).then(() => {\n _this.texture = texture;\n _this.textureList.push(this.texture);\n _this.initialise(textureData, finishCallback);\n });\n }\n }\n }\n\n this.addTextureArray = (tArray) => {\n if (this.textureList.length === 0 && this.texture) {\n this.textureList.push(this.texture);\n }\n if (tArray && tArray.isTextureArray) {\n this.textureList.push(tArray);\n }\n }\n\n /**\n * Initialise a texture based on the provided textureData, this should be used\n * internally only.\n *\n * @param {Object} textureData - contains the informations about the textures.\n * @param {Function} finishCallback - User's function to be called once texture's\n * is loaded.\n */\n this.initialise = (textureData, finishCallback) => {\n if (finishCallback != undefined && (typeof finishCallback == 'function')) {\n finishCallback(this);\n }\n }\n}\n\nTexturePrimitive.prototype = Object.create(ZincObject.prototype);\nTexturePrimitive.prototype.constructor = TexturePrimitive;\nexport { TexturePrimitive };\n","import * as THREE from 'three';\nimport * as shader from '../shaders/textureSlide.js';\nimport { TexturePrimitive } from './texturePrimitive';\n\n/**\n * Provides a class which create a texture stacks in a block\n * with shaders allowing slices of texture to be displayed.\n *\n * @param {TextureArray} textureIn - An object of texture array\n * holding texture information.\n *\n * @class\n * @author Alan Wu\n * @return {TextureSlides}\n */\nconst TextureSlides = function (textureIn) {\n TexturePrimitive.call(this, textureIn);\n this.isTextureSlides = true;\n const textureSettings = [];\n const idTextureMap = {};\n this.morph = new THREE.Group();\n this.group = this.morph;\n this.morph.userData = this;\n let edgesLine = undefined;\n let flipY = true;\n let flipZ = false;\n let brightness = 0.0;\n let contrast = 1.0;\n let nChannels = 1;\n let maskTexture = undefined;\n let maskEnabled = false;\n let discardAlpha = true;\n let lt0 = 0;\n let lt1 = 0;\n let prevTime = -0.1;\n\n /**\n @typedef SLIDE_SETTINGS\n @type {Set}\n @property {String} direction - the value must be x, y or z, specify the\n direction the slide should be facing.\n @property {Number} value - Normalised value of the location on direction.\n @property {String} id - ID of the mesh, it is only available if the settings\n is returned from {@link TextureSlides.createSlide} or\n {@link TextureSlides.getTextureSettings}.\n */\n /**\n * Create the slides required for visualisation based on the slide settings.\n * The slides themselves are {THREE.PlanGeometry} objects.\n *\n * @param {SLIDE_SETTINGS} slideSettings - An array to each slide settings.\n */\n this.createSlides = slideSettings => {\n slideSettings.forEach(slide => this.createSlide(slide));\n }\n\n /**\n * Set the value of the uniforms for a specific mesh in this\n * texture slide object.\n *\n * @param {THREE.Mesh} mesh - Mesh to be modified\n * @param {SLIDE_SETTINGS} slideSettings - Slide settings.\n */\n const setUniformSlideSettingsOfMesh = (mesh, settings) => {\n const material = mesh.material;\n const uniforms = material.uniforms;\n mesh.rotation.x = 0;\n mesh.rotation.y = 0;\n mesh.rotation.z = 0;\n mesh.position.x = 0;\n mesh.position.y = 0;\n mesh.position.z = 0;\n switch (settings.direction) {\n case \"x\":\n const rotation = -Math.PI / 2;\n mesh.rotation.y = rotation;\n uniforms.direction.value = 1;\n uniforms.slide.value.set(settings.value, 0, 0);\n mesh.position.x = settings.value;\n break;\n case \"y\":\n mesh.rotation.x = Math.PI / 2;\n uniforms.direction.value = 2;\n uniforms.slide.value.set(0, settings.value, 0);\n mesh.position.y = settings.value;\n break;\n case \"z\":\n uniforms.direction.value = 3;\n uniforms.slide.value.set(0, 0, settings.value);\n mesh.position.z = settings.value;\n break;\n default:\n break;\n }\n material.needsUpdate = true;\n this.boundingBoxUpdateRequired = true;\n }\n\n /**\n * Modify the mesh based on a setting\n *\n * @param {SLIDE_SETTINGS} settings - s.\n */\n this.modifySlideSettings = (settings) => {\n if (settings && settings.id &&\n settings.id in idTextureMap &&\n idTextureMap[settings.id]) {\n setUniformSlideSettingsOfMesh(idTextureMap[settings.id], settings);\n }\n }\n\n /**\n * Create a slide required for visualisation based on the slide settings.\n * The slide itself is an {THREE.PlanGeometry} object.\n *\n * @param {SLIDE_SETTINGS} settings -settings of the slide to be created.\n * @return {SLIDE_SETTINGS} - Returned settings, it includes the newly\n * created mesh's id.\n */\n this.createSlide = settings => {\n if (this.texture && this.texture.isTextureArray && this.texture.isReady()) {\n if (settings && settings.direction && settings.value !== undefined) {\n const geometry = new THREE.PlaneGeometry(1, 1);\n geometry.translate(0.5, 0.5, 0);\n const uniforms = shader.getUniforms();\n uniforms.brightness.value = brightness;\n uniforms.contrast.value = contrast;\n uniforms.diffuse0.value = this.texture.impl;\n uniforms.diffuse1.value = this.texture.impl;\n uniforms.discardAlpha.value = discardAlpha;\n uniforms.depth.value = this.texture.size.depth;\n uniforms.flipY.value = flipY;\n uniforms.flipZ.value = flipZ;\n uniforms.mask.value = maskTexture;\n uniforms.maskEnabled.value = maskEnabled;\n uniforms.nChannels.value = nChannels;\n const options = {\n fs: shader.fs,\n vs: shader.vs,\n uniforms: uniforms,\n glslVersion: shader.glslVersion,\n side: THREE.DoubleSide,\n transparent: false\n };\n const material = this.texture.getMaterial(options);\n material.needsUpdate = true;\n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = this.groupName;\n mesh.userData = this;\n const slideSettings = {\n value: settings.value,\n direction: settings.direction,\n id: mesh.id,\n };\n textureSettings.push(slideSettings);\n setUniformSlideSettingsOfMesh(mesh, slideSettings);\n idTextureMap[mesh.id] = mesh;\n this.morph.add(mesh);\n this.boundingBoxUpdateRequired = true;\n this.updateTimeTexture();\n return slideSettings;\n }\n }\n }\n\n /**\n * Return a copy of texture settings used by this object.\n *\n * @return {SLIDE_SETTINGS} - Returned the list of settings.\n */\n this.getTextureSettings = () => {\n return [...textureSettings];\n }\n\n /**\n * Return a copy of texture settings with corresponding id used by this object.\n *\n * @return {SLIDE_SETTINGS} - Returned a copy of settings with corresponding id.\n */\n this.getTextureSettingsWithId = (id) => {\n for (let i = 0; i < textureSettings.length; i++) {\n if (id === textureSettings[i].id) {\n return {...textureSettings[i]};\n }\n }\n }\n\n /**\n * Get the array of slides, return them in an array\n *\n * @return {Array} - Return an array of {@link THREE.Object)\n */\n this.getSlides = () => {\n if (this.morph) return [...this.morph.children];\n return [];\n }\n\n /**\n * Remove a slide, this will dispose the slide and its material.\n *\n * @param {Slide} slide - Slide to be remvoed\n */\n this.removeSlide = slide => {\n if (slide) {\n this.removeSlideWithId(slide.id);\n }\n }\n\n /**\n * Remove a slide, this will dispose the slide and its material.\n *\n * @param {Number} id - id of slide to be remvoed\n */\n this.removeSlideWithId = id => {\n if (this.morph && id in idTextureMap && idTextureMap[id]) {\n if (this.morph.getObjectById(id)) {\n const slide = idTextureMap[id];\n this.morph.remove(slide);\n slide.clear();\n if (slide.geometry)\n slide.geometry.dispose();\n if (slide.material)\n slide.material.dispose();\n this.boundingBoxUpdateRequired = true;\n }\n const index = textureSettings.findIndex(item => item.id === id);\n if (index > -1) {\n textureSettings.splice(index, 1);\n }\n }\n }\n\n /**\n * Clean up all internal objects.\n */\n this.dispose = () => {\n this.morph.children.forEach(slide => {\n if (slide.geometry)\n slide.geometry.dispose();\n if (slide.material)\n slide.material.dispose();\n });\n TexturePrimitive.prototype.dispose.call(this);\n this.boundingBoxUpdateRequired = true;\n }\n\n //Expand the boundingbox with slide settings\n const expandBoxWithSettings = (box, settings, vector) => {\n if (settings) {\n switch (settings.direction.value) {\n case 1:\n vector.copy(settings.slide.value);\n box.expandByPoint(vector);\n vector.setY(1.0);\n vector.setZ(1.0);\n box.expandByPoint(vector);\n break;\n case 2:\n vector.copy(settings.slide.value);\n box.expandByPoint(vector);\n vector.setX(1.0);\n vector.setZ(1.0);\n box.expandByPoint(vector);\n break;\n case 3:\n vector.copy(settings.slide.value);\n box.expandByPoint(vector);\n vector.setX(1.0);\n vector.setY(1.0);\n box.expandByPoint(vector);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Get the bounding box of this slides.\n * It uses the max and min of the slides position and the\n * transformation to calculate the position of the box.\n *\n * @return {THREE.Box3}.\n */\n this.getBoundingBox = () => {\n if (this.morph && this.morph.children && this.morph.visible &&\n this.boundingBoxUpdateRequired) {\n this.cachedBoundingBox.makeEmpty();\n const vector = new THREE.Vector3(0, 0, 0);\n this.morph.children.forEach(slide => {\n expandBoxWithSettings(this.cachedBoundingBox, slide.material.uniforms,\n vector);\n });\n this.morph.updateMatrixWorld (true, true);\n this.cachedBoundingBox.applyMatrix4(this.morph.matrixWorld);\n this.boundingBoxUpdateRequired = false;\n }\n return this.cachedBoundingBox;\n }\n\n this.applyTransformation = (rotation, position, scale) => {\n const matrix = new THREE.Matrix4();\n matrix.set(\n rotation[0],\n rotation[1],\n rotation[2],\n 0,\n rotation[3],\n rotation[4],\n rotation[5],\n 0,\n rotation[6],\n rotation[7],\n rotation[8],\n 0,\n 0,\n 0,\n 0,\n 0\n );\n const quaternion = new THREE.Quaternion().setFromRotationMatrix(matrix);\n this.morph.position.set(...position);\n this.morph.quaternion.copy( quaternion );\n this.morph.scale.set(...scale);\n this.morph.updateMatrix();\n this.boundingBoxUpdateRequired = true;\n }\n\n this.setRenderOrder = (order) => {\n //multiilayers\n this.morph.renderOrder = order;\n }\n\n this.initialise = (textureData, finishCallback) => {\n if (textureData) {\n const locations = textureData.locations;\n if (locations && locations.length > 0) {\n this.applyTransformation(locations[0].orientation,\n locations[0].position, locations[0].scale);\n if (\"flipY\" in locations[0]) {\n flipY = locations[0].flipY;\n }\n if (\"flipZ\" in locations[0]) {\n flipZ = locations[0].flipZ;\n }\n }\n this.createSlides(textureData.settings.slides);\n if (finishCallback != undefined && (typeof finishCallback == 'function')) {\n finishCallback(this);\n }\n }\n }\n\n this.showEdges = (color) => {\n if (!edgesLine) {\n const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n geometry.translate(0.5, 0.5, 0.5);\n const edges = new THREE.EdgesGeometry( geometry );\n edgesLine = new THREE.LineSegments(edges, new THREE.LineBasicMaterial( { color } ) );\n this.group.add( edgesLine );\n } else {\n edgesLine.material.color = color;\n }\n edgesLine.visible = true;\n }\n\n\n this.setUniformsValue = (name, val) => {\n this.morph.children.forEach((mesh) => {\n const material = mesh.material;\n if (material.type === \"ShaderMaterial\") {\n const uniforms = material.uniforms;\n uniforms[name].value = val;\n material.needsUpdate = true;\n }\n });\n }\n\n this.isAlphaPixelDiscarded = () => {\n return discardAlpha;\n }\n\n this.discardAlphaPixel = (flag) => {\n discardAlpha = flag;\n this.setUniformsValue(\"discardAlpha\", discardAlpha);\n }\n\n this.getBrightness = () => {\n return brightness;\n }\n\n this.setBrightness = (brightnessIn) => {\n brightness = brightnessIn;\n this.setUniformsValue(\"brightness\", brightness);\n }\n\n this.getContrast = () => {\n return contrast;\n }\n\n this.setContrast = (contrastIn) => {\n if (contrast >= 0 ) {\n contrast = contrastIn;\n this.setUniformsValue(\"contrast\", contrast);\n }\n }\n\n this.getNumberOfChannels = () => {\n return nChannels;\n }\n\n this.setNumberOfChannels = (numbersIn) => {\n nChannels = numbersIn;\n this.setUniformsValue(\"nChannels\", nChannels);\n }\n\n this.getMask = () => {\n return maskTexture;\n }\n\n this.setMask = (maskTextureIn) => {\n maskTexture = maskTextureIn;\n maskEnabled = maskTexture ? true : false;\n this.setUniformsValue(\"mask\", maskTexture);\n this.setUniformsValue(\"maskEnabled\", maskEnabled);\n }\n\n this.hideEdges = () => {\n if (edgesLine) {\n edgesLine.visible = false;\n }\n }\n\n this.updateTimeTexture = () => {\n const maxIndex = this.textureList.length - 1;\n const normalisedTime = this.inbuildTime / this.duration;\n if (this.timeEnabled && maxIndex > 0 && prevTime !== normalisedTime) {\n const iTime = normalisedTime * maxIndex;\n const t0 = Math.floor(iTime);\n const t1 = Math.ceil(iTime);\n const ratio = iTime - t0;\n this.morph.children.forEach((mesh) => {\n const material = mesh.material;\n if (material.type === \"ShaderMaterial\") {\n const uniforms = material.uniforms;\n if (lt0 !== t0) {\n uniforms.diffuse0.value = this.textureList[t0].impl;\n }\n if (lt1 !== t1) {\n uniforms.diffuse1.value = this.textureList[t1].impl;\n }\n uniforms.time.value = ratio;\n material.needsUpdate = true;\n }\n });\n lt0 = t0;\n lt1 = t1;\n prevTime = normalisedTime;\n }\n }\n\n /**\n * Update the glyphsets if required the render.\n */\n this.setMorphTime = (time) => {\n let newTime = time;\n if (time > this.duration)\n newTime = this.duration;\n else if (0 > time)\n newTime = 0;\n else\n newTime = time;\n if (newTime != this.inbuildTime) {\n this.inbuildTime = newTime;\n this.updateTimeTexture();\n }\n }\n\n /**\n * Update the glyphsets if required the render.\n */\n this.render = (delta, playAnimation, options) => {\n //console.log(\"render\", delta, playAnimation, this.textureList)\n if (playAnimation == true && this.timeEnabled &&\n this.textureList.length > 1) {\n let targetTime = this.inbuildTime + delta;\n if (targetTime > this.duration)\n targetTime = targetTime - this.duration;\n this.inbuildTime = targetTime;\n this.updateTimeTexture();\n }\n }\n\n}\n\nTextureSlides.prototype = Object.create(TexturePrimitive.prototype);\nTextureSlides.prototype.constructor = TextureSlides;\nexport { TextureSlides };\n","import * as THREE from 'three';\nimport { resolveURL } from './utilities';\n\n/**\n * Object with containg viewport information used in ZincJS.\n *\n * @class\n * @author Alan Wu\n * @return {Viewport}\n */\nconst Viewport = function () {\n /** @property {Number} */\n\tthis.nearPlane = 0.168248;\n /** @property {Number} */\n\tthis.farPlane = 6.82906;\n /**@property {Array} */\n\tthis.eyePosition = [0.5, -2.86496, 0.5];\n /** @property {Array} */\n\tthis.targetPosition = [0.5, 0.5, 0.5];\n /** @property {Array} */\n\tthis.upVector = [ 0.0, 0.0, 1.0];\n\tconst _this = this;\n\n this.setFromObject = ({ nearPlane, farPlane, eyePosition, targetPosition, upVector }) => {\n _this.nearPlane = nearPlane;\n _this.farPlane = farPlane;\n _this.eyePosition = eyePosition;\n _this.targetPosition = targetPosition;\n _this.upVector = upVector;\n }\n};\n\n/**\n * Provides the basic controls for a scene.\n *\n * @class\n * @author Alan Wu\n * @return {CameraControls}\n */\nconst CameraControls = function ( object, domElement, renderer, scene ) {\n\tconst MODE = { NONE: -1, DEFAULT: 0, PATH: 1, SMOOTH_CAMERA_TRANSITION: 2, AUTO_TUMBLE: 3, ROTATE_TRANSITION: 4, MINIMAP: 5, SYNC_CONTROL: 6 };\n /**\n * Actions states.\n * Available states are NONE, ROTATE, ZOOM, PAN, TOUCH_ROTATE, TOUCH_ZOOM, TOUCH_PAN and SCROLL.\n * @property {Object}\n */\n\tconst STATE = { NONE: -1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM: 4, TOUCH_PAN: 5, SCROLL: 6, KEYBOARD_ZOOM: 7, KEYBOARD_ROTATE: 8, KEYBOARD_PAN: 9 };\n const ROTATE_DIRECTION = { NONE: -1, FREE: 1, HORIZONTAL: 2, VERTICAL: 3 };\n\tconst KEYBOARD = { ARROWLEFT: 37, ARROWUP: 38, ARROWRIGHT: 39, ARROWDOWN: 40, NUMPADADD: 107, NUMPADSUBTRACT: 109, EQUAL: 187, MINUS: 189 };\n /**\n * Available click actions are MAIN, AUXILIARY and SECONARY.\n * @property {Object}\n */\n\tconst CLICK_ACTION = {};\n\tCLICK_ACTION.MAIN = STATE.ROTATE;\n\tCLICK_ACTION.AUXILIARY = STATE.ZOOM;\n\tCLICK_ACTION.SECONDARY = STATE.PAN;\n\tthis.cameraObject = object;\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\tthis.renderer = renderer;\n\tthis.scene = scene ;\n\tthis.tumble_rate = 1.5;\n\tthis.pointer_x = 0;\n\tthis.pointer_y = 0;\n\tthis.pointer_x_start = 0;\n\tthis.pointer_y_start = 0;\n\tthis.previous_pointer_x = 0;\n\tthis.previous_pointer_y = 0;\n\tthis.near_plane_fly_debt = 0.0;\n\tthis.touchZoomDistanceStart = 0;\n\tthis.touchZoomDistanceEnd = 0;\n\tthis.directionalLight = 0;\n\tthis.zoomRate = 50;\n\tthis.rotateRate = 50;\n\tthis.panRate = 100;\n\tthis.pixelHeight = 1;\n\tlet duration = 6000;\n let enabled = true;\n\tlet inbuildTime = 0;\n\tlet cameraPath = undefined;\n\tlet numberOfCameraPoint = undefined;\n\tlet updateLightWithPathFlag = false;\n\tlet playRate = 500;\n\tlet deviceOrientationControl = undefined;\n\tlet defaultViewport = \"default\";\n\tlet currentMode = MODE.DEFAULT;\n\tlet smoothCameraTransitionObject = undefined;\n\tlet rotateCameraTransitionObject = undefined;\n\tlet cameraAutoTumbleObject = undefined;\n\tlet zoomSize = 0;\n let rotateMode = ROTATE_DIRECTION.FREE;\n\tthis._state = STATE.NONE;\n\tlet zincRayCaster = undefined;\n\tthis.targetTouchId = -1;\n let rect = undefined;\n const _a = new THREE.Vector3();\n const _b = new THREE.Vector3();\n const _c = new THREE.Vector3();\n const _new_b = new THREE.Vector3();\n const _new_c = new THREE.Vector3();\n const _axis = new THREE.Vector3();\n const _v = new THREE.Vector3();\n const _rel_eye = new THREE.Vector3();\n const sceneSphere = new THREE.Sphere();\n const _tempEye = new THREE.Vector3();\n let hasUpdated = false;\n let ndcControl = undefined;\n let maxDist = 0;\n const viewports = {\n \"default\" : new Viewport()\n };\n viewports.default.nearPlane = 0.1;\n\tviewports.default.farPlane = 2000;\n\tviewports.default.eyePosition = [0, 0, 0];\n\tviewports.default.targetPosition = [0, 0, -1.0];\n\tviewports.default.upVector = [ 0.0, 1.0, 0.0];\n\n //Add the target property\n\tif (this.cameraObject.target === undefined)\n\t\tthis.cameraObject.target = new THREE.Vector3( ...viewports.default.targetPosition );\n\n //Calculate the max distanc allowed, it is the longer\n //of 6 times the radius of the current scene and\n //the current distance between scene centroid and the postion\n //of the camera.\n this.calculateMaxAllowedDistance = (scene) => {\n const box = scene.getBoundingBox();\n if (box) {\n box.getBoundingSphere(sceneSphere);\n maxDist = sceneSphere.radius * 6;\n let currentDist = 0;\n if (this.cameraObject) {\n currentDist = this.cameraObject.position.distanceTo(sceneSphere.center);\n }\n maxDist = currentDist > maxDist ? currentDist * 1.5: maxDist;\n } else {\n maxDist = 0;\n }\n }\n\n const updateNearAndFarPlane = (travalDist) => {\n const ratio = 0.001;\n _a.copy(this.cameraObject.position);\n const length = _a.sub(this.cameraObject.target).length();\n this.cameraObject.near = Math.max(0.0001, length * ratio);\n this.cameraObject.far = this.cameraObject.near * 10000;\n /*\n const near_far_minimum_ratio = 0.0001;\n //const minNear = near_far_minimum_ratio * this.cameraObject.far;\n const minNear = 0.0001;\n if (minNear < (this.cameraObject.near + travalDist + this.near_plane_fly_debt)) {\n if (this.near_plane_fly_debt != 0.0)\t{\n this.near_plane_fly_debt += travalDist;\n if (this.near_plane_fly_debt > 0.0) {\n this.cameraObject.near += this.near_plane_fly_debt;\n this.cameraObject.far += this.near_plane_fly_debt;\n this.near_plane_fly_debt = 0.0;\n }\n else {\n this.cameraObject.near += travalDist;\n this.cameraObject.far += travalDist;\n }\n }\n }\n else {\n //if (this.near_plane_fly_debt == 0.0 ) {\n if (this.cameraObject.near !== 0.0001) {\n const diff = this.cameraObject.near - minNear;\n this.cameraObject.near = minNear;\n this.cameraObject.far -= diff;\n this.near_plane_fly_debt -= diff;\n } else {\n this.near_plane_fly_debt += travalDist;\n }\n }\n */\n }\n\n /**\n * Add a viewport to the list of available named viewports.\n *\n * @param {String} name - Name of the viewport\n * @param {Viewport} viewportName - Viewport to be added\n */\n this.addViewport = (viewportName, viewport) => {\n if (viewportName && viewport)\n viewports[viewportName] = viewport;\n }\n\n /**\n * Set the default viewport for this {@link CameraControls}.\n *\n * @param {String} defaultName - Name of the viewport\n *\n * @return {Boolean} true if set successfully, false otherwise.\n */\n this.setDefaultViewport = defaultName => {\n\t\tif (defaultName && (defaultName in viewports)) {\n defaultViewport = defaultName;\n return true;\n }\n return false\n\t}\n\n /**\n * Get the name of the default viewport.\n *\n *\n * @return {String}\n */\n this.getDefaultViewport = () => {\n\t\treturn defaultViewport;\n\t}\n\n /**\n * Get the viewport with the provied name stored in this object.\n * @param {String} name - Name of the viewport\n *\n * @return {Viewport}\n */\n\tthis.getViewportOfName = name => {\n\t\treturn viewports[name];\n\t}\n\n /**\n * Set the viewport with a name if it is found in the list.\n * @param {String} name - Name of the viewport\n *\n * @return {Boolean} if viewport is found and set, otherwise false.\n */\n this.setCurrentViewport = name => {\n if (name in viewports) {\n this.setCurrentCameraSettings(viewports[name])\n return true;\n }\n return false;\n\t}\n\n /**\n * Set the direction of rotation allowed with this control.\n *\n * @param {String} mode - available options are none, horizontal,\n * vertical and free.\n */\n this.setRotationMode = mode => {\n switch (mode) {\n case \"none\":\n rotateMode = ROTATE_DIRECTION.NONE;\n break;\n case \"horizontal\":\n rotateMode = ROTATE_DIRECTION.HORIZONTAL;\n break;\n case \"vertical\":\n rotateMode = ROTATE_DIRECTION.VERTICAL;\n break;\n case \"free\":\n default:\n rotateMode = ROTATE_DIRECTION.FREE;\n }\n }\n\n\tthis.onResize = () => {\n\t\tif (rect)\n\t\t\trect = undefined;\n if (ndcControl)\n ndcControl.setCurrentCameraSettings(this.cameraObject,\n viewports[defaultViewport]);\n\t}\n\n\tthis.getVisibleHeightAtZDepth = ( depth ) => {\n\t\t// compensate for cameras not positioned at z=0\n\n\t\tconst cameraOffset = this.cameraObject.position.distanceTo(this.cameraObject.target);\n\t\tif ( depth < cameraOffset ) depth -= cameraOffset;\n\t\telse depth += cameraOffset;\n\n\t\t// vertical fov in radians\n\t\tconst vFOV = this.cameraObject.fov * Math.PI / 180;\n\n\t\t// Math.abs to ensure the result is always positive\n\t\treturn 2 * Math.tan( vFOV / 2 ) * Math.abs( depth );\n\t};\n\n\tthis.calculateHeightPerPixelAtZeroDepth = ( wHeight ) => {\n\t\tconst height = this.getVisibleHeightAtZDepth(0);\n\t\tthis.pixelHeight = height / wHeight;\n\t\treturn this.pixelHeight;\n\t}\n\n /**\n * Get normalised coordinates from windows coordinates.\n *\n * @param {String} x\n * @param {String} y\n * @param {THREE.Vector2} positionIn - Optional, write the value into\n * this object if it is provided, otherwise a new object will\n * be created and returned.\n *\n * @return {THREE.Vector2} containing the normalised x and y coordinates.\n */\n this.getNDCFromDocumentCoords = (x, y, positionIn) => {\n updateRect(false);\n const position = positionIn ? positionIn : new THREE.Vector2();\n const out_x = ((x - rect.left) / rect.width) * 2 - 1;\n const out_y = -((y - rect.top) / rect.height) * 2 + 1;\n return position.set(out_x, out_y);\n }\n\n /**\n * Get the relative windows coordinates from normalised coordiantes.\n *\n * @param {String} x\n * @param {String} y\n * @param {THREE.Vector2} positionIn - Optional, write the value into\n * this object if it is provided, otherwise a new object will\n * be created and returned.\n *\n * @return {THREE.Vector2} containing the relative x and y coordinates.\n */\n this.getRelativeCoordsFromNDC = (x, y, positionIn) => {\n updateRect(false);\n const position = positionIn ? positionIn : new THREE.Vector2();\n position.x = (x + 1) * rect.width / 2.0;\n position.y = (1 - y) * rect.height / 2.0;\n return position;\n }\n\n /**\n * Map a mouse click to the specified action.\n *\n * @param {String} buttonName - please see {@link CLICK_ACTION}\n * @param {String} actionName - please see {@link STATE}\n */\n\tthis.setMouseButtonAction = (buttonName, actionName) => {\n\t\tCLICK_ACTION[buttonName] = STATE[actionName];\n }\n\n\t/**\n\t *\n\t * @param {HTML} element\n\t * @param {Number} index\n\t */\n\tconst setCanvasTabindex = (element, index) => {\n\t\tif (element instanceof HTMLCanvasElement)\n\t\t\telement.tabIndex = index\n\t}\n\n //Make sure the camera does not travel beyond limit\n const checkTravelDistance = () => {\n if (maxDist > 0) {\n const newDist = _tempEye.distanceTo(sceneSphere.center);\n return (maxDist > newDist ||\n this.cameraObject.position.distanceTo(sceneSphere.center) > newDist );\n }\n return true;\n }\n\n const translateViewport = translation => {\n _tempEye.copy(this.cameraObject.position).add(translation);\n if (checkTravelDistance()) {\n this.cameraObject.target.add(translation);\n this.cameraObject.position.add(translation);\n this.updateDirectionalLight();\n }\n }\n\n\tconst onDocumentMouseDown = event => {\n updateRect(false);\n // Check if mouse event hapens inside the minimap\n let minimapCoordinates = undefined;\n if (currentMode === MODE.DEFAULT)\n minimapCoordinates = this.scene.getNormalisedMinimapCoordinates(\n this.renderer, event);\n if (!minimapCoordinates) {\n if (event.button == 0) {\n if (event.ctrlKey)\n this._state = CLICK_ACTION.AUXILIARY;\n else if (event.shiftKey)\n this._state = CLICK_ACTION.SECONDARY;\n else\n this._state = CLICK_ACTION.MAIN;\n } else if (event.button == 1) {\n event.preventDefault();\n this._state = CLICK_ACTION.AUXILIARY;\n }\n else if (event.button == 2) {\n this._state = CLICK_ACTION.SECONDARY;\n }\n this.pointer_x = event.clientX - rect.left;\n this.pointer_y = event.clientY - rect.top;\n this.pointer_x_start = this.pointer_x;\n this.pointer_y_start = this.pointer_y;\n this.previous_pointer_x = this.pointer_x;\n this.previous_pointer_y= this.pointer_y;\n } else {\n currentMode = MODE.MINIMAP;\n let translation = this.scene.getMinimapDiffFromNormalised(\n minimapCoordinates.x, minimapCoordinates.y);\n translateViewport(translation);\n }\n }\n\n\tconst onDocumentMouseMove = event => {\n updateRect(false);\n\t\tif (rect) {\n\t\t\tthis.pointer_x = event.clientX - rect.left;\n\t\t\tthis.pointer_y = event.clientY - rect.top;\n\t\t\tif (currentMode === MODE.MINIMAP) {\n\t\t\t\tlet minimapCoordinates = this.scene.getNormalisedMinimapCoordinates(this.renderer, event);\n\t\t\t\tif (minimapCoordinates) {\n\t\t\t\t\tlet translation = this.scene.getMinimapDiffFromNormalised(\n\t\t\t\t\t\tminimapCoordinates.x, minimapCoordinates.y);\n\t\t\t\t\ttranslateViewport(translation);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((this._state === STATE.NONE) && (zincRayCaster !== undefined)) {\n\t\t\t\t\tzincRayCaster.move(this, event.clientX, event.clientY, this.renderer);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst onDocumentMouseUp = event => {\n this._state = STATE.NONE;\n if (currentMode == MODE.MINIMAP)\n currentMode = MODE.DEFAULT;\n\t\tif (zincRayCaster !== undefined) {\n\t\t\tif (this.pointer_x_start==(event.clientX - rect.left) && this.pointer_y_start==(event.clientY- rect.top)) {\n\t\t\t\tzincRayCaster.pick(this, event.clientX, event.clientY, this.renderer);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst onDocumentMouseLeave = event => {\n\t\tthis._state = STATE.NONE;\n\t}\n\n\tconst onDocumentTouchStart = event => {\n updateRect(false);\n\t\tconst len = event.touches.length;\n\t\tif (len == 1) {\n\t\t\tthis._state = STATE.TOUCH_ROTATE;\n\t\t\tthis.pointer_x = event.touches[0].clientX - rect?.left;\n\t\t\tthis.pointer_y = event.touches[0].clientY - rect?.top;\n\t\t\tthis.pointer_x_start = this.pointer_x;\n\t\t\tthis.pointer_y_start = this.pointer_y;\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y= this.pointer_y;\n\t\t} else if (len == 2) {\n\t\t\tthis._state = STATE.TOUCH_ZOOM;\n\t\t\tconst dx = event.touches[ 0 ].clientX - event.touches[ 1 ].clientX;\n\t\t\tconst dy = event.touches[ 0 ].clientY - event.touches[ 1 ].clientY;\n\t\t\tthis.touchZoomDistanceEnd = this.touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy );\n\t\t} else if (len == 3) {\n\t\t\tthis._state = STATE.TOUCH_PAN;\n\t\t\tthis.targetTouchId = event.touches[0].identifier;\n\t\t\tthis.pointer_x = event.touches[0].clientX - rect?.left;\n\t\t\tthis.pointer_y = event.touches[0].clientY - rect?.top;\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y= this.pointer_y;\n\t\t}\n\t}\n\n\tconst onDocumentTouchMove = event => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tconst len = event.touches.length;\n\t\tif (len == 1) {\n\t\t\tthis.pointer_x = event.touches[0].clientX - rect.left;\n\t\t\tthis.pointer_y = event.touches[0].clientY - rect.top;\n\t\t} else if (len == 2) {\n\t\t\tif (this._state === STATE.TOUCH_ZOOM) {\n\t\t\t\tconst dx = event.touches[ 0 ].clientX - event.touches[ 1 ].clientX;\n\t\t\t\tconst dy = event.touches[ 0 ].clientY - event.touches[ 1 ].clientY;\n\t\t\t\tthis.touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy );\n\t\t\t}\n\t\t} else if (len == 3) {\n\t\t\tif (this._state === STATE.TOUCH_PAN) {\n\t\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t\tif (event.touches[i].identifier == this.targetTouchId) {\n\t\t\t\t\t\tthis.pointer_x = event.touches[0].clientX - rect.left;\n\t\t\t\t\t\tthis.pointer_y = event.touches[0].clientY - rect.top;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst onDocumentTouchEnd = event => {\n\t\tconst len = event.touches.length;\n\t\tthis.touchZoomDistanceStart = this.touchZoomDistanceEnd = 0;\n\t\tthis.targetTouchId = -1;\n\t\tthis._state = STATE.NONE;\n\t\tif (len == 1) {\n\t\t\tif (zincRayCaster !== undefined) {\n\t\t\t\tif (this.pointer_x_start==(event.touches[0].clientX- rect.left) && this.pointer_y_start==(event.touches[0].clientY- rect.top)) {\n\t\t\t\t\tzincRayCaster.pick(this.cameraObject, event.touches[0].clientX, event.touches[0].clientY, this.renderer);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n const onDocumentEnter = () => {\n\t\tupdateRect(true);\n\t}\n\n const updateRect = forced => {\n //Use intersectionObserver to reset the rect for ray tracing.\n if (forced || rect === undefined) {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n rect = entry.boundingClientRect;\n }\n observer.disconnect();\n });\n\n observer.observe(this.domElement);\n }\n }\n\n\tconst onDocumentWheelEvent = event => {\n updateRect(false);\n\t\tthis._state = STATE.SCROLL;\n\t\tlet changes = 0;\n\t\tif (event.deltaY > 0)\n\t\t\tchanges = this.zoomRate;\n\t\telse if (event.deltaY < 0)\n\t\t\tchanges = this.zoomRate * -1;\n\t\tzoomSize = zoomSize + changes;\n\t\tevent.preventDefault();\n\t\tevent.stopImmediatePropagation();\n\t}\n\n\tconst onDocumentKeydownEvent = event => {\n\t\tupdateRect(false);\n\t\tlet changes = 0;\n\t\tif (\n\t\t\t(event.keyCode === KEYBOARD.EQUAL) ||\n\t\t\t(event.keyCode === KEYBOARD.MINUS) ||\n\t\t\t(event.keyCode === KEYBOARD.NUMPADADD) ||\n\t\t\t(event.keyCode === KEYBOARD.NUMPADSUBTRACT)\n\t\t) {\n\t\t\tthis._state = STATE.KEYBOARD_ZOOM\n\t\t\tlet unit = 1;\n\t\t\tif (event.shiftKey) {\n\t\t\t\tunit = unit * 2\n\t\t\t}\n\t\t\tif (\n\t\t\t\t(event.keyCode === KEYBOARD.EQUAL) ||\n\t\t\t\t(event.keyCode === KEYBOARD.NUMPADADD)\n\t\t\t) {\n\t\t\t\tchanges = this.zoomRate * unit * -1;\n\t\t\t} else if (\n\t\t\t\t(event.keyCode === KEYBOARD.MINUS) ||\n\t\t\t\t(event.keyCode === KEYBOARD.NUMPADSUBTRACT)\n\t\t\t) {\n\t\t\t\tchanges = this.zoomRate * unit;\n\t\t\t}\n\t\t\tzoomSize = zoomSize + changes;\n\t\t} else if (\n\t\t\t(event.keyCode === KEYBOARD.ARROWLEFT) ||\n\t\t\t(event.keyCode === KEYBOARD.ARROWUP) ||\n\t\t\t(event.keyCode === KEYBOARD.ARROWRIGHT) ||\n\t\t\t(event.keyCode === KEYBOARD.ARROWDOWN)\n\t\t) {\n\t\t\tif (event.shiftKey) {\n\t\t\t\tthis._state = STATE.KEYBOARD_ROTATE\n\t\t\t\tthis.pointer_x_start = this.pointer_x;\n\t\t\t\tthis.pointer_y_start = this.pointer_y;\n\t\t\t\tchanges = this.rotateRate\n\t\t\t} else {\n\t\t\t\tthis._state = STATE.KEYBOARD_PAN\n\t\t\t\tchanges = this.panRate\n\t\t\t}\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y = this.pointer_y;\n\t\t\tif (event.keyCode === KEYBOARD.ARROWLEFT) {\n\t\t\t\tthis.pointer_x = this.pointer_x - changes;\n\t\t\t} else if (event.keyCode === KEYBOARD.ARROWUP) {\n\t\t\t\tthis.pointer_y = this.pointer_y - changes;\n\t\t\t} else if (event.keyCode === KEYBOARD.ARROWRIGHT) {\n\t\t\t\tthis.pointer_x = this.pointer_x + changes;\n\t\t\t} else if (event.keyCode === KEYBOARD.ARROWDOWN) {\n\t\t\t\tthis.pointer_y = this.pointer_y + changes;\n\t\t\t}\n\t\t}\n\t\tif (Object.values(KEYBOARD).includes(event.keyCode)) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tconst onDocumentKeyupEvent = event => {\n\t\tthis._state = STATE.NONE;\n\t}\n\n\tconst translate = () => {\n\t\tif (typeof this.cameraObject !== \"undefined\")\n\t\t{\n\t\t\tconst height = rect.height;\n\t\t\tconst distance = this.cameraObject.position.distanceTo(this.cameraObject.target);\n\t\t\tlet fact = 0.0;\n\t\t\tif ((this.cameraObject.far > this.cameraObject.near) && (distance >= this.cameraObject.near) &&\n\t\t\t\t(distance <= this.cameraObject.far))\n\t\t\t{\n\t\t\t\t fact = (distance-this.cameraObject.near)/(this.cameraObject.far-this.cameraObject.near);\n }\n //_b == old_near, _c = old_far, _new_b = new_near, _new_c = new_far\n\t\t\t_b.set(this.previous_pointer_x,height - this.previous_pointer_y,0.0);\n\t\t\t_c.set(this.previous_pointer_x, height - this.previous_pointer_y,1.0);\n\t\t\t_new_b.set(this.pointer_x,height - this.pointer_y,0.0);\n\t\t\t_new_c.set(this.pointer_x,height - this.pointer_y,1.0);\n\t\t\t_b.unproject(this.cameraObject);\n\t\t\t_c.unproject(this.cameraObject);\n\t\t\t_new_b.unproject(this.cameraObject);\n\t\t\t_new_c.unproject( this.cameraObject);\n const translate_rate = -0.002;\n _new_b.sub(_b).multiplyScalar(1.0-fact);\n _new_c.sub(_c).multiplyScalar(fact);\n _new_b.add(_new_c).multiplyScalar(translate_rate);\n translateViewport(_new_b);\n\t\t}\n\t\tthis.previous_pointer_x = this.pointer_x;\n\t\tthis.previous_pointer_y = this.pointer_y;\n\t}\n\n\tthis.getVectorsFromRotateAboutLookAtPoints = (axis, angle) => {\n axis.normalize();\n\t _v.copy(this.cameraObject.position).sub(this.cameraObject.target);\n\t _rel_eye.copy(_v);\n\t _v.normalize()\n\t if (0.8 < Math.abs(_v.dot(axis))) {\n\t _v.copy(this.cameraObject.up);\n }\n _b.crossVectors(axis, _v).normalize();\n _c.crossVectors(axis, _b);\n\t const rel_eyea = axis.dot(_rel_eye);\n\t const rel_eyeb = _b.dot(_rel_eye);\n\t const rel_eyec = _c.dot(_rel_eye);\n\t const upa = axis.dot(this.cameraObject.up);\n\t const upb = _b.dot(this.cameraObject.up);\n\t const upc = _c.dot(this.cameraObject.up);\n\t const cos_angle = Math.cos(angle);\n\t const sin_angle = Math.sin(angle);\n _new_b.set(cos_angle*_b.x+sin_angle*_c.x,\n\t cos_angle*_b.y+sin_angle*_c.y,\n\t cos_angle*_b.z+sin_angle*_c.z);\n\t _new_c.set(cos_angle*_c.x-sin_angle*_b.x,\n\t cos_angle*_c.y-sin_angle*_b.y,\n\t cos_angle*_c.z-sin_angle*_b.z);\n _v.copy(this.cameraObject.target);\n\t _v.x = _v.x + axis.x*rel_eyea + _new_b.x*rel_eyeb+_new_c.x*rel_eyec;\n\t _v.y = _v.y + axis.y*rel_eyea + _new_b.y*rel_eyeb+_new_c.y*rel_eyec;\n\t _v.z = _v.z + axis.z*rel_eyea + _new_b.z*rel_eyeb+_new_c.z*rel_eyec;\n\t _a.set(axis.x*upa+_new_b.x*upb+_new_c.x*upc,\n axis.y*upa+_new_b.y*upb+_new_c.y*upc,\n axis.z*upa+_new_b.z*upb+_new_c.z*upc);\n\t return {position: _v, up: _a};\n\t}\n\n /**\n * Rotate around the axis with the amount specified by angle.\n *\n * @param {THREE.Vector3} axis - The rotational axis.\n * @param {Number} Angle - Specify how much the camera shoudl rotate by.\n */\n\tthis.rotateAboutLookAtpoint = (axis, angle) => {\n\t const returned_values = this.getVectorsFromRotateAboutLookAtPoints(axis, angle);\n\t this.cameraObject.position.copy(returned_values.position);\n\t this.updateDirectionalLight();\n\t this.cameraObject.up.copy(returned_values.up);\n\t}\n\n\tconst tumble = () => {\n\t\tif (typeof this.cameraObject !== \"undefined\")\n\t\t{\n\t\t\tconst width = rect?.width;\n\t\t\tconst height = rect?.height;\n\t\t\tif ((0<width)&&(0<height))\n\t\t\t{\n\t\t\t\tconst radius=0.25*(width+height);\n\t\t\t\tlet delta_x = 0;\n\t\t\t\tlet delta_y = 0;\n if (rotateMode === ROTATE_DIRECTION.FREE ||\n rotateMode === ROTATE_DIRECTION.HORIZONTAL)\n\t\t\t\t delta_x=this.pointer_x-this.previous_pointer_x;\n if (rotateMode === ROTATE_DIRECTION.FREE ||\n rotateMode === ROTATE_DIRECTION.VERTICAL)\n\t\t\t\t delta_y=this.previous_pointer_y-this.pointer_y;\n\t\t\t\tconst tangent_dist = Math.sqrt(delta_x*delta_x + delta_y*delta_y);\n\t\t\t\tif (tangent_dist > 0)\n\t\t\t\t{\n\t\t\t\t\tconst dx=-delta_y*1.0/tangent_dist;\n\t\t\t\t\tconst dy=delta_x*1.0/tangent_dist;\n let d = 0;\n // Do not allow rotation on other direction around the origin if rotateMode is not free\n if (rotateMode === ROTATE_DIRECTION.FREE) {\n let d=dx*(this.pointer_x-0.5*(width-1))+dy*(0.5*(height-1)-this.pointer_y);\n if (d > radius)\t{\n d = radius;\n }\n else {\n if (d < -radius) {\n d = -radius;\n }\n }\n }\n\t\t\t\t\tconst phi=Math.acos(d/radius)-0.5*Math.PI;\n\t\t\t\t\tconst angle=this.tumble_rate*tangent_dist/radius;\n\t\t\t\t\t_a.copy(this.cameraObject.position).sub(this.cameraObject.target).normalize();\n\t\t\t\t\t_b.copy(this.cameraObject.up).normalize();\n _c.copy(_b).cross(_a).normalize().multiplyScalar(dx);\n _b.multiplyScalar(dy);\n _axis.addVectors(_c, _b).multiplyScalar(Math.cos(phi));\n _a.multiplyScalar(Math.sin(phi));\n _axis.add(_a);\n\t\t\t\t\tthis.rotateAboutLookAtpoint(_axis, -angle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.previous_pointer_x = this.pointer_x;\n\t\tthis.previous_pointer_y = this.pointer_y;\n\t}\n\n\tconst calculateZoomDelta = () => {\n\t\tlet delta = 0;\n\t\tif (this._state === STATE.ZOOM)\n\t\t{\n\t\t\tdelta = this.previous_pointer_y-this.pointer_y;\n\t\t} else if ((this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)) {\n\t\t\tdelta = zoomSize;\n\t\t} else {\n\t\t\tdelta = -1.0 * (this.touchZoomDistanceEnd - this.touchZoomDistanceStart);\n\t\t\tthis.touchZoomDistanceStart = this.touchZoomDistanceEnd;\n\t\t}\n\t\treturn delta;\n }\n\n this.changeZoomByScrollRateUnit = unit => {\n const delta_y = unit * this.zoomRate;\n this.changeZoomByValue(delta_y);\n }\n\n this.changeZoomByValue = delta_y => {\n\t\tif (typeof this.cameraObject !== \"undefined\")\n\t\t{\n const height = rect.height;\n\t\t\tconst a = this.cameraObject.position.clone();\n\t\t\ta.sub(this.cameraObject.target);\n\t\t\tconst dist = a.length();\n\t\t\tconst dy = 1.5 * delta_y/height;\n const travalDist = dist * dy;\n\t\t\tif ((dist + travalDist) > 0.01) {\n\t\t\t\ta.normalize()\n _tempEye.copy(this.cameraObject.position);\n\t\t\t\t_tempEye.x += a.x*travalDist;\n\t\t\t\t_tempEye.y += a.y*travalDist;\n\t\t\t\t_tempEye.z += a.z*travalDist;\n if (checkTravelDistance()) {\n this.cameraObject.position.copy(_tempEye);\n this.updateDirectionalLight();\n updateNearAndFarPlane(travalDist);\n hasUpdated = true;\n }\n\t\t\t}\n\t\t}\n }\n\n\tconst flyZoom = () => {\n const delta_y = calculateZoomDelta();\n this.changeZoomByValue(delta_y);\n\n\t\tif (this._state === STATE.ZOOM) {\n\t\t\tthis.previous_pointer_x = this.pointer_x;\n\t\t\tthis.previous_pointer_y = this.pointer_y;\n\t\t}\n\t\tif ((this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)) {\n\t\t\tzoomSize = 0;\n this._state = STATE.NONE;\n\t\t}\n\t}\n\n\tthis.setDirectionalLight = directionalLightIn => {\n\t\tthis.directionalLight = directionalLightIn;\n\t};\n\n /**\n * Force an update to the position of the directional light.\n */\n\tthis.updateDirectionalLight = () => {\n\t\tif (this.directionalLight != 0) {\n\t\t\tthis.directionalLight.position.set(this.cameraObject.position.x,\n\t\t\t\t\tthis.cameraObject.position.y,\n\t\t\t\t\tthis.cameraObject.position.z);\n\t\t}\n\t}\n\n\t/**\n * Enable the camera control.\n */\n\tthis.enable = function () {\n\t\tenabled = true;\n\t\tif (this.domElement && this.domElement.addEventListener) {\n\t\t\tsetCanvasTabindex(this.domElement, 0)\n\t\t\tthis.domElement.addEventListener( 'mousedown', onDocumentMouseDown, false );\n\t\t\tthis.domElement.addEventListener( 'mousemove', onDocumentMouseMove, false );\n\t\t\tthis.domElement.addEventListener( 'mouseup', onDocumentMouseUp, false );\n\t\t\tthis.domElement.addEventListener( 'mouseleave', onDocumentMouseLeave, false );\n\t\t\tthis.domElement.addEventListener( 'touchstart', onDocumentTouchStart, false);\n\t\t\tthis.domElement.addEventListener( 'touchmove', onDocumentTouchMove, false);\n\t\t\tthis.domElement.addEventListener( 'touchend', onDocumentTouchEnd, false);\n\t\t\tthis.domElement.addEventListener( 'wheel', onDocumentWheelEvent, false);\n\t\t\tthis.domElement.addEventListener( 'mouseenter', onDocumentEnter, false );\n\t\t\tthis.domElement.addEventListener( 'contextmenu', event => { event.preventDefault(); }, false );\n\t\t\tthis.domElement.addEventListener( 'keydown', onDocumentKeydownEvent, false );\n\t\t\tthis.domElement.addEventListener( 'keyup', onDocumentKeyupEvent, false );\n\t }\n\t}\n\n /**\n * Disable the camera control.\n */\n\tthis.disable = function () {\n\t\tenabled = false;\n\t\tif (this.domElement && this.domElement.removeEventListener) {\n\t\t\tthis.domElement.removeEventListener( 'mousedown', onDocumentMouseDown, false );\n\t\t\tthis.domElement.removeEventListener( 'mousemove', onDocumentMouseMove, false );\n\t\t\tthis.domElement.removeEventListener( 'mouseup', onDocumentMouseUp, false );\n\t\t\tthis.domElement.removeEventListener( 'mouseleave', onDocumentMouseLeave, false );\n\t\t\tthis.domElement.removeEventListener( 'touchstart', onDocumentTouchStart, false);\n\t\t\tthis.domElement.removeEventListener( 'touchmove', onDocumentTouchMove, false);\n\t\t\tthis.domElement.removeEventListener( 'touchend', onDocumentTouchEnd, false);\n\t\t\tthis.domElement.removeEventListener( 'wheel', onDocumentWheelEvent, false);\n\t\t\tthis.domElement.removeEventListener( 'mouseenter', onDocumentEnter, false );\n\t\t\tthis.domElement.removeEventListener( 'contextmenu', event => { event.preventDefault(); }, false );\n\t\t\tthis.domElement.removeEventListener( 'keydown', onDocumentKeydownEvent, false );\n\t\t\tthis.domElement.removeEventListener( 'keyup', onDocumentKeyupEvent, false );\n\t\t\tsetCanvasTabindex(this.domElement, -1)\n\t }\n\t}\n\n\tthis.loadPath = pathData => {\n\t\tcameraPath = pathData.CameraPath;\n\t\tnumberOfCameraPoint = pathData.NumberOfPoints;\n\t}\n\n /**\n * This is an experimental feature. It loads a path - point to point which\n * the camera will travel.\n *\n * @param {String} path_url - The path.\n * @param {requestCallback} finishCallback - The callback once the path is load.\n */\n\tthis.loadPathURL = (path_url, finishCallback) => {\n const requestURL = resolveURL(path_url);\n fetch(requestURL)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n })\n .then((pathData) => {\n this.loadPath(pathData);\n if (finishCallback !== undefined && typeof finishCallback === 'function') {\n finishCallback();\n }\n })\n .catch((error) => {\n console.error(`Failed to load path asset from: ${requestURL}`, error);\n });\n\n\t}\n\n /**\n * Set the duration for the camera to travel along the path.\n *\n * @param {Number} durationIn - the duration for the path.\n */\n\tthis.setPathDuration = durationIn => {\n duration = durationIn;\n if (smoothCameraTransitionObject)\n smoothCameraTransitionObject.setDuration(duration);\n if (rotateCameraTransitionObject)\n rotateCameraTransitionObject.setDuration(duration);\n\t}\n\n /**\n * Get the playRate - this determines how fast it takes to\n * finish one duration.\n *\n * @return {Number}\n */\n\t this.getPlayRate = () => {\n\t return playRate;\n\t }\n\n /**\n * Set the playRate - this determines how fast it takes to\n * finish one duration.\n *\n * @param {Number} playRateIn - The play rate speed.\n */\n\tthis.setPlayRate = playRateIn => {\n\t\tplayRate = playRateIn;\n\t}\n\n /**\n * Update the internal timer by the set amount, this can\n * be used to force a time update by setting delta to zero.\n *\n * @param {Number} delta - The amount of time to increment\n * the time by.\n */\n\tconst updateTime = delta => {\n\t\tlet targetTime = inbuildTime + delta;\n\t\tif (targetTime > duration)\n\t\t\ttargetTime = targetTime - duration\n\t\tinbuildTime = targetTime;\n\t};\n\n /**\n * Get the current inbuild time,\n *\n * @return {Number}\n */\n\t this.getTime = () => {\n\t return inbuildTime;\n\t }\n\n /**\n * Set the current inbuild time,\n *\n * @param {Number} timeIn - this will be used as the current time,\n * it should be between the range of zero and the set duration.\n */\n\tthis.setTime = timeIn => {\n\t if (timeIn > duration)\n\t inbuildTime = duration;\n\t else if (timeIn < 0.0)\n\t inbuildTime = 0.0;\n\t else\n\t inbuildTime = timeIn;\n\t}\n\n /**\n * Get the number of frame which is determine by number of points\n * in the camera path.\n *\n * @return {Number}\n */\n\tthis.getNumberOfTimeFrame = () => {\n\t\treturn numberOfCameraPoint;\n\t}\n\n /**\n * Get the current time frame and it will return three values in\n * an array.\n *\n * @return {Array} - bottom frame, top frame and the proportion.\n */\n\tthis.getCurrentTimeFrame = () => {\n\t if (numberOfCameraPoint > 2) {\n \t\tconst current_time = inbuildTime/duration * (numberOfCameraPoint - 1);\n \t\tconst bottom_frame = Math.floor(current_time);\n \t\tconst proportion = 1 - (current_time - bottom_frame);\n \t\tconst top_frame = Math.ceil(current_time);\n \t\tif (bottom_frame == top_frame) {\n \t\t\tif (bottom_frame == numberOfCameraPoint - 1) {\n \t\t\t\treturn [bottom_frame - 1, top_frame, 0];\n \t\t\t} else {\n \t\t\t\treturn [bottom_frame, top_frame + 1, 1.0];\n \t\t\t}\n \t\t}\n \t\treturn [bottom_frame, top_frame, proportion];\n\t } else if (numberOfCameraPoint == 1) {\n\t return [0, 0, 0];\n\t }\n\n\t return undefined;\n\t}\n\n /**\n * Set the current time frame.\n *\n * @param {Number} targetTimeFrame - bottom frame, top frame and the proportion.\n */\n\tthis.setCurrentTimeFrame = targetTimeFrame => {\n\t if (numberOfCameraPoint > 2) {\n \t\tinbuildTime = duration * targetTimeFrame / (numberOfCameraPoint - 1);\n \t\tif (inbuildTime < 0.0)\n \t\t\tinbuildTime = 0.0;\n \t\tif (inbuildTime > duration)\n \t\t\tinbuildTime = duration;\n\t }\n\t}\n\n /**\n * Update the progress on the path by the specified amount - delta.\n *\n * @param {Number} delta - The amount of time to increment\n */\n\tconst updatePath = delta => {\n\t\tif (currentMode === MODE.PATH) {\n\t\t\tupdateTime(delta);\n\t\t\tif (cameraPath) {\n\t\t\t\tconst time_frame = this.getCurrentTimeFrame();\n\t\t\t\tconst bottom_frame = time_frame[0];\n\t\t\t\tconst top_frame = time_frame[1];\n\t\t\t\tconst proportion = time_frame[2];\n\t\t\t\tconst bot_pos = [cameraPath[bottom_frame*3], cameraPath[bottom_frame*3+1], cameraPath[bottom_frame*3+2]];\n\t\t\t\tconst top_pos = [cameraPath[top_frame*3], cameraPath[top_frame*3+1], cameraPath[top_frame*3+2]];\n\t\t\t\tconst current_positions = [];\n\t\t\t\tfor (let i = 0; i < bot_pos.length; i++) {\n\t\t\t\t\tcurrent_positions.push(proportion * bot_pos[i] + (1.0 - proportion) * top_pos[i]);\n\t\t\t\t}\n\t\t\t\tthis.cameraObject.position.set(current_positions[0], current_positions[1], current_positions[2]);\n\t\t\t\tthis.cameraObject.target.set(top_pos[0], top_pos[1], top_pos[2]);\n\t\t\t\tif (deviceOrientationControl)\n\t\t\t\t\tthis.cameraObject.lookAt( this.cameraObject.target );\n\t\t\t\tif (updateLightWithPathFlag) {\n\t\t\t\t\tthis.directionalLight.position.set(current_positions[0], current_positions[1], current_positions[2]);\n\t\t\t\t\tthis.directionalLight.target.position.set(top_pos[0], top_pos[1], top_pos[2]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n /**\n * Force recalculation of the current path.\n */\n\tthis.calculatePathNow = () => {\n\t updatePath(0.0);\n\t}\n\n // handle synchronised control based on information in the idc\n const handleSyncControl = () => {\n if ((this._state === STATE.ROTATE) || (this._state === STATE.TOUCH_ROTATE) || (this._state === STATE.KEYBOARD_ROTATE)){\n //rotateion does not trigger callback\n tumble();\n } else if ((this._state === STATE.PAN) || (this._state === STATE.TOUCH_PAN) || (this._state === STATE.KEYBOARD_PAN)){\n translate();\n ndcControl.triggerCallback();\n } else if ((this._state === STATE.ZOOM) || (this._state === STATE.TOUCH_ZOOM) || (this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)){\n ndcControl.zoom(calculateZoomDelta());\n this.previous_pointer_x = this.pointer_x;\n this.previous_pointer_y = this.pointer_y;\n if ((this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)) {\n this._state = STATE.NONE;\n }\n zoomSize = 0;\n ndcControl.triggerCallback();\n }\n }\n\n /**\n * Update all controls related changes - including calculation of the viewport.\n *\n * @param {Number} timeChanged - Time eclipse since last called.\n */\n\tthis.update = timeChanged => {\n\t\tconst delta = timeChanged * playRate;\n\t\tlet controlEnabled = enabled;\n\t\tlet updated = true;\n\t\tif (currentMode === MODE.PATH) {\n\t\t\tupdatePath(delta);\n\t\t} else if (currentMode === MODE.SMOOTH_CAMERA_TRANSITION && smoothCameraTransitionObject) {\n\t\t\tsmoothCameraTransitionObject.update(delta);\n\t\t\tif (smoothCameraTransitionObject.isTransitionCompleted()) {\n\t\t\t\tsmoothCameraTransitionObject == undefined;\n\t\t\t\tcurrentMode = MODE.DEFAULT;\n\t\t\t}\n\t\t\tcontrolEnabled = false;\n\t\t} else if (currentMode === MODE.ROTATE_CAMERA_TRANSITION && rotateCameraTransitionObject) {\n\t\t\trotateCameraTransitionObject.update(delta);\n\t\t\tif (rotateCameraTransitionObject.isTransitionCompleted()) {\n\t\t\t\trotateCameraTransitionObject == undefined;\n\t\t\t\tcurrentMode = MODE.DEFAULT;\n\t\t\t}\n\t\t\tcontrolEnabled = false;\n\t\t} else if (currentMode === MODE.AUTO_TUMBLE && cameraAutoTumbleObject) {\n\t\t\tcameraAutoTumbleObject.update(delta);\n\t\t} else if (currentMode === MODE.SYNC_CONTROL && ndcControl) {\n handleSyncControl();\n controlEnabled = false;\n } else {\n\t\t\tupdated = false;\n\t\t}\n\t\tif (controlEnabled) {\n\t\t\tif (this._state !== STATE.NONE) {\n\t\t\t\tupdated = true;\n\t\t\t}\n\t\t\tif ((this._state === STATE.ROTATE) || (this._state === STATE.TOUCH_ROTATE) || (this._state === STATE.KEYBOARD_ROTATE)){\n\t\t\t\ttumble();\n\t\t\t} else if ((this._state === STATE.PAN) || (this._state === STATE.TOUCH_PAN) || (this._state === STATE.KEYBOARD_PAN)){\n\t\t\t\ttranslate();\n\t\t\t} else if ((this._state === STATE.ZOOM) || (this._state === STATE.TOUCH_ZOOM) || (this._state === STATE.SCROLL) || (this._state === STATE.KEYBOARD_ZOOM)){\n\t\t\t\tflyZoom();\n\t\t\t}\n\t\t\tif (this._state !== STATE.NONE) {\n\t\t\t\tif (currentMode === MODE.AUTO_TUMBLE && cameraAutoTumbleObject &&\n\t\t\t\t\t\tcameraAutoTumbleObject.stopOnCameraInput) {\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._state === STATE.SCROLL)\n\t\t\t\tthis._state = STATE.NONE;\n\t\t}\n\t\tif (deviceOrientationControl) {\n\t\t\tupdated = true;\n\t\t\tdeviceOrientationControl.update();\n\t\t\t//this.directionalLight.target.position.set(this.cameraObject.target.x,\n\t\t\t//\tthis.cameraObject.target.y, this.cameraObject.target.z);\n\t\t} else {\n\t\t\tthis.cameraObject.lookAt( this.cameraObject.target );\n\t\t}\n\n\t\tupdated = updated || hasUpdated;\n\t\thasUpdated = false;\n\n\t\treturn updated;\n\t};\n\n /**\n * Switch to path mode and begin traveling through the camera path.\n */\n\tthis.playPath = () => {\n\t\tcurrentMode = MODE.PATH;\n\t}\n\n /**\n * Stop playing path and switch back to normal control.\n */\n\tthis.stopPath = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t}\n\n /**\n * Check rather the control is currently in path mode.\n *\n * @return {Boolean}\n */\n\tthis.isPlayingPath = () => {\n\t\treturn (currentMode === MODE.PATH);\n\t}\n\n /**\n * Enable directional light update as the camera\n * is traveling through path.\n *\n * @param {Boolean} flag\n */\n\tthis.enableDirectionalLightUpdateWithPath = flag => {\n\t\tupdateLightWithPathFlag = flag;\n\t}\n\n /**\n * Enable rotation using the devices's accelerometer.\n */\n\tthis.enableDeviceOrientation = () => {\n\t\tif (!deviceOrientationControl)\n\t\t\tdeviceOrientationControl = new ModifiedDeviceOrientationControls(this.cameraObject);\n\t}\n\n /**\n * Disable rotation using the devices's accelerometer.\n */\n\tthis.disableDeviceOrientation = () => {\n\t\tif (deviceOrientationControl) {\n\t\t\tdeviceOrientationControl.dispose();\n\t\t\tdeviceOrientationControl = undefined;\n\t\t}\n\t}\n\n /**\n * Check rather device orientation based on accelerometer is on.\n */\n\tthis.isDeviceOrientationEnabled = () => {\n\t\tif (deviceOrientationControl) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n /**\n * Reset the viewport settings to the one provided by default viewport.\n */\n\tthis.resetView = () => {\n const viewport = viewports[defaultViewport];\n\t\tthis.cameraObject.near = viewport.nearPlane;\n\t\tthis.cameraObject.far = viewport.farPlane;\n\t\tthis.cameraObject.position.set( viewport.eyePosition[0], viewport.eyePosition[1],\n viewport.eyePosition[2]);\n\t\tthis.cameraObject.target.set( viewport.targetPosition[0],\n viewport.targetPosition[1], viewport.targetPosition[2] );\n\t\tthis.cameraObject.up.set( viewport.upVector[0], viewport.upVector[1],\n viewport.upVector[2]);\n\t\tthis.cameraObject.updateProjectionMatrix();\n\t\tthis.updateDirectionalLight();\n\t}\n\n /**\n * Set the current camera settings with the provided viewport.\n *\n * @param {Viewport} newViewport - viewport settings.\n */\n\tthis.setCurrentCameraSettings = newViewport => {\n\t\tif (newViewport.nearPlane)\n\t\t\tthis.cameraObject.near = newViewport.nearPlane;\n\t\tif (newViewport.farPlane)\n\t\t\tthis.cameraObject.far = newViewport.farPlane;\n\t\tif (newViewport.eyePosition)\n\t\t\tthis.cameraObject.position.set( newViewport.eyePosition[0],\n\t\t\t\t\tnewViewport.eyePosition[1], newViewport.eyePosition[2]);\n\t\tif (newViewport.targetPosition)\n\t\t\tthis.cameraObject.target.set( newViewport.targetPosition[0],\n\t\t\t\t\tnewViewport.targetPosition[1], newViewport.targetPosition[2] );\n\t\tif (newViewport.upVector)\n\t\t\tthis.cameraObject.up.set( newViewport.upVector[0], newViewport.upVector[1],\n\t\t\t\t\tnewViewport.upVector[2]);\n\t\tthis.cameraObject.updateProjectionMatrix();\n\t\tthis.updateDirectionalLight();\n\t\thasUpdated = true;\n\t}\n\n /**\n * Get the viewport based on centre, radius, view_angle and clip distance.\n *\n * @param {Number} centreX - x coordinate of the centre.\n * @param {Number} centreY - y coordinate of the centre.\n * @param {Number} centreZ - z coordinate of the centre.\n * @param {Number} radius - radius if the viewport.\n * @param {Number} view_angle - view angle.\n * @param {Number} clip_distance - clip_distance between the near and far plane.\n *\n * @return {Viewport}\n */\n\tthis.getViewportFromCentreAndRadius = (centreX, centreY, centreZ, radius, view_angle, clip_distance) => {\n _a.copy(this.cameraObject.position);\n _a.sub(this.cameraObject.target);\n _a.normalize();\n\t\t/* look at the centre of the sphere */\n\t\tconst localTargetPosition = [centreX, centreY, centreZ];\n\t\t/* shift the eye position to achieve the desired view_angle */\n\t\tconst eye_distance = radius/Math.tan(view_angle*Math.PI/360.0);\n\t\tconst localEyePosition = [ centreX + _a.x*eye_distance, centreY + _a.y*eye_distance,\n\t\t centreZ + _a.z*eye_distance];\n\t\tconst localFarPlane = eye_distance+clip_distance;\n\t\tlet localNearPlane = 0.0;\n\t\tconst nearClippingFactor = 0.95;\n\t\tif (clip_distance > nearClippingFactor*eye_distance)\n\t\t{\n\t\t\tlocalNearPlane = (1.0 - nearClippingFactor)*eye_distance;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlocalNearPlane = eye_distance - clip_distance;\n\t\t}\n\t\tconst newViewport = new Viewport();\n\t\tnewViewport.nearPlane = localNearPlane;\n\t\tnewViewport.farPlane = localFarPlane;\n\t\tnewViewport.eyePosition = localEyePosition;\n\t\tnewViewport.targetPosition = localTargetPosition;\n\t\tnewViewport.upVector = [this.cameraObject.up.x, this.cameraObject.up.y,\n\t\t this.cameraObject.up.z];\n\n\t\treturn newViewport;\n\t}\n\n\t /**\n * Get the viewport for the boudning box\n *\n * @param {Number} boundingBox - y coordinate of the centre.\n * @return {Viewport}\n */\n\tthis.getViewportFromBoundingBox = (boundingBox, radiusScale) => {\n\t\tconst radius = boundingBox.min.distanceTo(boundingBox.max) / 2.0 * radiusScale;\n\t\tconst centreX = (boundingBox.min.x + boundingBox.max.x) / 2.0;\n\t\tconst centreY = (boundingBox.min.y + boundingBox.max.y) / 2.0;\n\t\tconst centreZ = (boundingBox.min.z + boundingBox.max.z) / 2.0;\n\t\tconst clip_factor = 4.0;\n\t\tconst viewport = this.getViewportFromCentreAndRadius(\n\t\t\tcentreX, centreY, centreZ, radius, 40, radius * clip_factor);\n\t\treturn viewport;\n\t}\n\n /**\n * Get the current camera viewport.\n *\n * @return {Viewport}\n */\n\tthis.getCurrentViewport = () => {\n\t\tconst currentViewport = new Viewport();\n\t\tcurrentViewport.nearPlane = this.cameraObject.near;\n\t\tcurrentViewport.farPlane = this.cameraObject.far;\n\t\tcurrentViewport.eyePosition[0] = this.cameraObject.position.x;\n\t\tcurrentViewport.eyePosition[1] = this.cameraObject.position.y;\n\t\tcurrentViewport.eyePosition[2] = this.cameraObject.position.z;\n\t\tcurrentViewport.targetPosition[0] = this.cameraObject.target.x;\n\t\tcurrentViewport.targetPosition[1] = this.cameraObject.target.y;\n\t\tcurrentViewport.targetPosition[2] = this.cameraObject.target.z;\n\t\tcurrentViewport.upVector[0] = this.cameraObject.up.x;\n\t\tcurrentViewport.upVector[1] = this.cameraObject.up.y;\n\t\tcurrentViewport.upVector[2] = this.cameraObject.up.z;\n\t\treturn currentViewport;\n\t}\n\n\tthis.getDefaultEyePosition = () => {\n\t\treturn eyePosition;\n\t}\n\n\tthis.getDefaultTargetPosition = () => {\n\t\treturn targetPosition;\n\t}\n\n /**\n * Setup a smooth transition object which transition the camera from one\n * viewport to the other in the specified duration. This will not work if\n * {@link rotateCameraTransition} is active.\n * To use this object, the transition must be enabled using\n * {@link enableCameraTransition}.\n *\n * @param {Viewport} startingViewport - the starting viewport\n * @param {Viewport} endingViewport - the viewport ti end the transistion with.\n * @param {Number} durationIn - duration of the smooth transition.\n */\n\tthis.cameraTransition = (startingViewport, endingViewport, durationIn) => {\n\t if (rotateCameraTransitionObject == undefined)\n\t smoothCameraTransitionObject = new SmoothCameraTransition(startingViewport, endingViewport,\n\t this, durationIn);\n\t}\n\n /**\n * Setup a rotate camera transition object which rotate the\n * camera by the specified the angle in the specified\n * duration. This will not work if {@link cameraTransition}\n * is active.\n * To use this object, the transition must be enabled using\n * {@link enableCameraTransition}.\n *\n * @param {THREE.Vector3} axis - the starting viewport\n * @param {Number} angle - the viewport ti end the transistion with.\n * @param {Number} duration - duration of the smooth transition.\n */\n\tthis.rotateCameraTransition = (axis, angle, duration) => {\n\t if (smoothCameraTransitionObject == undefined)\n\t rotateCameraTransitionObject = new RotateCameraTransition(axis, angle,\n\t this, duration);\n\t}\n\n /**\n * Enable camera transition, {@link rotateCameraTransition} amd\n * {@link cameraTransition} must be called before camera transition can\n * be enabled.\n */\n\tthis.enableCameraTransition = () => {\n\t if (smoothCameraTransitionObject)\n\t currentMode = MODE.SMOOTH_CAMERA_TRANSITION;\n\t if (rotateCameraTransitionObject)\n\t currentMode = MODE.ROTATE_CAMERA_TRANSITION;\n\t}\n\n /**\n * Pause the camera transition.\n */\n\tthis.pauseCameraTransition = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t}\n\n /**\n * Stop the camera transition and remove camera transition\n * and rotate camera transition.\n */\n\tthis.stopCameraTransition = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t\tsmoothCameraTransitionObject = undefined;\n\t\trotateCameraTransitionObject = undefined;\n\t}\n\n /**\n * Check if camera transition is active.\n */\n\tthis.isTransitioningCamera = () => {\n\t\treturn (currentMode === MODE.SMOOTH_CAMERA_TRANSITION ||\n\t\t currentMode === MODE.ROTATE_CAMERA_TRANSITION);\n\t}\n\n /**\n * Setup auto tumble object of the camera which will rotate the camera\n * around the target as if the user is rotating the camera by mouse/touch\n * interaction.\n * The tumbling will only be enabled with {@link enabelAutoTumble}.\n *\n * @param {Array} tumbleDirectionIn - direction of the mouse/touch.\n * @param {Number} tumbleRateIn - Speed of the tumbling.\n * @param {Boolean} stopOnCameraInputIn - Disable the tumbling once the user\n * start interacting with the scene.\n */\n\tthis.autoTumble = (tumbleDirectionIn, tumbleRateIn, stopOnCameraInputIn) => {\n\t\tcameraAutoTumbleObject = new CameraAutoTumble(tumbleDirectionIn, tumbleRateIn, stopOnCameraInputIn, this);\n\t}\n\n /**\n * Enable autotumble.\n */\n\tthis.enableAutoTumble = () => {\n\t\tcurrentMode = MODE.AUTO_TUMBLE;\n\t}\n\n /**\n * Disable the autotumble.\n */\n\tthis.stopAutoTumble = () => {\n\t\tcurrentMode = MODE.DEFAULT;\n\t\tcameraAutoTumbleObject = undefined;\n\t}\n\n /**\n * Update the autotumble object.\n */\n\tthis.updateAutoTumble = () => {\n\t\tif (cameraAutoTumbleObject)\n\t\t\tcameraAutoTumbleObject.requireUpdate = true;\n\t}\n\n /**\n * Check rather autotumble is active.\n *\n * @return {Boolean}\n */\n\tthis.isAutoTumble = () => {\n\t\treturn (currentMode === MODE.AUTO_TUMBLE);\n\t}\n\n /**\n * Create an internal raycaster object and enable it for picking.\n *\n * @param {Scene} sceneIn - The scene to pick from, it can be different from the\n * camera's scene.\n * @param {requestCallback} callbackFunctionIn - The callback for pick event.\n * @param {requestCallback} hoverCallbackFunctionIn - The callback for hover\n * over event.\n */\n this.enableRaycaster = (sceneIn, callbackFunctionIn, hoverCallbackFunctionIn) => {\n if (zincRayCaster == undefined)\n zincRayCaster = new RayCaster(sceneIn, this.scene, callbackFunctionIn, hoverCallbackFunctionIn, this.renderer);\n }\n\n /**\n * Disable raycaster and remove the internal ray caster object.\n */\n this.disableRaycaster = () => {\n zincRayCaster.disable();\n zincRayCaster = undefined;\n }\n\n /**\n * Check rather the camera is in syncControl mode.\n *\n * @return {Boolean}\n */\n this.isSyncControl = () => {\n return currentMpde === MODE.SYNC_CONTROL;\n }\n\n /**\n * Enable syncControl.\n */\n this.enableSyncControl = () => {\n currentMode = MODE.SYNC_CONTROL;\n if (!ndcControl)\n ndcControl = new NDCCameraControl();\n ndcControl.setCurrentCameraSettings(this.cameraObject,\n viewports[defaultViewport]);\n return ndcControl;\n }\n\n /**\n * Disable syncControl.\n */\n this.disableSyncControl = () => {\n currentMode = MODE.DEFAULT;\n this.cameraObject.zoom = 1;\n this.cameraObject.updateProjectionMatrix();\n }\n\n\tthis.enable();\n\n};\n\nconst SmoothCameraTransition = function(startingViewport, endingViewport, targetCameraIn, durationIn) {\n\tconst startingEyePosition = startingViewport.eyePosition;\n\tconst startingTargetPosition = startingViewport.targetPosition;\n\tconst startingUp = startingViewport.upVector;\n\tconst endingEyePosition = endingViewport.eyePosition;\n\tconst endingTargetPosition = endingViewport.targetPosition;\n\tconst endingUp = endingViewport.upVector;\n\tconst targetCamera = targetCameraIn;\n\tlet duration = durationIn;\n\tlet inbuildTime = 0;\n\tconst enabled = true;\n\tconst updateLightWithPathFlag = true;\n\tlet completed = false;\n\ttargetCamera.near = Math.min(startingViewport.nearPlane, endingViewport.nearPlane);\n\ttargetCamera.far = Math.max(startingViewport.farPlane, endingViewport.farPlane);\n\ttargetCamera.cameraObject.up.set( endingViewport.upVector[0], endingViewport.upVector[1],\n endingViewport.upVector[2]);\n\n this.setDuration = newDuration => {\n duration = newDuration;\n }\n\n\tconst updateTime = delta => {\n\t\tlet targetTime = inbuildTime + delta;\n\t\tif (targetTime > duration)\n\t\t\ttargetTime = duration;\n\t\tinbuildTime = targetTime;\n\t};\n\n\tconst updateCameraSettings = () => {\n\t\tconst ratio = inbuildTime / duration;\n\t\tconst eyePosition = [startingEyePosition[0] * (1.0 - ratio) + endingEyePosition[0] * ratio,\n\t\t startingEyePosition[1] * (1.0 - ratio) + endingEyePosition[1] * ratio,\n\t\t startingEyePosition[2] * (1.0 - ratio) + endingEyePosition[2] * ratio];\n\t\tconst targetPosition = [startingTargetPosition[0] * (1.0 - ratio) + endingTargetPosition[0] * ratio,\n\t\t startingTargetPosition[1] * (1.0 - ratio) + endingTargetPosition[1] * ratio,\n\t\t startingTargetPosition[2] * (1.0 - ratio) + endingTargetPosition[2] * ratio];\n const upVector = [startingUp[0] * (1.0 - ratio) + endingUp[0] * ratio,\n startingUp[1] * (1.0 - ratio) + endingUp[1] * ratio,\n startingUp[2] * (1.0 - ratio) + endingUp[2] * ratio];\n\t\ttargetCamera.cameraObject.position.set( eyePosition[0], eyePosition[1], eyePosition[2]);\n\t\ttargetCamera.cameraObject.target.set( targetPosition[0], targetPosition[1], targetPosition[2] );\n\t};\n\n\tthis.update = delta => {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tupdateTime(delta);\n\n\t\tupdateCameraSettings();\n\n\t\tif (inbuildTime == duration) {\n\t\t\tcompleted = true;\n\t\t}\n\n\t}\n\n\tthis.isTransitionCompleted = () => {\n\t\treturn completed;\n\t}\n\n};\n\nconst RotateCameraTransition = function(axisIn, angleIn, targetCameraIn, durationIn) {\n const axis = axisIn;\n const angle = angleIn;\n const targetCamera = targetCameraIn;\n let duration = durationIn;\n let inbuildTime = 0;\n const enabled = true;\n const ratio = inbuildTime / duration;\n let completed = false;\n\n this.setDuration = newDuration => {\n duration = newDuration;\n }\n\n const updateCameraSettings = delta => {\n const previousTime = inbuildTime;\n let targetTime = inbuildTime + delta;\n if (targetTime > duration)\n targetTime = duration;\n inbuildTime = targetTime;\n const actualDelta = inbuildTime - previousTime;\n const ratio = actualDelta / duration;\n const alpha = ratio * angle;\n targetCamera.rotateAboutLookAtpoint(axis, alpha);\n };\n\n this.update = delta => {\n\n if ( this.enabled === false ) return;\n\n updateCameraSettings(delta);\n\n if (inbuildTime == duration) {\n completed = true;\n }\n\n }\n\n this.isTransitionCompleted = () => {\n return completed;\n }\n}\n\nconst RayCaster = function (sceneIn, hostSceneIn, callbackFunctionIn, hoverCallbackFunctionIn, rendererIn) {\n const scene = sceneIn;\n const hostScene = hostSceneIn;\n\tconst renderer = rendererIn;\n\tconst callbackFunction = callbackFunctionIn;\n\tconst hoverCallbackFunction = hoverCallbackFunctionIn;\n\tlet enabled = true;\n\tconst raycaster = new THREE.Raycaster();\n\traycaster.params.Line.threshold = 0.1;\n\traycaster.params.Points.threshold = 1;\n const mouse = new THREE.Vector2();\n let awaiting = false;\n let lastHoveredDate = new Date();\n let lastHoveredEmpty = false;\n let timeDiff = 0;\n let pickedObjects = new Array();\n let lastPosition = { zincCamera: undefined, x: -1 ,y: -1};\n\tlet pickableObjects = undefined;\n\n\tthis.enable = () => {\n\t\tenabled = true;\n\t}\n\n\tthis.disable = () => {\n\t\tenabled = false;\n\t}\n\n\tthis.getIntersectsObject = (zincCamera) => {\n if (hostScene !== scene) {\n const threejsScene = scene.getThreeJSScene();\n renderer.render(threejsScene, zincCamera.cameraObject);\n }\n let objects = pickableObjects ? pickableObjects : scene.getPickableThreeJSObjects();\n //Reset pickedObjects array\n pickedObjects.length = 0;\n\t\treturn raycaster.intersectObjects( objects, true, pickedObjects );\n\t}\n\n\tthis.setPickableObjects = (zincObjects) => {\n\t\tif (zincObjects === undefined) {\n\t\t\tpickableObjects = undefined;\n\t\t} else {\n\t\t\tpickableObjects = [];\n\t\t\tzincObjects.forEach(zincObject => {\n\t\t\t\tif (zincObject.getGroup() && zincObject.getGroup().visible) {\n\t\t\t\t\tpickableObjects.push(zincObject.getGroup());\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tthis.getIntersectsObjectWithOrigin = (zincCamera, origin, direction) => {\n\t\traycaster.set(origin, direction);\n\t\treturn this.getIntersectsObject(zincCamera);\n\t}\n\n\tthis.getIntersectsObjectWithCamera = (zincCamera, x, y) => {\n zincCamera.getNDCFromDocumentCoords(x, y, mouse);\n\t\traycaster.setFromCamera(mouse, zincCamera.cameraObject);\n\t\treturn this.getIntersectsObject(zincCamera);\n\t};\n\n\tthis.pick = (zincCamera, x, y) => {\n\t\tif (enabled && renderer && scene && zincCamera && callbackFunction) {\n\t\t\tthis.getIntersectsObjectWithCamera(zincCamera, x, y);\n\t\t\tconst length = pickedObjects.length;\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tlet zincObject = pickedObjects[i].object ? pickedObjects[i].object.userData : undefined;\n\t\t\t\tif (zincObject && zincObject.isMarkerCluster && zincObject.visible\n\t\t\t\t\t&& zincObject.clusterIsVisible(pickedObjects[i].object.clusterIndex)) {\n\t\t\t\t\t//Can zoom into cluster\n\t\t\t\t\tif (zincObject.zoomToCluster(pickedObjects[i].object.clusterIndex)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcallbackFunction(pickedObjects, x, y);\n\t\t}\n }\n\n let hovered = (zincCamera, x, y) => {\n if (enabled && renderer && scene && zincCamera && hoverCallbackFunction) {\n this.getIntersectsObjectWithCamera(zincCamera, x, y);\n lastHoveredDate.setTime(Date.now());\n if (pickedObjects.length === 0) {\n //skip hovered callback if the previous one is empty\n if (lastHoveredEmpty)\n return\n lastHoveredEmpty = true;\n } else {\n lastHoveredEmpty = false;\n }\n hoverCallbackFunction(pickedObjects, x, y);\n }\n }\n\n\tthis.move = (zincCamera, x, y) => {\n if (enabled && renderer && scene && zincCamera && hoverCallbackFunction) {\n if (scene.displayMarkers) {\n hovered(zincCamera, x, y);\n } else {\n lastPosition.zincCamera = zincCamera;\n lastPosition.x = x;\n lastPosition.y = y;\n if (!awaiting) {\n timeDiff = lastHoveredDate ? Date.now() - lastHoveredDate.getTime() : 250;\n if (timeDiff >= 250) {\n hovered(zincCamera, x, y);\n } else {\n awaiting = true;\n setTimeout(awaitMove(lastPosition), timeDiff);\n }\n }\n }\n }\n }\n\n let awaitMove = (lastPosition) => {\n return function() {\n awaiting = false;\n hovered(lastPosition.zincCamera, lastPosition.x, lastPosition.y);\n }\n }\n};\n\nconst CameraAutoTumble = function (tumbleDirectionIn, tumbleRateIn, stopOnCameraInputIn, targetCameraIn) {\n\tconst tumbleAxis = new THREE.Vector3();\n\tconst angle = -tumbleRateIn;\n\tconst targetCamera = targetCameraIn;\n\tconst enabled = true;\n\tconst updateLightWithPathFlag = true;\n\tconst tumbleDirection = tumbleDirectionIn;\n\tthis.stopOnCameraInput = stopOnCameraInputIn;\n this.requireUpdate = true;\n const b = new THREE.Vector3();\n const c = new THREE.Vector3();\n\n\tconst computeTumbleAxisAngle = tumbleDirection => {\n\t\tconst tangent_dist = Math.sqrt(tumbleDirection[0]*tumbleDirection[0] +\n\t\t\ttumbleDirection[1]*tumbleDirection[1]);\n\t\tconst width = Math.abs(tumbleDirection[0]) * 4.0;\n\t\tconst height = Math.abs(tumbleDirection[1]) * 4.0;\n\t\tconst radius = 0.25 * (width + height);\n\t\tconst dx = -tumbleDirection[1]/tangent_dist;\n\t\tconst dy = tumbleDirection[0]/tangent_dist;\n\t\tlet d = dx*(tumbleDirection[0])+dy*(-tumbleDirection[1]);\n\n\t\tif (d > radius)\n\t\t{\n\t\t\td = radius;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (d < -radius)\n\t\t\t{\n\t\t\t\td = -radius;\n\t\t\t}\n\t\t}\n\n\t\tconst phi=Math.acos(d/radius)-0.5*Math.PI;\n\t\t/* get axis to rotate about */\n\t\ttumbleAxis.copy(targetCamera.cameraObject.position).sub(\n targetCamera.cameraObject.target).normalize();\n\t\tb.copy(targetCamera.cameraObject.up).normalize();\n c.crossVectors(b, tumbleAxis).normalize().multiplyScalar(dx);\n b.multiplyScalar(dy);\n b.add(c).multiplyScalar(Math.cos(phi));\n tumbleAxis.multiplyScalar(Math.sin(phi)).add(b);\n\t};\n\n\tthis.update = delta => {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tif (this.requireUpdate) {\n\t\t\tcomputeTumbleAxisAngle(tumbleDirection);\n\t\t\tthis.requireUpdate = false;\n\t\t}\n\t\ttargetCamera.rotateAboutLookAtpoint(tumbleAxis, angle * delta/1000);\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\nconst StereoCameraZoomFixed = function () {\n\n\tthis.type = 'StereoCamera';\n\n\tthis.aspect = 1;\n\n\tthis.cameraL = new THREE.PerspectiveCamera();\n\tthis.cameraL.layers.enable( 1 );\n\tthis.cameraL.matrixAutoUpdate = false;\n\n\tthis.cameraR = new THREE.PerspectiveCamera();\n\tthis.cameraR.layers.enable( 2 );\n\tthis.cameraR.matrixAutoUpdate = false;\n\n};\n\nObject.assign( StereoCameraZoomFixed.prototype, {\n\n\tupdate: (() => {\n\n\t\tlet focus, fov, aspect, near, far, zoom;\n\n\t\tconst eyeRight = new THREE.Matrix4();\n\t\tconst eyeLeft = new THREE.Matrix4();\n\n\t\treturn function update( camera ) {\n\n\t\t\tconst needsUpdate = focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\tif ( needsUpdate ) {\n\n\t\t\t\tfocus = camera.focus;\n\t\t\t\tfov = camera.fov;\n\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\tnear = camera.near;\n\t\t\t\tfar = camera.far;\n\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\tconst projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\tconst eyeSep = 0.064 / 2;\n\t\t\t\tconst eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\tconst ymax = near * Math.tan( THREE.Math.DEG2RAD * fov * 0.5 ) / camera.zoom;\n\t\t\t\tlet xmin, xmax;\n\n\t\t\t\t// translate xOffset\n\n\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t// for left eye\n\n\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t// for right eye\n\n\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t}\n\n\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t};\n\n\t})()\n\n} );\n\n/** the following StereoEffect is written by third party */\n/**\n * @author alteredq / http://alteredqualia.com/\n * @authod mrdoob / http://mrdoob.com/\n * @authod arodic / http://aleksandarrodic.com/\n * @authod fonserbc / http://fonserbc.github.io/\n*/\nconst StereoEffect = function ( renderer ) {\n\n\tconst _stereo = new StereoCameraZoomFixed();\n\t_stereo.aspect = 0.5;\n\n\tthis.setSize = (width, height) => {\n\n\t\trenderer.setSize( width, height );\n\n\t};\n\n\tthis.render = (scene, camera) => {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t_stereo.update( camera );\n\n\t\tconst size = renderer.getSize();\n\n\t\trenderer.setScissorTest( true );\n\t\trenderer.clear();\n\n\t\trenderer.setScissor( 0, 0, size.width / 2, size.height );\n\t\trenderer.setViewport( 0, 0, size.width / 2, size.height );\n\t\trenderer.render( scene, _stereo.cameraL );\n\n\t\trenderer.setScissor( size.width / 2, 0, size.width / 2, size.height );\n\t\trenderer.setViewport( size.width / 2, 0, size.width / 2, size.height );\n\t\trenderer.render( scene, _stereo.cameraR );\n\n\t\trenderer.setScissorTest( false );\n\n\t};\n\n};\n\n\n/**\n * @author richt / http://richt.me\n * @author WestLangley / http://github.com/WestLangley\n *\n * W3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\n */\n\nconst ModifiedDeviceOrientationControls = function ( object ) {\n\n\tconst scope = this;\n\n\tthis.object = object;\n\tthis.object.rotation.reorder( \"YXZ\" );\n\n\tthis.enabled = true;\n\n\tthis.deviceOrientation = {};\n\tthis.screenOrientation = 0;\n\n\tconst onDeviceOrientationChangeEvent = event => {\n\n\t\tscope.deviceOrientation = event;\n\n\t};\n\n\tconst onScreenOrientationChangeEvent = () => {\n\t if (typeof(window) !== 'undefined')\n\t scope.screenOrientation = window.orientation || 0;\n\n\t};\n\n\t// The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\n\n\tconst setObjectQuaternion = (() => {\n\n\t\tconst zee = new THREE.Vector3( 0, 0, 1 );\n\n\t\tconst euler = new THREE.Euler();\n\n\t\tconst q0 = new THREE.Quaternion();\n\n\t\tconst q1 = new THREE.Quaternion( - Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ); // - PI/2 around the x-axis\n\n\t\treturn (cameraObject, alpha, beta, gamma, orient) => {\n\n\t\t\tconst vector = new THREE.Vector3(0, 0, 1);\n\n\t\t\tvector.subVectors(cameraObject.target, cameraObject.position);\n\n\t\t\teuler.set( beta, alpha, - gamma, 'YXZ' ); // 'ZXY' for the device, but 'YXZ' for us\n\n\t\t\tconst quaternion = new THREE.Quaternion();\n\n\t\t\tquaternion.setFromEuler( euler ); // orient the device\n\n\t\t\tquaternion.multiply( q1 ); // camera looks out the back of the device, not the top\n\n\t\t\tquaternion.multiply( q0.setFromAxisAngle( zee, - orient ) ); // adjust for screen orientation\n\n\t\t\tvector.applyQuaternion(quaternion);\n\n\t\t\tvector.addVectors(cameraObject.position, vector);\n\n\t\t\tcameraObject.lookAt(vector);\n\n\t\t};\n\n\t})();\n\n\tthis.connect = () => {\n\n\t\tonScreenOrientationChangeEvent(); // run once on load\n\t\tif (typeof(window) !== 'undefined') {\n\t\t window.addEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\n\t\t window.addEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\n\t\t}\n\t\tscope.enabled = true;\n\n\t};\n\n\tthis.disconnect = () => {\n\t if (typeof(window) !== 'undefined') {\n\t window.removeEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\n\t\t window.removeEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\n\t }\n\t\tscope.enabled = false;\n\n\t};\n\n\tthis.update = () => {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tconst alpha = scope.deviceOrientation.alpha ? THREE.Math.degToRad( scope.deviceOrientation.alpha ) : 0; // Z\n\t\tconst beta = scope.deviceOrientation.beta ? THREE.Math.degToRad( scope.deviceOrientation.beta ) : 0; // X'\n\t\tconst gamma = scope.deviceOrientation.gamma ? THREE.Math.degToRad( scope.deviceOrientation.gamma ) : 0; // Y''\n\t\tconst orient = scope.screenOrientation ? THREE.Math.degToRad( scope.screenOrientation ) : 0; // O\n\n\t\tsetObjectQuaternion( scope.object, alpha, beta, gamma, orient );\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\tthis.disconnect();\n\n\t};\n\n\tthis.connect();\n\n};\n\nconst NDCCameraControl = function () {\n\tlet camera = undefined;\n let targetCamera = undefined;\n let defaultViewport = undefined;\n const position = new THREE.Vector3();\n const target = new THREE.Vector3();\n const v1 = new THREE.Vector3();\n const v2 = new THREE.Vector3();\n let eventCallback = undefined;\n\n this.setCurrentCameraSettings = (cameraIn, defaultViewportIn) => {\n this.near_plane_fly_debt == 0.0;\n camera = cameraIn.clone();\n targetCamera = cameraIn;\n defaultViewport = defaultViewportIn;\n camera.near = defaultViewport.nearPlane;\n if (defaultViewport.farPlane)\n camera.far = defaultViewport.farPlane;\n if (defaultViewport.eyePosition)\n camera.position.set(defaultViewport.eyePosition[0],\n defaultViewport.eyePosition[1], defaultViewport.eyePosition[2]);\n if (defaultViewport.upVector)\n camera.up.set(defaultViewport.upVector[0], defaultViewport.upVector[1],\n defaultViewport.upVector[2]);\n if (defaultViewport.targetPosition) {\n camera.target = new THREE.Vector3(defaultViewport.targetPosition[0],\n defaultViewport.targetPosition[1], defaultViewport.targetPosition[2]);\n camera.lookAt(camera.target);\n }\n camera.updateProjectionMatrix();\n position.copy(camera.position).project(camera);\n target.copy(camera.target).project(camera);\n }\n\n this.getCurrentPosition = () => {\n target.copy(targetCamera.target).project(camera);\n return [target.x, target.y];\n }\n\n this.zoom = delta => {\n let scaledDelta = delta * 0.002;\n let zoom = Math.max(targetCamera.zoom - scaledDelta, 1.0);\n targetCamera.zoom = zoom;\n targetCamera.updateProjectionMatrix();\n }\n\n this.zoomToBox = (box, zoom) => {\n box.getCenter(v1);\n v1.project(camera);\n this.setCenterZoom([v1.x, v1.y], zoom);\n }\n\n //return top left and size\n this.getPanZoom = () => {\n return {target: this.getCurrentPosition(), zoom: targetCamera.zoom };\n }\n\n this.setCenterZoom = (center, zoom) => {\n v1.set(center[0], center[1], target.z).unproject(camera);\n v2.copy(v1).sub(targetCamera.target);\n targetCamera.target.copy(v1);\n targetCamera.lookAt(targetCamera.target);\n targetCamera.position.add(v2);\n targetCamera.zoom = zoom;\n targetCamera.updateProjectionMatrix();\n }\n\n this.setEventCallback = (callback) => {\n if (callback === undefined || (typeof callback == 'function'))\n eventCallback = callback;\n }\n\n this.triggerCallback = () => {\n if (eventCallback !== undefined && (typeof eventCallback == 'function'))\n eventCallback();\n }\n};\n\nexport {\n Viewport,\n CameraControls,\n SmoothCameraTransition,\n RotateCameraTransition,\n RayCaster,\n CameraAutoTumble,\n StereoEffect,\n NDCCameraControl\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'%20?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20version='1.1'%20width='365'%20height='560'%20viewBox='0%200%20365%20560'%20xml:space='preserve'%3e%3cdesc%3eCreated%20with%20Fabric.js%205.2.4%3c/desc%3e%3cdefs%3e%3c/defs%3e%3crect%20x='0'%20y='0'%20width='100%25'%20height='100%25'%20fill='transparent'%3e%3c/rect%3e%3cg%20transform='matrix(0%200%200%200%200%200)'%20id='808ed283-2524-440f-88ae-3bdb47bb5749'%20%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%20182.5%20280)'%20id='db30413d-5bff-4b98-ab59-464497ee199e'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-182.5'%20y='-280'%20rx='0'%20ry='0'%20width='365'%20height='560'%20/%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0%200%200%200%200%2097.5)'%20%3e%3cg%20style=''%20%3e%3c/g%3e%3c/g%3e%3cg%20transform='matrix(0.99%200%200%200.99%20182.5%20280)'%20%3e%3cg%20style=''%20vector-effect='non-scaling-stroke'%20%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3crect%20style='stroke:%20none;%20stroke-width:%201;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;%20visibility:%20hidden;'%20vector-effect='non-scaling-stroke'%20x='-540'%20y='-540'%20rx='0'%20ry='0'%20width='1080'%20height='1080'%20/%3e%3c/g%3e%3cg%20transform='matrix(1%200%200%201%200%200)'%20%3e%3cpath%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,165,0);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20transform='%20translate(-182.9,%20-279.85)'%20d='M%20182.9%20551.7%20C%20182.9%20551.8000000000001%20183.1%20552%20183.1%20552%20C%20183.1%20552%20358.3%20283%20358.3%20194.6%20C%20358.3%2064.5%20269.5%207.900000000000006%20182.9%207.699999999999989%20C%2096.3%207.9%207.5%2064.5%207.5%20194.6%20C%207.5%20283%20182.8%20552%20182.8%20552%20C%20182.8%20552%20182.9%20551.7%20182.9%20551.7%20z%20M%20122.2%20187.2%20C%20122.2%20153.6%20149.4%20126.39999999999999%20183%20126.39999999999999%20C%20216.6%20126.39999999999999%20243.8%20153.6%20243.8%20187.2%20C%20243.8%20220.79999999999998%20216.5%20248%20182.9%20248%20C%20149.4%20248%20122.2%20220.8%20122.2%20187.2%20z'%20stroke-linecap='round'%20/%3e%3c/g%3e%3cg%20transform='matrix(3.82%200%200%203.82%200%20-100.77)'%20%3e%3ccircle%20style='stroke:%20rgb(0,0,0);%20stroke-width:%200;%20stroke-dasharray:%20none;%20stroke-linecap:%20butt;%20stroke-dashoffset:%200;%20stroke-linejoin:%20miter;%20stroke-miterlimit:%204;%20fill:%20rgb(255,255,255);%20fill-rule:%20nonzero;%20opacity:%201;'%20vector-effect='non-scaling-stroke'%20cx='0'%20cy='0'%20r='35'%20/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","import * as THREE from 'three';\nimport { ZincObject } from './zincObject';\nconst markerImage = new Image(128, 128);\nimport mapMarkerOrange from '../assets/mapMarkerOrange.svg';\nmarkerImage.src = mapMarkerOrange;\nconst texture = new THREE.Texture();\ntexture.image = markerImage;\ntexture.needsUpdate = true;\nconst size = [0.02, 0.03, 1];\nconst spriteMaterial = new THREE.SpriteMaterial({\n map: texture,\n alphaTest: 0.5,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n sizeAttenuation: false\n});\nimport { createNewSpriteText } from '../utilities';\n\n/**\n * A special graphics type with a tear drop shape.\n * It forms a cluster a marker based on distance.\n *\n * @class\n * @author Alan Wu\n * @return {Marker}\n */\nconst MarkerCluster = function(sceneIn) {\n ZincObject.call(this);\n this.texture = texture;\n let sprite = undefined;\n let scene = sceneIn;\n this.morph = new THREE.Group();\n this.group = this.morph;\n this.isMarkerCluster = true;\n let enabled = true;\n let sprites = [];\n this.markers = {};\n let _v21 = new THREE.Vector2();\n let _v22 = new THREE.Vector2();\n let _radius = 0.1;\n let start = Date.now();\n\n /**\n * Set the size of the marker.\n *\n * @param {Number} size - size to be set.\n */\n this.setSpriteSize = size => {\n sprite.scale.set(0.015, 0.02, 1);\n sprite.scale.multiplyScalar(size);\n }\n\n this.clear = () => {\n this.group.clear();\n this.markers = {};\n }\n\n /**\n * Clean up this object,\n */\n this.dispose = () => {\n this.clear();\n if (this.morph) {\n this.morph.clear();\n }\n }\n\n const createNewSprite = (index) => {\n //Group is needed to set the position after scaling\n //the sprite\n const localGroup = new THREE.Group();\n const sprite = new THREE.Sprite(spriteMaterial);\n sprite.clusterIndex = index;\n sprite.center.set(0.5, 0);\n sprite.position.set(0, 0, 0);\n sprite.renderOrder = 10000;\n sprite.scale.set(size[0], size[1], size[2]);\n sprite.userData = this;\n localGroup.add(sprite);\n this.group.add(localGroup);\n return {\n \"group\": localGroup,\n \"marker\": sprite,\n \"label\": undefined,\n \"number\": 0,\n \"min\": [0, 0, 0],\n \"max\": [1, 1, 1],\n };\n }\n\n const activateSpriteForCluster = (sprite, cluster, number) => {\n sprite.group.visible = true;\n sprite.group.position.set(\n cluster.coords[0], cluster.coords[1], cluster.coords[2]\n );\n if (sprite.label === undefined || (number !== sprite.number)) {\n if (sprite.label) {\n sprite.group.remove(sprite.label);\n sprite.label.material.map.dispose();\n sprite.label.material.dispose();\n }\n sprite.label = createNewSpriteText(number, 0.012, \"black\", \"Asap\", 120, 700);\n sprite.number = number;\n sprite.group.add(sprite.label);\n }\n sprite.min = cluster.min;\n sprite.max = cluster.max;\n }\n\n const drawClusters = (clusters) => {\n let currentIndex = 0;\n clusters.forEach((cluster) => {\n const length = cluster.members.length;\n let number = 0;\n if (length === 1) {\n cluster.members[0].setVisibility(true);\n } else {\n cluster.members.forEach((marker) => {\n number += marker.getNumber();\n marker.setVisibility(false);\n });\n if (!sprites[currentIndex]) {\n sprites.push(createNewSprite(currentIndex));\n }\n activateSpriteForCluster(sprites[currentIndex], cluster, number);\n currentIndex++;\n }\n });\n for (currentIndex; currentIndex < sprites.length; currentIndex++) {\n sprites[currentIndex].group.visible = false;\n }\n }\n\n //Get clusters based on the ndc coordinate for each cluster.\n const getCluster = (markersObj, clusters) => {\n let first = true;\n let newCluster = {members: [], coords: [0,0,0], min: [0, 0, 0], max: [1, 1, 1]};\n let dist = 0\n for (let prop in markersObj) {\n if (first) {\n _v21.set(markersObj[prop].ndc.x, markersObj[prop].ndc.y);\n this._b1.setFromPoints([markersObj[prop].morph.position]);\n first = false;\n newCluster.members.push(markersObj[prop]);\n newCluster.coords = [\n markersObj[prop].morph.position.x,\n markersObj[prop].morph.position.y,\n markersObj[prop].morph.position.z,\n ]\n clusters.push(newCluster);\n delete markersObj[prop];\n } else {\n _v22.set(markersObj[prop].ndc.x, markersObj[prop].ndc.y);\n dist = _v21.distanceTo(_v22);\n if (_radius > dist) {\n newCluster.members.push(markersObj[prop]);\n this._b1.expandByPoint(markersObj[prop].morph.position);\n delete markersObj[prop];\n }\n }\n }\n newCluster.min = [this._b1.min.x, this._b1.min.y, this._b1.min.z];\n newCluster.max = [this._b1.max.x, this._b1.max.y, this._b1.max.z];\n //this._b1.getCenter(this._v2);\n //newCluster.coords = [this._v2.x, this._v2.y, this._v2.z];\n //The following will not be called if there is object left and\n //thus finishing clustering\n if (first !== true) {\n getCluster(markersObj, clusters);\n }\n }\n\n this.calculate = () => {\n if (enabled) {\n const current = Date.now();\n if ((current - start) > 500) {\n let clusters = [];\n getCluster({...this.markers}, clusters);\n drawClusters(clusters);\n start = Date.now();\n this.markerUpdateRequired = false;\n }\n }\n }\n\n this.isEnabled = () => {\n return enabled;\n }\n\n /**\n * Enable and visualise the marker.\n */\n this.enable = () => {\n enabled = true;\n this.morph.visible = true;\n }\n\n /**\n * Disable and hide the marker.\n */\n this.disable = () => {\n enabled = false;\n this.morph.visible = false;\n //turn all markers back on\n for (let prop in this.markers) {\n if (this.markers[prop]?.isMarker &&\n this.markers[prop].isEnabled()) {\n this.markers[prop].setVisibility(true);\n }\n }\n }\n\n this.zoomToCluster = (index) => {\n if (index !== undefined && index > -1) {\n this._v1.set(...sprites[index].min);\n this._v2.set(...sprites[index].max);\n if (Math.abs(this._v1.distanceTo(this._v2) > 0.0)) {\n this._b1.set(this._v1, this._v2);\n scene.translateBoundingBoxToCameraView(this._b1, 3, 300);\n this.markerUpdateRequired = true;\n return true;\n }\n }\n return false;\n }\n\n this.clusterIsVisible = (index) => {\n if (index !== undefined && index > -1) {\n if (sprites[index]) {\n return sprites[index].group?.visible;\n }\n }\n return false;\n }\n}\n\nMarkerCluster.prototype = Object.create(ZincObject.prototype);\nexport { MarkerCluster };\n","import * as THREE from 'three';\n\n/**\n * This provide a full scale minimap. It will always\n * display the whole map.\n *\n * @class\n * @author Alan Wu\n * @return {Minimap}\n */\nconst Minimap = function (sceneIn) {\n let targetScene = sceneIn;\n this.camera = new THREE.OrthographicCamera(\n -0.5, 0.5, 0.5, -0.5, 0.01, 10);\n this.helper = undefined;\n let geometry = new THREE.BufferGeometry();\n var vertices = new Float32Array( [\n -1.0, -1.0, 1.0,\n 1.0, -1.0, 1.0,\n 1.0, 1.0, 1.0,\n 1.0, 1.0, 1.0,\n -1.0, 1.0, 1.0,\n -1.0, -1.0, 1.0\n ] );\n let positionAttributes = new THREE.BufferAttribute( vertices, 3 );\n geometry.setAttribute( 'position', positionAttributes);\n var material = new THREE.MeshBasicMaterial( { color: 0x333333,\n depthTest: false,\n depthWrite: false,\n opacity: 0.5,\n transparent: true } );\n this.mask = new THREE.Mesh( geometry, material );\n let _box = new THREE.Box3();\n let _center = new THREE.Vector3();\n\n this.getDiffFromNormalised = (x, y) => {\n _box.setFromBufferAttribute(positionAttributes).getCenter(_center);\n let coord = _center.clone().project(this.camera);\n let new_coord = new THREE.Vector3(x, y, coord.z).unproject(this.camera);\n return new_coord.sub(_center);\n }\n\n let setCurrentCameraSettings = (diameter, newViewport) => {\n if (targetScene.camera.near)\n this.camera.near = targetScene.camera.near;\n if (newViewport.farPlane)\n this.camera.far = newViewport.farPlane;\n if (newViewport.eyePosition)\n this.camera.position.set(newViewport.eyePosition[0],\n newViewport.eyePosition[1], newViewport.eyePosition[2]);\n if (newViewport.upVector)\n this.camera.up.set(newViewport.upVector[0], newViewport.upVector[1],\n newViewport.upVector[2]);\n if (newViewport.targetPosition)\n this.camera.lookAt(new THREE.Vector3(newViewport.targetPosition[0],\n newViewport.targetPosition[1], newViewport.targetPosition[2]));\n this.camera.zoom = 1 / diameter;\n this.camera.updateProjectionMatrix();\n }\n\n this.getBoundary = () => {\n let target = new THREE.Vector3().copy(\n targetScene.camera.target).project(targetScene.camera);\n let v1 = new THREE.Vector3(-1, -1, target.z).unproject(targetScene.camera);\n let v2 = new THREE.Vector3(1, -1, target.z).unproject(targetScene.camera);\n let v3 = new THREE.Vector3(1, 1, target.z).unproject(targetScene.camera);\n let v4 = new THREE.Vector3(-1, 1, target.z).unproject(targetScene.camera);\n let array = [v1, v2, v3, v3, v4, v1];\n positionAttributes.copyVector3sArray(array);\n positionAttributes.needsUpdate = true;\n }\n\n this.updateCamera = () => {\n this.getBoundary();\n let cameraControl = targetScene.getZincCameraControls();\n let boundingBox = targetScene.getBoundingBox();\n if (boundingBox) {\n // enlarge radius to keep image within edge of window\n const diameter = boundingBox.min.distanceTo(boundingBox.max);\n const radius = diameter / 2.0;\n const centreX = (boundingBox.min.x + boundingBox.max.x) / 2.0;\n const centreY = (boundingBox.min.y + boundingBox.max.y) / 2.0;\n const centreZ = (boundingBox.min.z + boundingBox.max.z) / 2.0;\n const clip_factor = 4.0;\n const viewport = cameraControl.getViewportFromCentreAndRadius(\n centreX, centreY, centreZ, radius, 40, radius * clip_factor);\n setCurrentCameraSettings(diameter, viewport);\n }\n }\n}\n\nexport { Minimap };","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from 'three';\n\nconst _box = new Box3();\nconst _vector = new Vector3();\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineSegmentsGeometry';\n\n\t\tconst 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\t\tconst uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\t\tconst index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\t\tthis.setIndex( index );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst 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( array ) {\n\n\t\tlet 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\tconst 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( array ) {\n\n\t\tlet 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\tconst 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( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromEdgesGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromMesh( 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( lineSegments ) {\n\n\t\tconst geometry = lineSegments.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.LineSegmentsGeometry no longer supports Geometry. Use THREE.BufferGeometry instead.' );\n\t\t\treturn;\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() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t_box.setFromBufferAttribute( end );\n\n\t\t\tthis.boundingBox.union( _box );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( start, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t_vector.fromBufferAttribute( end, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\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.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\t// todo\n\n\t}\n\n\tapplyMatrix( 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\nLineSegmentsGeometry.prototype.isLineSegmentsGeometry = true;\n\nexport { LineSegmentsGeometry };\n","import {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2\n} from 'three';\n\n/**\n * parameters = {\n * color: <hex>,\n * linewidth: <float>,\n * dashed: <boolean>,\n * dashScale: <float>,\n * dashSize: <float>,\n * dashOffset: <float>,\n * gapSize: <float>,\n * resolution: <Vector2>, // 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: /* glsl */`\n\t\t#include <common>\n\t\t#include <color_pars_vertex>\n\t\t#include <fog_pars_vertex>\n\t\t#include <logdepthbuf_pars_vertex>\n\t\t#include <clipping_planes_pars_vertex>\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 <logdepthbuf_vertex>\n\t\t\t#include <clipping_planes_vertex>\n\t\t\t#include <fog_vertex>\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\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 <common>\n\t\t#include <color_pars_fragment>\n\t\t#include <fog_pars_fragment>\n\t\t#include <logdepthbuf_pars_fragment>\n\t\t#include <clipping_planes_pars_fragment>\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\t#include <clipping_planes_fragment>\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\tfloat alpha = opacity;\n\n\t\t\t#ifdef ALPHA_TO_COVERAGE\n\n\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\tfloat a = vUv.x;\n\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\tfloat len2 = a * a + b * b;\n\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t}\n\n\t\t\t#else\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\t#endif\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\n\t\t\t#include <logdepthbuf_fragment>\n\t\t\t#include <color_fragment>\n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <encodings_fragment>\n\t\t\t#include <fog_fragment>\n\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t}`\n\n};\n\nclass LineMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttype: 'LineMaterial',\n\n\t\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\t\tclipping: true // required for clipping support\n\n\t\t} );\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tcolor: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.diffuse.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tlinewidth: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.linewidth.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.linewidth.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashed: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'USE_DASH' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'USE_DASH' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.USE_DASH = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_DASH;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashScale: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashScale.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashScale.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashOffset: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashOffset.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashOffset.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgapSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.gapSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.gapSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\topacity: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tresolution: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.resolution.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.resolution.value.copy( value );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\talphaToCoverage: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'ALPHA_TO_COVERAGE' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'ALPHA_TO_COVERAGE' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.ALPHA_TO_COVERAGE = '';\n\t\t\t\t\t\tthis.extensions.derivatives = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.ALPHA_TO_COVERAGE;\n\t\t\t\t\t\tthis.extensions.derivatives = 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.setValues( parameters );\n\n\t}\n\n}\n\nLineMaterial.prototype.isLineMaterial = true;\n\nexport { LineMaterial };\n","import {\n\tBox3,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tSphere,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\nimport { LineMaterial } from './LineMaterial.js';\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nconst _start4 = new Vector4();\nconst _end4 = new Vector4();\n\nconst _ssOrigin = new Vector4();\nconst _ssOrigin3 = new Vector3();\nconst _mvMatrix = new Matrix4();\nconst _line = new Line3();\nconst _closestPoint = new Vector3();\n\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _clipToWorldVector = new Vector4();\n\nclass LineSegments2 extends Mesh {\n\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments2';\n\n\t}\n\n\t// for backwards-compatability, but could be a method of LineSegmentsGeometry...\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2.' );\n\n\t\t}\n\n\t\tconst threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\tconst ray = raycaster.ray;\n\t\tconst camera = raycaster.camera;\n\t\tconst projectionMatrix = camera.projectionMatrix;\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst resolution = material.resolution;\n\t\tconst lineWidth = material.linewidth + threshold;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\n\t\t// camera forward is negative\n\t\tconst near = - camera.near;\n\n\t\t// clip space is [ - 1, 1 ] so multiply by two to get the full\n\t\t// width in clip space\n\t\tconst ssMaxWidth = 2.0 * Math.max( lineWidth / resolution.width, lineWidth / resolution.height );\n\n\t\t//\n\n\t\t// check if we intersect the sphere bounds\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( matrixWorld );\n\t\tconst distanceToSphere = Math.max( camera.near, _sphere.distanceToPoint( ray.origin ) );\n\n\t\t// get the w component to scale the world space line width\n\t\t_clipToWorldVector.set( 0, 0, - distanceToSphere, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tconst sphereMargin = Math.abs( ssMaxWidth / _clipToWorldVector.w ) * 0.5;\n\t\t_sphere.radius += sphereMargin;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\t// check if we intersect the box bounds\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\t_box.copy( geometry.boundingBox ).applyMatrix4( matrixWorld );\n\t\tconst distanceToBox = Math.max( camera.near, _box.distanceToPoint( ray.origin ) );\n\n\t\t// get the w component to scale the world space line width\n\t\t_clipToWorldVector.set( 0, 0, - distanceToBox, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tconst boxMargin = Math.abs( ssMaxWidth / _clipToWorldVector.w ) * 0.5;\n\t\t_box.max.x += boxMargin;\n\t\t_box.max.y += boxMargin;\n\t\t_box.max.z += boxMargin;\n\t\t_box.min.x -= boxMargin;\n\t\t_box.min.y -= boxMargin;\n\t\t_box.min.z -= boxMargin;\n\n\t\tif ( raycaster.ray.intersectsBox( _box ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t\t// applying the projection matrix.\n\t\tray.at( 1, _ssOrigin );\n\n\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t_ssOrigin.w = 1;\n\t\t_ssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t\t_ssOrigin.applyMatrix4( projectionMatrix );\n\t\t_ssOrigin.multiplyScalar( 1 / _ssOrigin.w );\n\n\t\t// screen space\n\t\t_ssOrigin.x *= resolution.x / 2;\n\t\t_ssOrigin.y *= resolution.y / 2;\n\t\t_ssOrigin.z = 0;\n\n\t\t_ssOrigin3.copy( _ssOrigin );\n\n\t\t_mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\t\tfor ( let i = 0, l = instanceStart.count; i < l; i ++ ) {\n\n\t\t\t_start4.fromBufferAttribute( instanceStart, i );\n\t\t\t_end4.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t_start4.w = 1;\n\t\t\t_end4.w = 1;\n\n\t\t\t// camera space\n\t\t\t_start4.applyMatrix4( _mvMatrix );\n\t\t\t_end4.applyMatrix4( _mvMatrix );\n\n\t\t\t// skip the segment if it's entirely behind the camera\n\t\t\tvar isBehindCameraNear = _start4.z > near && _end4.z > near;\n\t\t\tif ( isBehindCameraNear ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// trim the segment if it extends behind camera near\n\t\t\tif ( _start4.z > near ) {\n\n\t\t\t\tconst deltaDist = _start4.z - _end4.z;\n\t\t\t\tconst t = ( _start4.z - near ) / deltaDist;\n\t\t\t\t_start4.lerp( _end4, t );\n\n\t\t\t} else if ( _end4.z > near ) {\n\n\t\t\t\tconst deltaDist = _end4.z - _start4.z;\n\t\t\t\tconst t = ( _end4.z - near ) / deltaDist;\n\t\t\t\t_end4.lerp( _start4, t );\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\t_start4.applyMatrix4( projectionMatrix );\n\t\t\t_end4.applyMatrix4( projectionMatrix );\n\n\t\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t\t_start4.multiplyScalar( 1 / _start4.w );\n\t\t\t_end4.multiplyScalar( 1 / _end4.w );\n\n\t\t\t// screen space\n\t\t\t_start4.x *= resolution.x / 2;\n\t\t\t_start4.y *= resolution.y / 2;\n\n\t\t\t_end4.x *= resolution.x / 2;\n\t\t\t_end4.y *= resolution.y / 2;\n\n\t\t\t// create 2d segment\n\t\t\t_line.start.copy( _start4 );\n\t\t\t_line.start.z = 0;\n\n\t\t\t_line.end.copy( _end4 );\n\t\t\t_line.end.z = 0;\n\n\t\t\t// get closest point on ray to segment\n\t\t\tconst param = _line.closestPointToPointParameter( _ssOrigin3, true );\n\t\t\t_line.at( param, _closestPoint );\n\n\t\t\t// check if the intersection point is within clip space\n\t\t\tconst zPos = MathUtils.lerp( _start4.z, _end4.z, param );\n\t\t\tconst isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\t\tconst isInside = _ssOrigin3.distanceTo( _closestPoint ) < lineWidth * 0.5;\n\n\t\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\t_line.start.applyMatrix4( matrixWorld );\n\t\t\t\t_line.end.applyMatrix4( matrixWorld );\n\n\t\t\t\tconst pointOnLine = new Vector3();\n\t\t\t\tconst point = new Vector3();\n\n\t\t\t\tray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tpoint: point,\n\t\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\t\tdistance: ray.origin.distanceTo( point ),\n\n\t\t\t\t\tobject: this,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: i,\n\t\t\t\t\tuv: null,\n\t\t\t\t\tuv2: null,\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nLineSegments2.prototype.LineSegments2 = true;\n\nexport { LineSegments2 };\n","import * as THREE from 'three';\nimport { Lines } from './lines';\nimport { LineSegments2 } from '../three/line/LineSegments2';\nimport { LineMaterial } from '../three/line/LineMaterial';\nimport { LineSegmentsGeometry } from '../three/line/LineSegmentsGeometry';\n/**\n * Provides an object which stores lines.\n * This is created when a valid json file containing lines is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {Lines}\n */\nconst Lines2 = function () {\n Lines.call(this);\n\tthis.isLines2 = true;\n let positions = new Array(300);\n\n /**\n * Create the line segements using geometry and material.\n *\n * @param {Array} arrayIn - Geometry of lines to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n\tthis.createLineSegment = (arrayIn, materialIn, options) => {\n\t\tif (arrayIn && materialIn) {\n const linesGeometry = new LineSegmentsGeometry();\n linesGeometry.setPositions(arrayIn);\n linesGeometry.colorsNeedUpdate = true;\n const line = new LineSegments2(linesGeometry, materialIn);\n line.scale.set(1, 1, 1);\n line.computeLineDistances();\n this.setMesh(line, options.localTimeEnabled, options.localMorphColour);\n\t\t}\n\t}\n\n /**\n * Set the width for the lines.\n *\n * @param {Number} width - Width of the lines.\n */\n\tthis.setWidth = width => {\n\t\tif (this.morph && this.morph.material) {\n\t\t\tthis.morph.material.linewidth = width;\n\t\t\tthis.morph.material.needsUpdate = true;\n\t\t}\n\t}\n\n /**\n * Add new vertices into the array\n */\n this.addVertices = function(coords) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n if (!mesh) {\n this.drawRange = 0;\n }\n let index = this.drawRange * 3;\n coords.forEach(coord => {\n positions[index++] = coord[0];\n positions[index++] = coord[1];\n positions[index++] = coord[2];\n this.drawRange++;\n });\n //fill the rest of the array.\n if (!mesh) {\n while (index < 300) {\n positions[index++] = coords[0][0];\n positions[index++] = coords[0][1];\n positions[index++] = coords[0][2];\n }\n }\n\n if (mesh) {\n mesh.geometry.setPositions(positions);\n mesh.computeLineDistances();\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n return positions;\n }\n\n /**\n * Get the vertices by face index\n */\n this.getVerticesByFaceIndex = function(faceIndex) {\n let vIndex = faceIndex * 2 * 3;\n const mesh = this.getMorph();\n if (mesh && (this.drawRange * 3) > vIndex) {\n const position = mesh.geometry.getAttribute( 'instanceStart' );\n return [\n [\n position.data.array[vIndex],\n position.data.array[++vIndex],\n position.data.array[++vIndex],\n ],\n [\n position.data.array[++vIndex],\n position.data.array[++vIndex],\n position.data.array[++vIndex],\n ],\n ];\n }\n return [];\n }\n\n /**\n * Edit Vertice in index.\n */\n this.editVertices = function(coords, i) {\n if (coords && coords.length) {\n let mesh = this.getMorph();\n const maxIndex = i + coords.length - 1;\n if (!mesh || 0 > i || maxIndex >= this.drawRange) {\n return;\n } else {\n\n let index = i * 3;\n coords.forEach(coord => {\n positions[index++] = coord[0];\n positions[index++] = coord[1];\n positions[index++] = coord[2];\n });\n index = this.drawRange * 3;\n while (index < 300) {\n positions[index++] = coords[0][0];\n positions[index++] = coords[0][1];\n positions[index++] = coords[0][2];\n }\n mesh.geometry.setPositions(positions);\n mesh.computeLineDistances();\n mesh.geometry.computeBoundingBox();\n mesh.geometry.computeBoundingSphere();\n this.boundingBoxUpdateRequired = true;\n }\n }\n return positions;\n }\n\n /**\n * Add new lines to existing lines if it exists, otherwise\n * create a new one and add to it.\n * @param {Array} coords -An array of three components coordinates.\n\n * @param {Number} colour - A hex value of the colour for the points\n */\n\tthis.addLines = (coords, colour) => {\n if (coords && coords.length > 0) {\n this.addVertices(coords);\n let mesh = this.getMorph();\n if (!mesh) {\n const material = new LineMaterial( {\n color: colour,\n linewidth:1,\n vertexColors: false,\n worldUnits: false,\n });\n material.resolution.set( window.innerWidth, window.innerHeight );\n const options = { localTimeEnabled: false, localMorphColour: false};\n this.createLineSegment(positions, material, options);\n }\n if (this.region) this.region.pickableUpdateRequired = true;\n }\n\t}\n\n this.render = (delta, playAnimation, cameraControls, options) => {\n const material = this.getMorph().material;\n material.resolution.set( window.innerWidth, window.innerHeight );\n }\n}\n\nLines2.prototype = Object.create(Lines.prototype);\nLines2.prototype.constructor = Lines2;\nexport { Lines2 };\n","import * as THREE from 'three';\nimport { Pointset } from './primitives/pointset';\nimport { Lines2 } from './primitives/lines2';\nimport { Geometry } from './primitives/geometry';\n\nlet uniqueiId = 0;\n\nconst getUniqueId = function () {\n return \"re\" + uniqueiId++;\n}\n\n/**\n * Provides a hierachical structure to objects, Each region\n * may contain multiple child regions and {@link ZincObject}.\n *\n * @class\n * @author Alan Wu\n * @return {Region}\n */\nlet Region = function (parentIn, sceneIn) {\n let parent = parentIn;\n let group = new THREE.Group();\n group.matrixAutoUpdate = false;\n group.userData = this;\n let children = [];\n let name = \"\";\n let zincObjects = [];\n let scene = sceneIn;\n const tMatrix = new THREE.Matrix4();\n let duration = 3000;\n tMatrix.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n this.pickableUpdateRequired = true;\n this.isRegion = true;\n this.uuid = getUniqueId();\n\n\n /**\n * Hide all primitives belong to this region.\n */\n this.hideAllPrimitives = () => {\n children.forEach(child => child.hideAllPrimitives());\n zincObjects.forEach(zincObject => zincObject.setVisibility(false));\n }\n\n /**\n * Show all primitives belong to this region.\n */\n this.showAllPrimitives = () => {\n children.forEach(child => child.showAllPrimitives());\n zincObjects.forEach(zincObject => zincObject.setVisibility(true));\n }\n\n /**\n * Set the visibility and propagate it down the hierarchies\n * depending on the flag.\n *\n * @param {Boolean} flag - A flag indicating either the visibilty to be on/off.\n */\n this.setVisibility = (flag) => {\n if (flag != group.visible) {\n group.visible = flag;\n this.pickableUpdateRequired = true;\n }\n }\n\n /**\n * Get the visibility of the region and its children.\n *\n * @return {Boolean}\n */\n this.getVisibility = () => {\n return group.visible;\n }\n\n /**\n * Get the {THREE.Group} containing all child regions and their\n * primitives.\n *\n * @return {THREE.Group}\n */\n this.getGroup = () => {\n return group;\n }\n\n /**\n * Set the transformation with a {THREE.Matrix4} matrix, this will affect\n * all primitives in this and its child regions\n *\n * @param {THREE.Matrix4} transformation - The transformation matrix\n * used for the transformation.\n */\n this.setTransformation = transformation => {\n tMatrix.set(...transformation);\n group.matrix.copy(tMatrix);\n group.updateMatrixWorld();\n }\n\n /**\n * Set the name of this region.\n *\n * @param {String} nameIn - Name to be set for this region. It must be defined\n * and non-empty.\n */\n this.setName = (nameIn) => {\n if (nameIn && nameIn !== \"\") {\n name = nameIn;\n }\n }\n\n /**\n * Get the name of this region.\n *\n * @return {String}\n */\n this.getName = () => {\n return name;\n }\n\n /**\n * Get the parent region.\n *\n * @return {Region}\n */\n this.getParent = () => {\n return parent;\n }\n\n /**\n * Get the array of each hierarachy from the root region to this region.\n *\n * @return {Array}\n */\n this.getFullSeparatedPath = () => {\n const paths = [];\n if (name !== \"\") {\n paths.push(name);\n for (let p = parent; p !== undefined;) {\n const parentName = p.getName();\n if (parentName !== \"\") {\n paths.unshift(parentName);\n }\n p = p.getParent();\n }\n }\n return paths;\n }\n\n /**\n * Get the full paths from the root region to this region.\n *\n * @return {String}\n */\n this.getFullPath = () => {\n const paths = this.getFullSeparatedPath();\n if (paths.length > 0) {\n let fullPath = paths.shift();\n paths.forEach(path => {\n fullPath = fullPath.concat(\"/\", path);\n });\n return fullPath;\n }\n return \"\";\n }\n\n /**\n * Create a new child region with the provided name.\n * @param {String} nameIn - Name to be set for the new child region.\n *\n * @return {Region}\n */\n this.createChild = (nameIn) => {\n let childRegion = new Region(this, scene);\n childRegion.setName(nameIn);\n children.push(childRegion);\n group.add(childRegion.getGroup());\n return childRegion;\n }\n\n /**\n * Get the child region with matching childName.\n * @param {String} childName - Name to be matched.\n *\n * @return {Region}\n */\n this.getChildWithName = childName => {\n if (childName) {\n const lowerChildName = childName.toLowerCase();\n for (let i = 0; i < children.length; i++) {\n if (children[i].getName().toLowerCase() === lowerChildName)\n return children[i];\n }\n }\n return undefined;\n }\n\n /**\n * Find a child region using the path array.\n * @param {Array} pathArray - Array containing regions' name at each\n * hierarchy to match.\n *\n * @return {Region}\n */\n this.findChildFromSeparatedPath = pathArray => {\n if (pathArray && pathArray.length > 0) {\n if (pathArray[0] === \"\") {\n pathArray.shift();\n }\n }\n if (pathArray && pathArray.length > 0) {\n const childRegion = this.getChildWithName(pathArray[0]);\n if (childRegion) {\n pathArray.shift();\n return childRegion.findChildFromSeparatedPath(pathArray);\n } else {\n return undefined;\n }\n }\n return this;\n }\n\n /**\n * Find the region using the provided relative path.\n *\n * @param {String} path - Relative paths from this region\n * to the child region.\n *\n * @return {Region}\n */\n this.findChildFromPath = (path) => {\n const pathArray = path.split(\"/\");\n return this.findChildFromSeparatedPath(pathArray);\n }\n\n /**\n * Create a new child using the path array. All required new regions\n * down the path will be created.\n *\n * @param {Array} pathArray - Array containing regions' name, new regions\n * will be created along the path if not found.\n *\n * @return {Region}\n */\n this.createChildFromSeparatedPath = pathArray => {\n if (pathArray.length > 0) {\n if (pathArray[0] === \"\") {\n pathArray.shift();\n }\n }\n if (pathArray.length > 0) {\n let childRegion = this.getChildWithName(pathArray[0]);\n if (!childRegion) {\n childRegion = this.createChild(pathArray[0]);\n }\n pathArray.shift();\n return childRegion.createChildFromSeparatedPath(pathArray);\n }\n return this;\n }\n\n /**\n * Create a new child using the path. All required new regions\n * down the path will be created.\n *\n * @param {String} path - Relative paths from the region\n * to the child region.\n *\n * @return {Region}\n */\n this.createChildFromPath = (path) => {\n const pathArray = path.split(\"/\");\n return this.createChildFromSeparatedPath(pathArray);\n }\n\n\n /**\n * Return existing region if it exists, otherwise, create a new\n * region with the provided path.\n *\n * @param {String} path - Relative paths from the region\n * to the child region.\n *\n * @return {Region}\n */\n this.findOrCreateChildFromPath = (path) => {\n let childRegion = this.findChildFromPath(path);\n if (!childRegion) {\n childRegion = this.createChildFromPath(path);\n }\n return childRegion;\n }\n\n /**\n * Add a zinc object into this region, the morph will be added\n * to the group.\n *\n * @param {ZincObject} zincObject - Zinc object to be added into\n * this region.\n */\n this.addZincObject = zincObject => {\n if (zincObject) {\n zincObject.setRegion(this);\n group.add(zincObject.getGroup());\n zincObjects.push(zincObject);\n this.pickableUpdateRequired = true;\n if (scene) {\n scene.triggerObjectAddedCallback(zincObject);\n }\n }\n }\n\n\n /**\n * Remove a ZincObject from this region if it presents. This will eventually\n * destroy the object and free up the memory.\n *\n * @param {ZincObject} zincObject - object to be removed from this region.\n */\n this.removeZincObject = zincObject => {\n for (let i = 0; i < zincObjects.length; i++) {\n if (zincObject === zincObjects[i]) {\n group.remove(zincObject.getGroup());\n zincObjects.splice(i, 1);\n if (scene) {\n scene.triggerObjectRemovedCallback(zincObject);\n }\n zincObject.dispose();\n this.pickableUpdateRequired = true;\n return;\n }\n }\n }\n\n /**\n * Return true if pickable objects require an update.\n *\n * @param {Boolean} transverse - Check child regions as well\n * if this is set to true.\n *\n * @return {Boolean}\n */\n this.checkPickableUpdateRequred = (transverse) => {\n if (this.pickableUpdateRequired) return true;\n if (transverse) {\n let flag = false;\n for (let i = 0; i < children.length; i++) {\n flag = children[i].checkPickableUpdateRequred(transverse);\n if (flag) return true;\n }\n }\n return false;\n }\n\n /**\n * Get all pickable objects.\n */\n this.getPickableThreeJSObjects = (objectsList, transverse) => {\n if (group.visible) {\n zincObjects.forEach(zincObject => {\n if (zincObject.isPickable && zincObject.getGroup() && zincObject.getGroup().visible) {\n let marker = zincObject.marker;\n if (marker && marker.isEnabled()) {\n objectsList.push(marker.getMorph());\n }\n objectsList.push(zincObject.getGroup());\n }\n });\n if (transverse) {\n children.forEach(childRegion => {\n childRegion.getPickableThreeJSObjects(objectsList, transverse);\n });\n }\n this.pickableUpdateRequired = false;\n }\n return objectsList;\n }\n\n /**\n * Set the default duration value for all zinc objects\n * that are to be loaded into this region.\n *\n * @param {Number} durationIn - duration of the scene.\n */\n this.setDuration = durationIn => {\n duration = durationIn;\n zincObjects.forEach(zincObject => zincObject.setDuration(durationIn));\n children.forEach(childRegion => childRegion.setDuration(durationIn));\n }\n\n /**\n * Get the default duration value.\n * returns {Number}\n */\n this.getDuration = () => {\n return duration;\n }\n\n /**\n * Get the bounding box of all the object in this and child regions only.\n * Do not include the matrix transformation here, it is done at the primitives\n * level.\n *\n * @returns {THREE.Box3}\n */\n this.getBoundingBox = transverse => {\n let boundingBox1 = undefined, boundingBox2 = undefined;\n zincObjects.forEach(zincObject => {\n boundingBox2 = zincObject.getBoundingBox();\n if (boundingBox2) {\n if (boundingBox1 == undefined) {\n boundingBox1 = boundingBox2.clone();\n } else {\n boundingBox1.union(boundingBox2);\n }\n }\n });\n if (transverse) {\n children.forEach(childRegion => {\n boundingBox2 = childRegion.getBoundingBox(transverse);\n if (boundingBox2) {\n if (boundingBox1 == undefined) {\n boundingBox1 = boundingBox2.clone();\n } else {\n boundingBox1.union(boundingBox2);\n }\n }\n });\n }\n return boundingBox1;\n }\n\n /**\n * Clear and dispose all objects belong to this region.\n *\n * @param {Boolean} transverse - Clear and dispose child regions as well\n * if this is set to true.\n */\n this.clear = transverse => {\n if (transverse) {\n children.forEach(childRegion => childRegion.clear(transverse));\n }\n zincObjects.forEach(zincObject => {\n group.remove(zincObject.getGroup());\n zincObject.dispose();\n });\n children = [];\n zincObjects = [];\n }\n\n /**\n * Check if a zincObject is a member of this region.\n *\n * @param {ZincObject} zincObject - The ZincObject to be checked.\n * @param {Boolean} transverse - Also check the child regions.\n *\n * @return {Boolean}\n */\n this.objectIsInRegion = (zincObject, transverse) => {\n for (let i = 0; i < zincObjects.length; i++) {\n if (zincObject === zincObjects[i]) {\n return true;\n }\n }\n if (transverse) {\n for (let i = 0; i < children.length; i++) {\n if (children[i].objectIsInRegion(zincObject, transverse))\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * A function which iterates through the list of geometries and call the callback\n * function with the geometries as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the geometry\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachGeometry = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isGeometry)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachGeometry(\n callbackFunction, transverse));\n }\n\n /**\n * A function which iterates through the list of glyphsets and call the callback\n * function with the glyphset as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the glyphset\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachGlyphset = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isGlyphset)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachGlyphset(\n callbackFunction, transverse));\n }\n\n /**\n * A function which iterates through the list of pointsets and call the callback\n * function with the pointset as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the pointset\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachPointset = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isPointset)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachPointset(\n callbackFunction, transverse));\n }\n\n /**\n * A function which iterates through the list of lines and call the callback\n * function with the lines as the argument.\n *\n * @param {Function} callbackFunction - Callback function with the lines\n * as an argument.\n * @param {Boolean} transverse - Also perform the same callback function for\n * all child regions if this is set to be true.\n */\n this.forEachLine = (callbackFunction, transverse) => {\n zincObjects.forEach(zincObject => {\n if (zincObject.isLines)\n callbackFunction(zincObject);\n });\n if (transverse)\n children.forEach(childRegion => childRegion.forEachLine(\n callbackFunction, transverse));\n }\n\n this.findObjectsWithAnatomicalId = (anatomicalId, transverse) => {\n const objectsArray = [];\n zincObjects.forEach(zincObject => {\n if (zincObject.anatomicalId === anatomicalId)\n objectsArray.push(zincObject);\n });\n if (transverse) {\n children.forEach(childRegion => {\n let childObjects = childRegion.findObjectsWithAnatomicalId(anatomicalId, transverse);\n objectsArray.push(...childObjects);\n });\n }\n\n return objectsArray;\n }\n\n /**\n * Find and return all zinc objects in this and child regions with\n * the matching GroupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findObjectsWithGroupName = (groupName, transverse) => {\n const objectsArray = [];\n zincObjects.forEach(zincObject => {\n const lowerObjectName = zincObject.groupName ? zincObject.groupName.toLowerCase() : zincObject.groupName;\n const lowerGroupName = groupName ? groupName.toLowerCase() : groupName;\n if (lowerObjectName === lowerGroupName)\n objectsArray.push(zincObject);\n });\n if (transverse) {\n children.forEach(childRegion => {\n let childObjects = childRegion.findObjectsWithGroupName(groupName, transverse);\n objectsArray.push(...childObjects);\n });\n }\n return objectsArray;\n }\n\n /**\n * Find and return all geometries in this and child regions with\n * the matching GroupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findGeometriesWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const geometriesArray = primitivesArray.filter(primitive => primitive.isGeometry);\n return geometriesArray;\n }\n\n /**\n * Find and return all pointsets in this and child regions with\n * the matching groupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findPointsetsWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const pointsetsArray = primitivesArray.filter(primitive => primitive.isPointset);\n return pointsetsArray;\n }\n\n /**\n * Find and return all glyphsets in this and child regions with\n * the matching groupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findGlyphsetsWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const glyphsetsArray = primitivesArray.filter(primitive => primitive.isGlyphset);\n return glyphsetsArray;\n }\n\n /**\n * Find and return all lines in this and child regions with\n * the matching groupName.\n *\n * @param {String} groupName - Groupname to match with.\n * @param {Boolean} transverse - Also look for the object with groupName\n * in child regions if set to true.\n * @returns {Array}\n */\n this.findLinesWithGroupName = (groupName, transverse) => {\n const primitivesArray = this.findObjectsWithGroupName(groupName, transverse);\n const linesArray = primitivesArray.filter(primitive => primitive.isLines);\n return linesArray;\n }\n\n /**\n * Get all zinc objects in this region.\n *\n * @param {Boolean} transverse - Include zinc objects in child regions if this is\n * set to true.\n * @returns {Array}\n */\n this.getAllObjects = transverse => {\n const objectsArray = [...zincObjects];\n if (transverse) {\n children.forEach(childRegion => {\n let childObjects = childRegion.getAllObjects(transverse);\n objectsArray.push(...childObjects);\n });\n }\n return objectsArray;\n }\n\n /**\n * Get all child regions.\n *\n * @param {Boolean} transverse - Include all regions which are descendants of\n * this reigon when this is set to true.\n * @returns {Array}\n */\n this.getChildRegions = transverse => {\n const objectsArray = [...children];\n if (transverse) {\n children.forEach(childRegion => {\n const childObjects = childRegion.getChildRegions(transverse);\n objectsArray.push(...childObjects);\n });\n }\n return objectsArray;\n }\n\n /**\n * Get the current time of the region.\n * Return -1 if no graphics in the region.\n *\n * @return {Number}\n */\n this.getCurrentTime = () => {\n if (zincObjects[0] != undefined) {\n return zincObjects[0].getCurrentTime();\n } else {\n for (let i = 0; i < children.length; i++) {\n const time = children[i].getCurrentTime();\n if (time !== -1)\n return time;\n }\n }\n return -1;\n }\n\n /**\n * Set the current time of all the objects of this region.\n *\n * @param {Number} time - Value to set the time to.\n * @param {Boolean} transverse - Set the time for chidl regions if\n * this is set to true.\n */\n this.setMorphTime = (time, transverse) => {\n zincObjects.forEach(zincObject => {\n zincObject.setMorphTime(time);\n });\n if (transverse) {\n children.forEach(childRegion => {\n childRegion.setMorphTime(time);\n });\n }\n }\n\n /**\n * Check if any object in this region is time varying.\n *\n * @return {Boolean}\n */\n this.isTimeVarying = () => {\n for (let i = 0; i < zincObjects.length; i++) {\n if (zincObjects[i].isTimeVarying()) {\n return true;\n }\n }\n for (let i = 0; i < children.length; i++) {\n if (children[i].isTimeVarying()) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n * @private\n */\n this.renderGeometries = (playRate, delta, playAnimation, cameraControls, options, transverse) => {\n // Let video dictates the progress if one is present\n const allObjects = this.getAllObjects(transverse);\n allObjects.forEach(zincObject => {\n zincObject.render(playRate * delta, playAnimation, cameraControls, options);\n });\n //process markers visibility and size, as long as there are more than\n //one entry in markersList is greater than 1, markers have been enabled.\n if (options && (playAnimation === false) &&\n options.markerCluster?.markerUpdateRequired) {\n /**\n const markerDepths = Object.values(options.markersList)\n .map((marker) => marker.ndc.z);\n if (markerDepths.length > 1) {\n const min = Math.min(...markerDepths);\n const max = Math.max(...markerDepths);\n allObjects.forEach(zincObject => {\n zincObject.processMarkerVisual(min, max);\n });\n }\n */\n options.markerCluster.calculate();\n }\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n */\n this.createPoints = ( groupName, coords, labels, colour ) => {\n let isNew = false;\n const zincObjects = this.findObjectsWithGroupName(groupName, false);\n const index = zincObjects.findIndex((zincObject) => zincObject.isPointset);\n const pointset = index > -1 ? zincObjects[index] : new Pointset();\n pointset.addPoints(coords, labels, colour);\n if (index === -1) {\n pointset.setName(groupName);\n this.addZincObject(pointset);\n isNew = true;\n } else {\n this.pickableUpdateRequired = true;\n }\n return { zincObject: pointset, isNew };\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n */\n this.createLines = ( groupName, coords, colour ) => {\n let isNew = false;\n const zincObjects = this.findObjectsWithGroupName(groupName, false);\n const index = zincObjects.findIndex((zincObject) => zincObject.isLines);\n const lines = index > -1 ? zincObjects[index] : new Lines2();\n lines.addLines(coords, colour);\n if (index === -1) {\n lines.setName(groupName);\n this.addZincObject(lines);\n isNew = true;\n } else {\n this.pickableUpdateRequired = true;\n }\n return { zincObject: lines, isNew };\n }\n\n /**\n * Add a new geometry\n */\n this.createGeometryFromThreeJSGeometry = (\n groupName, geometry, colour, opacity, visibility, renderOrder) => {\n const zincGeometry = new Geometry();\n const material = new THREE.MeshPhongMaterial({\n color : colour,\n morphTargets : false,\n morphNormals : false,\n transparent : true,\n opacity : opacity,\n side : THREE.DoubleSide\n });\n zincGeometry.createMesh(\n geometry,\n material,\n {localTimeEnabled: false, localMorphColour: false,},\n );\n if (zincGeometry.getMorph()) {\n zincGeometry.setVisibility(false);\n zincGeometry.setName(groupName);\n zincGeometry.setRenderOrder(renderOrder);\n this.addZincObject(zincGeometry);\n return zincGeometry;\n }\n return undefined;\n }\n}\n\nexport { Region };\n","import {\n\tBufferAttribute,\n\tClampToEdgeWrapping,\n\tDoubleSide,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tMathUtils,\n\tMatrix4,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tPropertyBinding,\n\tRGBAFormat,\n\tRGBFormat,\n\tRepeatWrapping,\n\tScene,\n\tVector3\n} from 'three';\n\n\nclass GLTFExporter {\n\n\tconstructor() {\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFLightExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsUnlitExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsPBRSpecularGlossiness( writer );\n\n\t\t} );\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param {Scene or [THREE.Scenes]} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Object} options options\n\t */\n\tparse( input, onDone, options ) {\n\n\t\tconst writer = new GLTFWriter();\n\t\tconst plugins = [];\n\n\t\tfor ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {\n\n\t\t\tplugins.push( this.pluginCallbacks[ i ]( writer ) );\n\n\t\t}\n\n\t\twriter.setPlugins( plugins );\n\t\twriter.write( input, onDone, options );\n\n\t}\n\n}\n\n//------------------------------------------------------------------------------\n// Constants\n//------------------------------------------------------------------------------\n\nconst WEBGL_CONSTANTS = {\n\tPOINTS: 0x0000,\n\tLINES: 0x0001,\n\tLINE_LOOP: 0x0002,\n\tLINE_STRIP: 0x0003,\n\tTRIANGLES: 0x0004,\n\tTRIANGLE_STRIP: 0x0005,\n\tTRIANGLE_FAN: 0x0006,\n\n\tUNSIGNED_BYTE: 0x1401,\n\tUNSIGNED_SHORT: 0x1403,\n\tFLOAT: 0x1406,\n\tUNSIGNED_INT: 0x1405,\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst THREE_TO_WEBGL = {};\n\nTHREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nTHREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR;\nTHREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nTHREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;\nTHREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;\nTHREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n//------------------------------------------------------------------------------\n// Utility functions\n//------------------------------------------------------------------------------\n\n/**\n * Compare two arrays\n * @param {Array} array1 Array 1 to compare\n * @param {Array} array2 Array 2 to compare\n * @return {Boolean} Returns true if both arrays are equal\n */\nfunction equalArray( array1, array2 ) {\n\n\treturn ( array1.length === array2.length ) && array1.every( function ( element, index ) {\n\n\t\treturn element === array2[ index ];\n\n\t} );\n\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n * @param {string} text\n * @return {ArrayBuffer}\n */\nfunction stringToArrayBuffer( text ) {\n\n\tif ( window.TextEncoder !== undefined ) {\n\n\t\treturn new TextEncoder().encode( text ).buffer;\n\n\t}\n\n\tconst array = new Uint8Array( new ArrayBuffer( text.length ) );\n\n\tfor ( let i = 0, il = text.length; i < il; i ++ ) {\n\n\t\tconst value = text.charCodeAt( i );\n\n\t\t// Replacing multi-byte character with space(0x20).\n\t\tarray[ i ] = value > 0xFF ? 0x20 : value;\n\n\t}\n\n\treturn array.buffer;\n\n}\n\n/**\n * Is identity matrix\n *\n * @param {Matrix4} matrix\n * @returns {Boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix( matrix ) {\n\n\treturn equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );\n\n}\n\n/**\n * Get the min and max vectors from the given attribute\n * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count\n * @param {Integer} start\n * @param {Integer} count\n * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)\n */\nfunction getMinMax( attribute, start, count ) {\n\n\tconst output = {\n\n\t\tmin: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),\n\t\tmax: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )\n\n\t};\n\n\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\tlet value;\n\n\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t} else {\n\n\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t}\n\n\t\t\toutput.min[ a ] = Math.min( output.min[ a ], value );\n\t\t\toutput.max[ a ] = Math.max( output.max[ a ], value );\n\n\t\t}\n\n\t}\n\n\treturn output;\n\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @param {Integer} bufferSize The size the original buffer.\n * @returns {Integer} new buffer size with required padding.\n *\n */\nfunction getPaddedBufferSize( bufferSize ) {\n\n\treturn Math.ceil( bufferSize / 4 ) * 4;\n\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n *\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {Integer} paddingByte (Optional)\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {\n\n\tconst paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );\n\n\tif ( paddedLength !== arrayBuffer.byteLength ) {\n\n\t\tconst array = new Uint8Array( paddedLength );\n\t\tarray.set( new Uint8Array( arrayBuffer ) );\n\n\t\tif ( paddingByte !== 0 ) {\n\n\t\t\tfor ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {\n\n\t\t\t\tarray[ i ] = paddingByte;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn array.buffer;\n\n\t}\n\n\treturn arrayBuffer;\n\n}\n\nlet cachedCanvas = null;\n\n/**\n * Writer\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\t\tthis.extensionsUsed = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'THREE.GLTFExporter'\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tattributesNormalized: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t * @param {Scene or [THREE.Scenes]} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Object} options options\n\t */\n\twrite( input, onDone, options ) {\n\n\t\tthis.options = Object.assign( {}, {\n\t\t\t// default options\n\t\t\tbinary: false,\n\t\t\ttrs: false,\n\t\t\tonlyVisible: true,\n\t\t\ttruncateDrawRange: true,\n\t\t\tembedImages: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\tanimations: [],\n\t\t\tincludeCustomExtensions: false\n\t\t}, options );\n\n\t\tif ( this.options.animations.length > 0 ) {\n\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\n\t\t}\n\n\t\tthis.processInput( input );\n\n\t\tconst writer = this;\n\n\t\tPromise.all( this.pending ).then( function () {\n\n\t\t\tconst buffers = writer.buffers;\n\t\t\tconst json = writer.json;\n\t\t\tconst options = writer.options;\n\t\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\t\t// Merge buffers.\n\t\t\tconst blob = new Blob( buffers, { type: 'application/octet-stream' } );\n\n\t\t\t// Declare extensions.\n\t\t\tconst extensionsUsedList = Object.keys( extensionsUsed );\n\n\t\t\tif ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;\n\n\t\t\t// Update bytelength of the single buffer.\n\t\t\tif ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\t\tconst reader = new window.FileReader();\n\t\t\t\treader.readAsArrayBuffer( blob );\n\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\t// Binary chunk.\n\t\t\t\t\tconst binaryChunk = getPaddedArrayBuffer( reader.result );\n\t\t\t\t\tconst binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\t\tbinaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );\n\t\t\t\t\tbinaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );\n\n\t\t\t\t\t// JSON chunk.\n\t\t\t\t\tconst jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );\n\t\t\t\t\tconst jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\t\tjsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );\n\t\t\t\t\tjsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );\n\n\t\t\t\t\t// GLB header.\n\t\t\t\t\tconst header = new ArrayBuffer( GLB_HEADER_BYTES );\n\t\t\t\t\tconst headerView = new DataView( header );\n\t\t\t\t\theaderView.setUint32( 0, GLB_HEADER_MAGIC, true );\n\t\t\t\t\theaderView.setUint32( 4, GLB_VERSION, true );\n\t\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\t\theaderView.setUint32( 8, totalByteLength, true );\n\n\t\t\t\t\tconst glbBlob = new Blob( [\n\t\t\t\t\t\theader,\n\t\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\t\tjsonChunk,\n\t\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\t\tbinaryChunk\n\t\t\t\t\t], { type: 'application/octet-stream' } );\n\n\t\t\t\t\tconst glbReader = new window.FileReader();\n\t\t\t\t\tglbReader.readAsArrayBuffer( glbBlob );\n\t\t\t\t\tglbReader.onloadend = function () {\n\n\t\t\t\t\t\tonDone( glbReader.result );\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 ( json.buffers && json.buffers.length > 0 ) {\n\n\t\t\t\t\tconst reader = new window.FileReader();\n\t\t\t\t\treader.readAsDataURL( blob );\n\t\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\t\tjson.buffers[ 0 ].uri = base64data;\n\t\t\t\t\t\tonDone( json );\n\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tonDone( json );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t *\n\t * @param {THREE.Object3D|THREE.Material} object\n\t * @param {Object} objectDef\n\t */\n\tserializeUserData( object, objectDef ) {\n\n if (object.userData && object.userData.isZincObject) return;\n\n\t\tif ( Object.keys( object.userData ).length === 0 ) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\ttry {\n\n\t\t\tconst json = JSON.parse( JSON.stringify( object.userData ) );\n\n\t\t\tif ( options.includeCustomExtensions && json.gltfExtensions ) {\n\n\t\t\t\tif ( objectDef.extensions === undefined ) objectDef.extensions = {};\n\n\t\t\t\tfor ( const extensionName in json.gltfExtensions ) {\n\n\t\t\t\t\tobjectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];\n\t\t\t\t\textensionsUsed[ extensionName ] = true;\n\n\t\t\t\t}\n\n\t\t\t\tdelete json.gltfExtensions;\n\n\t\t\t}\n\n\t\t\tif ( Object.keys( json ).length > 0 ) objectDef.extras = json;\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: userData of \\'' + object.name + '\\' ' +\n\t\t\t\t'won\\'t be serialized because of JSON.stringify error - ' + error.message );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Assign and return a temporal unique id for an object\n\t * especially which doesn't have .uuid\n\t * @param {Object} object\n\t * @return {Integer}\n\t */\n\tgetUID( object ) {\n\n\t\tif ( ! this.uids.has( object ) ) this.uids.set( object, this.uid ++ );\n\n\t\treturn this.uids.get( object );\n\n\t}\n\n\t/**\n\t * Checks if normal attribute values are normalized.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {Boolean}\n\t */\n\tisNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) ) return false;\n\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = normal.count; i < il; i ++ ) {\n\n\t\t\t// 0.0005 is from glTF-validator\n\t\t\tif ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Creates normalized normal buffer attribute.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {BufferAttribute}\n\t *\n\t */\n\tcreateNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) )\treturn cache.attributesNormalized.get( normal );\n\n\t\tconst attribute = normal.clone();\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tv.fromBufferAttribute( attribute, i );\n\n\t\t\tif ( v.x === 0 && v.y === 0 && v.z === 0 ) {\n\n\t\t\t\t// if values can't be normalized set (1, 0, 0)\n\t\t\t\tv.setX( 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.normalize();\n\n\t\t\t}\n\n\t\t\tattribute.setXYZ( i, v.x, v.y, v.z );\n\n\t\t}\n\n\t\tcache.attributesNormalized.set( normal, attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Applies a texture transform, if present, to the map definition. Requires\n\t * the KHR_texture_transform extension.\n\t *\n\t * @param {Object} mapDef\n\t * @param {THREE.Texture} texture\n\t */\n\tapplyTextureTransform( mapDef, texture ) {\n\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tif ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {\n\n\t\t\ttransformDef.offset = texture.offset.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.rotation !== 0 ) {\n\n\t\t\ttransformDef.rotation = texture.rotation;\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {\n\n\t\t\ttransformDef.scale = texture.repeat.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( didTransform ) {\n\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions[ 'KHR_texture_transform' ] = transformDef;\n\t\t\tthis.extensionsUsed[ 'KHR_texture_transform' ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param {ArrayBuffer} buffer\n\t * @return {Integer}\n\t */\n\tprocessBuffer( buffer ) {\n\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push( buffer );\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param {BufferAttribute} attribute\n\t * @param {number} componentType\n\t * @param {number} start\n\t * @param {number} count\n\t * @param {number} target (Optional) Target usage of the BufferView\n\t * @return {Object}\n\t */\n\tprocessBufferView( attribute, componentType, start, count, target ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tif ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\tcomponentSize = 1;\n\n\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\tcomponentSize = 2;\n\n\t\t} else {\n\n\t\t\tcomponentSize = 4;\n\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize( count * attribute.itemSize * componentSize );\n\t\tconst dataView = new DataView( new ArrayBuffer( byteLength ) );\n\t\tlet offset = 0;\n\n\t\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( componentType === WEBGL_CONSTANTS.FLOAT ) {\n\n\t\t\t\t\tdataView.setFloat32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {\n\n\t\t\t\t\tdataView.setUint32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\t\t\tdataView.setUint16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\t\t\tdataView.setUint8( offset, value );\n\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bufferViewDef = {\n\n\t\t\tbuffer: this.processBuffer( dataView.buffer ),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\n\t\t};\n\n\t\tif ( target !== undefined ) bufferViewDef.target = target;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = attribute.itemSize * componentSize;\n\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tjson.bufferViews.push( bufferViewDef );\n\n\t\t// @TODO Merge bufferViews where possible.\n\t\tconst output = {\n\n\t\t\tid: json.bufferViews.length - 1,\n\t\t\tbyteLength: 0\n\n\t\t};\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @return {Promise<Integer>}\n\t */\n\tprocessBufferViewImage( blob ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\treturn new Promise( function ( resolve ) {\n\n\t\t\tconst reader = new window.FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\tconst buffer = getPaddedArrayBuffer( reader.result );\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve( json.bufferViews.push( bufferViewDef ) - 1 );\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param {BufferAttribute} attribute Attribute to process\n\t * @param {THREE.BufferGeometry} geometry (Optional) Geometry used for truncated draw range\n\t * @param {Integer} start (Optional)\n\t * @param {Integer} count (Optional)\n\t * @return {Integer|null} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor( attribute, geometry, start, count ) {\n\n\t\tconst options = this.options;\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t16: 'MAT4'\n\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array (float, uint or ushort)\n\t\tif ( attribute.array.constructor === Float32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.FLOAT;\n\n\t\t} else if ( attribute.array.constructor === Uint32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_INT;\n\n\t\t} else if ( attribute.array.constructor === Uint16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;\n\n\t\t} else if ( attribute.array.constructor === Uint8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type.' );\n\n\t\t}\n\n\t\tif ( start === undefined ) start = 0;\n\t\tif ( count === undefined ) count = attribute.count;\n\n\t\t// @TODO Indexed buffer geometry with drawRange not supported yet\n\t\tif ( options.truncateDrawRange && geometry !== undefined && geometry.index === null ) {\n\n\t\t\tconst end = start + count;\n\t\t\tconst end2 = geometry.drawRange.count === Infinity\n\t\t\t\t? attribute.count\n\t\t\t\t: geometry.drawRange.start + geometry.drawRange.count;\n\n\t\t\tstart = Math.max( start, geometry.drawRange.start );\n\t\t\tcount = Math.min( end, end2 ) - start;\n\n\t\t\tif ( count < 0 ) count = 0;\n\n\t\t}\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif ( count === 0 ) return null;\n\n\t\tconst minMax = getMinMax( attribute, start, count );\n\t\tlet bufferViewTarget;\n\n\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t// animation samplers, target must not be set.\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tbufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;\n\n\t\t}\n\n\t\tconst bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );\n\n\t\tconst accessorDef = {\n\n\t\t\tbufferView: bufferView.id,\n\t\t\tbyteOffset: bufferView.byteOffset,\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[ attribute.itemSize ]\n\n\t\t};\n\n\t\tif ( attribute.normalized === true ) accessorDef.normalized = true;\n\t\tif ( ! json.accessors ) json.accessors = [];\n\n\t\treturn json.accessors.push( accessorDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process image\n\t * @param {Image} image to process\n\t * @param {Integer} format of the image (e.g. RGBFormat, RGBAFormat etc)\n\t * @param {Boolean} flipY before writing out the image\n\t * @return {Integer} Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage( image, format, flipY ) {\n\n\t\tconst writer = this;\n\t\tconst cache = writer.cache;\n\t\tconst json = writer.json;\n\t\tconst options = writer.options;\n\t\tconst pending = writer.pending;\n\n\t\tif ( ! cache.images.has( image ) ) cache.images.set( image, {} );\n\n\t\tconst cachedImages = cache.images.get( image );\n\t\tconst mimeType = format === RGBAFormat ? 'image/png' : 'image/jpeg';\n\t\tconst key = mimeType + ':flipY/' + flipY.toString();\n\n\t\tif ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];\n\n\t\tif ( ! json.images ) json.images = [];\n\n\t\tconst imageDef = { mimeType: mimeType };\n\n\t\tif ( options.embedImages ) {\n\n\t\t\tconst canvas = cachedCanvas = cachedCanvas || document.createElement( 'canvas' );\n\n\t\t\tcanvas.width = Math.min( image.width, options.maxTextureSize );\n\t\t\tcanvas.height = Math.min( image.height, options.maxTextureSize );\n\n\t\t\tconst ctx = canvas.getContext( '2d' );\n\n\t\t\tif ( flipY === true ) {\n\n\t\t\t\tctx.translate( 0, canvas.height );\n\t\t\t\tctx.scale( 1, - 1 );\n\n\t\t\t}\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 OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tctx.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t} else {\n\n\t\t\t\tif ( format !== RGBAFormat && format !== RGBFormat ) {\n\n\t\t\t\t\tconsole.error( 'GLTFExporter: Only RGB and RGBA formats are supported.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {\n\n\t\t\t\t\tconsole.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );\n\n\t\t\t\t}\n\n\t\t\t\tconst data = new Uint8ClampedArray( image.height * image.width * 4 );\n\n\t\t\t\tif ( format === RGBAFormat ) {\n\n\t\t\t\t\tfor ( let i = 0; i < data.length; i += 4 ) {\n\n\t\t\t\t\t\tdata[ i + 0 ] = image.data[ i + 0 ];\n\t\t\t\t\t\tdata[ i + 1 ] = image.data[ i + 1 ];\n\t\t\t\t\t\tdata[ i + 2 ] = image.data[ i + 2 ];\n\t\t\t\t\t\tdata[ i + 3 ] = image.data[ i + 3 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let i = 0, j = 0; i < data.length; i += 4, j += 3 ) {\n\n\t\t\t\t\t\tdata[ i + 0 ] = image.data[ j + 0 ];\n\t\t\t\t\t\tdata[ i + 1 ] = image.data[ j + 1 ];\n\t\t\t\t\t\tdata[ i + 2 ] = image.data[ j + 2 ];\n\t\t\t\t\t\tdata[ i + 3 ] = 255;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\tpending.push( new Promise( function ( resolve ) {\n\n\t\t\t\t\tcanvas.toBlob( function ( blob ) {\n\n\t\t\t\t\t\twriter.processBufferViewImage( blob ).then( function ( bufferViewIndex ) {\n\n\t\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\t\t\t\t\t\t\tresolve();\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}, mimeType );\n\n\t\t\t\t} ) );\n\n\t\t\t} else {\n\n\t\t\t\timageDef.uri = canvas.toDataURL( mimeType );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\timageDef.uri = image.src;\n\n\t\t}\n\n\t\tconst index = json.images.push( imageDef ) - 1;\n\t\tcachedImages[ key ] = index;\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param {Texture} map Texture to process\n\t * @return {Integer} Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler( map ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.samplers ) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: THREE_TO_WEBGL[ map.magFilter ],\n\t\t\tminFilter: THREE_TO_WEBGL[ map.minFilter ],\n\t\t\twrapS: THREE_TO_WEBGL[ map.wrapS ],\n\t\t\twrapT: THREE_TO_WEBGL[ map.wrapT ]\n\t\t};\n\n\t\treturn json.samplers.push( samplerDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process texture\n\t * @param {Texture} map Map to process\n\t * @return {Integer} Index of the processed texture in the \"textures\" array\n\t */\n\tprocessTexture( map ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.textures.has( map ) ) return cache.textures.get( map );\n\n\t\tif ( ! json.textures ) json.textures = [];\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler( map ),\n\t\t\tsource: this.processImage( map.image, map.format, map.flipY )\n\t\t};\n\n\t\tif ( map.name ) textureDef.name = map.name;\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeTexture && ext.writeTexture( map, textureDef );\n\n\t\t} );\n\n\t\tconst index = json.textures.push( textureDef ) - 1;\n\t\tcache.textures.set( map, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process material\n\t * @param {THREE.Material} material Material to process\n\t * @return {Integer|null} Index of the processed material in the \"materials\" array\n\t */\n\tprocessMaterial( material ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.materials.has( material ) ) return cache.materials.get( material );\n\n\t\tif ( material.isShaderMaterial ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( ! json.materials ) json.materials = [];\n\n\t\t// @QUESTION Should we avoid including any attribute that has the default value?\n\t\tconst materialDef = {\tpbrMetallicRoughness: {} };\n\n\t\tif ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.color.toArray().concat( [ material.opacity ] );\n\n\t\tif ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\n\t\t}\n\n\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;\n\n\t\t} else {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.5;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.5;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif ( material.metalnessMap || material.roughnessMap ) {\n\n\t\t\tif ( material.metalnessMap === material.roughnessMap ) {\n\n\t\t\t\tconst metalRoughMapDef = { index: this.processTexture( material.metalnessMap ) };\n\t\t\t\tthis.applyTextureTransform( metalRoughMapDef, material.metalnessMap );\n\t\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Ignoring metalnessMap and roughnessMap because they are not the same Texture.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture or pbrSpecularGlossiness diffuseTexture\n\t\tif ( material.map ) {\n\n\t\t\tconst baseColorMapDef = { index: this.processTexture( material.map ) };\n\t\t\tthis.applyTextureTransform( baseColorMapDef, material.map );\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\t// note: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see #21849 and #22000.\n\t\t\tconst emissive = material.emissive.clone().multiplyScalar( material.emissiveIntensity );\n\t\t\tconst maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );\n\n\t\t\tif ( maxEmissiveComponent > 1 ) {\n\n\t\t\t\temissive.multiplyScalar( 1 / maxEmissiveComponent );\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited' );\n\n\t\t\t}\n\n\t\t\tif ( maxEmissiveComponent > 0 ) {\n\n\t\t\t\tmaterialDef.emissiveFactor = emissive.toArray();\n\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tconst emissiveMapDef = { index: this.processTexture( material.emissiveMap ) };\n\t\t\t\tthis.applyTextureTransform( emissiveMapDef, material.emissiveMap );\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalTexture\n\t\tif ( material.normalMap ) {\n\n\t\t\tconst normalMapDef = { index: this.processTexture( material.normalMap ) };\n\n\t\t\tif ( material.normalScale && material.normalScale.x !== - 1 ) {\n\n\t\t\t\tif ( material.normalScale.x !== material.normalScale.y ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Normal scale components are different, ignoring Y and exporting X.' );\n\n\t\t\t\t}\n\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( normalMapDef, material.normalMap );\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif ( material.aoMap ) {\n\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: this.processTexture( material.aoMap ),\n\t\t\t\ttexCoord: 1\n\t\t\t};\n\n\t\t\tif ( material.aoMapIntensity !== 1.0 ) {\n\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( occlusionMapDef, material.aoMap );\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\n\t\t}\n\n\t\t// alphaMode\n\t\tif ( material.transparent ) {\n\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\n\t\t} else {\n\n\t\t\tif ( material.alphaTest > 0.0 ) {\n\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// doubleSided\n\t\tif ( material.side === DoubleSide ) materialDef.doubleSided = true;\n\t\tif ( material.name !== '' ) materialDef.name = material.name;\n\n\t\tthis.serializeUserData( material, materialDef );\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMaterial && ext.writeMaterial( material, materialDef );\n\n\t\t} );\n\n\t\tconst index = json.materials.push( materialDef ) - 1;\n\t\tcache.materials.set( material, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param {THREE.Mesh} mesh Mesh to process\n\t * @return {Integer|null} Index of the processed mesh in the \"meshes\" array\n\t */\n\tprocessMesh( mesh ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [ mesh.geometry.uuid ];\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tfor ( let i = 0, l = mesh.material.length; i < l; i ++ ) {\n\n\t\t\t\tmeshCacheKeyParts.push( mesh.material[ i ].uuid\t);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmeshCacheKeyParts.push( mesh.material.uuid );\n\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join( ':' );\n\n\t\tif ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet mode;\n\n\t\t// Use the correct mode\n\t\tif ( mesh.isLineSegments ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINES;\n\n\t\t} else if ( mesh.isLineLoop ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_LOOP;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_STRIP;\n\n\t\t} else if ( mesh.isPoints ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.POINTS;\n\n\t\t} else {\n\n\t\t\tmode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;\n\n\t\t}\n\n\t\tif ( geometry.isBufferGeometry !== true ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Geometry is not of type THREE.BufferGeometry.' );\n\n\t\t}\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\t// Conversion between attributes names in threejs and gltf spec\n\t\tconst nameConversion = {\n\t\t\tuv: 'TEXCOORD_0',\n\t\t\tuv2: 'TEXCOORD_1',\n\t\t\tcolor: 'COLOR_0',\n\t\t\tskinWeight: 'WEIGHTS_0',\n\t\t\tskinIndex: 'JOINTS_0'\n\t\t};\n\n\t\tconst originalNormal = geometry.getAttribute( 'normal' );\n\n\t\tif ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );\n\n\t\t\tgeometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );\n\n\t\t}\n\n\t\t// @QUESTION Detect if .vertexColors = true?\n\t\t// For every attribute create an accessor\n\t\tlet modifiedAttribute = null;\n\n\t\tfor ( let attributeName in geometry.attributes ) {\n\n\t\t\t// Ignore morph target attributes, which are exported later.\n\t\t\tif ( attributeName.substr( 0, 5 ) === 'morph' ) continue;\n\n\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\tattributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();\n\n\t\t\t// Prefix all geometry attributes except the ones specifically\n\t\t\t// listed in the spec; non-spec attributes are considered custom.\n\t\t\tconst validVertexAttributes =\n\t\t\t\t\t/^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\n\t\t\tif ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;\n\n\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\tattributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT.\n\t\t\tmodifiedAttribute = null;\n\t\t\tconst array = attribute.array;\n\n\t\t\tif ( attributeName === 'JOINTS_0' &&\n\t\t\t\t! ( array instanceof Uint16Array ) &&\n\t\t\t\t! ( array instanceof Uint8Array ) ) {\n\n\t\t\t\tconsole.warn( 'GLTFExporter: Attribute \"skinIndex\" converted to type UNSIGNED_SHORT.' );\n\t\t\t\tmodifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tconst accessor = this.processAccessor( modifiedAttribute || attribute, geometry );\n\n\t\t\tif ( accessor !== null ) {\n\n\t\t\t\tattributes[ attributeName ] = accessor;\n\t\t\t\tcache.attributes.set( this.getUID( attribute ), accessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal );\n\n\t\t// Skip if no exportable attributes found\n\t\tif ( Object.keys( attributes ).length === 0 ) return null;\n\n\t\t// Morph targets\n\t\tif ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {\n\n\t\t\tconst weights = [];\n\t\t\tconst targetNames = [];\n\t\t\tconst reverseDictionary = {};\n\n\t\t\tif ( mesh.morphTargetDictionary !== undefined ) {\n\n\t\t\t\tfor ( const key in mesh.morphTargetDictionary ) {\n\n\t\t\t\t\treverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {\n\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor ( const attributeName in geometry.morphAttributes ) {\n\n\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// Three.js doesn't support TANGENT yet.\n\n\t\t\t\t\tif ( attributeName !== 'position' && attributeName !== 'normal' && attributeName !== 'color' ) {\n\n\t\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );\n\t\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[ attributeName ][ i ];\n\t\t\t\t\tlet gltfAttributeName = attributeName.toUpperCase();\n\n if ( nameConversion[ attributeName ] ) {\n\n gltfAttributeName = nameConversion[ attributeName ];\n\n }\n\n\t\t\t\t\t// Three.js morph attribute has absolute values while the one of glTF has relative values.\n\t\t\t\t\t//\n\t\t\t\t\t// glTF 2.0 Specification:\n\t\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\t\t\tconst baseAttribute = geometry.attributes[ attributeName ];\n\n\t\t\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\t\t\ttarget[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clones attribute not to override\n\t\t\t\t\tconst relativeAttribute = baseAttribute.clone();\n\n\t\t\t\t\tif ( ! geometry.morphTargetsRelative ) {\n\n if (baseAttribute) {\n\n for ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n if (baseAttribute.count > j) {\n\n relativeAttribute.setXYZ(\n j,\n attribute.getX( j ) - baseAttribute.getX( j ),\n attribute.getY( j ) - baseAttribute.getY( j ),\n attribute.getZ( j ) - baseAttribute.getZ( j )\n );\n\n }\n\n }\n\n } else {\n\n for ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n relativeAttribute.setXYZ(\n j,\n 0,\n 0,\n 0\n );\n\n }\n\n }\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );\n\t\t\t\t\tcache.attributes.set( this.getUID( baseAttribute ), target[ gltfAttributeName ] );\n\n\t\t\t\t}\n\n\t\t\t\ttargets.push( target );\n\n\t\t\t\tweights.push( mesh.morphTargetInfluences[ i ] );\n\n\t\t\t\tif ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );\n\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\n\t\t\tif ( targetNames.length > 0 ) {\n\n\t\t\t\tmeshDef.extras = {};\n\t\t\t\tmeshDef.extras.targetNames = targetNames;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray( mesh.material );\n\n\t\tif ( isMultiMaterial && geometry.groups.length === 0 ) return null;\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [ mesh.material ];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ];\n\n\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes,\n\t\t\t};\n\n\t\t\tthis.serializeUserData( geometry, primitive );\n\n\t\t\tif ( targets.length > 0 ) primitive.targets = targets;\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tlet cacheKey = this.getUID( geometry.index );\n\n\t\t\t\tif ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {\n\n\t\t\t\t\tcacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cache.attributes.has( cacheKey ) ) {\n\n\t\t\t\t\tprimitive.indices = cache.attributes.get( cacheKey );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprimitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );\n\t\t\t\t\tcache.attributes.set( cacheKey, primitive.indices );\n\n\t\t\t\t}\n\n\t\t\t\tif ( primitive.indices === null ) delete primitive.indices;\n\n\t\t\t}\n\n\t\t\tconst material = this.processMaterial( materials[ groups[ i ].materialIndex ] );\n\n\t\t\tif ( material !== null ) primitive.material = material;\n\n\t\t\tprimitives.push( primitive );\n\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif ( ! json.meshes ) json.meshes = [];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeMesh && ext.writeMesh( mesh, meshDef );\n\n\t\t} );\n\n\t\tconst index = json.meshes.push( meshDef ) - 1;\n\t\tcache.meshes.set( meshCacheKey, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process camera\n\t * @param {THREE.Camera} camera Camera to process\n\t * @return {Integer} Index of the processed mesh in the \"camera\" array\n\t */\n\tprocessCamera( camera ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.cameras ) json.cameras = [];\n\n\t\tconst isOrtho = camera.isOrthographicCamera;\n\n\t\tconst cameraDef = {\n\t\t\ttype: isOrtho ? 'orthographic' : 'perspective'\n\t\t};\n\n\t\tif ( isOrtho ) {\n\n\t\t\tcameraDef.orthographic = {\n\t\t\t\txmag: camera.right * 2,\n\t\t\t\tymag: camera.top * 2,\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tcameraDef.perspective = {\n\t\t\t\taspectRatio: camera.aspect,\n\t\t\t\tyfov: MathUtils.degToRad( camera.fov ),\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t}\n\n\t\t// Question: Is saving \"type\" as name intentional?\n\t\tif ( camera.name !== '' ) cameraDef.name = camera.type;\n\n\t\treturn json.cameras.push( cameraDef ) - 1;\n\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t *\n\t * @param {THREE.AnimationClip} clip\n\t * @param {THREE.Object3D} root\n\t * @return {number|null}\n\t */\n\tprocessAnimation( clip, root ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.animations ) json.animations = [];\n\n\t\tclip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor ( let i = 0; i < tracks.length; ++ i ) {\n\n\t\t\tconst track = tracks[ i ];\n\t\t\tconst trackBinding = PropertyBinding.parseTrackName( track.name );\n\t\t\tlet trackNode = PropertyBinding.findNode( root, trackBinding.nodeName );\n\t\t\tconst trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];\n\n\t\t\tif ( trackBinding.objectName === 'bones' ) {\n\n\t\t\t\tif ( trackNode.isSkinnedMesh === true ) {\n\n\t\t\t\t\ttrackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttrackNode = undefined;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! trackNode || ! trackProperty ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation track \"%s\".', track.name );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.values.length / track.times.length;\n\n\t\t\tif ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {\n\n\t\t\t\toutputItemSize /= trackNode.morphTargetInfluences.length;\n\n\t\t\t}\n\n\t\t\tlet interpolation;\n\n\t\t\t// @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE\n\n\t\t\t// Detecting glTF cubic spline interpolant by checking factory method's special property\n\t\t\t// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return\n\t\t\t// valid value from .getInterpolation().\n\t\t\tif ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {\n\n\t\t\t\tinterpolation = 'CUBICSPLINE';\n\n\t\t\t\t// itemSize of CUBICSPLINE keyframe is 9\n\t\t\t\t// (VEC3 * 3: inTangent, splineVertex, and outTangent)\n\t\t\t\t// but needs to be stored as VEC3 so dividing by 3 here.\n\t\t\t\toutputItemSize /= 3;\n\n\t\t\t} else if ( track.getInterpolation() === InterpolateDiscrete ) {\n\n\t\t\t\tinterpolation = 'STEP';\n\n\t\t\t} else {\n\n\t\t\t\tinterpolation = 'LINEAR';\n\n\t\t\t}\n\n\t\t\tsamplers.push( {\n\t\t\t\tinput: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ),\n\t\t\t\toutput: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ),\n\t\t\t\tinterpolation: interpolation\n\t\t\t} );\n\n\t\t\tchannels.push( {\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get( trackNode ),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tjson.animations.push( {\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t} );\n\n\t\treturn json.animations.length - 1;\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D} object\n\t * @return {number|null}\n\t */\n\t processSkin( object ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[ nodeMap.get( object ) ];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif ( skeleton === undefined ) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[ 0 ];\n\n\t\tif ( rootJoint === undefined ) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor ( let i = 0; i < skeleton.bones.length; ++ i ) {\n\n\t\t\tjoints.push( nodeMap.get( skeleton.bones[ i ] ) );\n\t\t\ttemporaryBoneInverse.copy( skeleton.boneInverses[ i ] );\n\t\t\ttemporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( json.skins === undefined ) json.skins = [];\n\n\t\tjson.skins.push( {\n\t\t\tinverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get( rootJoint )\n\t\t} );\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param {THREE.Object3D} node Object3D to processNode\n\t * @return {Integer} Index of the node in the nodes list\n\t */\n\tprocessNode( object ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.nodes ) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif ( options.trs ) {\n\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {\n\n\t\t\t\tnodeDef.rotation = rotation;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( position, [ 0, 0, 0 ] ) ) {\n\n\t\t\t\tnodeDef.translation = position;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {\n\n\t\t\t\tnodeDef.scale = scale;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( object.matrixAutoUpdate ) {\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t}\n\n\t\t\tif ( isIdentityMatrix( object.matrix ) === false ) {\n\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// We don't export empty strings name because it represents no-name in Three.js.\n\t\tif ( object.name !== '' ) nodeDef.name = String( object.name );\n\n\t\tthis.serializeUserData( object, nodeDef );\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tconst meshIndex = this.processMesh( object );\n\n\t\t\tif ( meshIndex !== null ) nodeDef.mesh = meshIndex;\n\n\t\t} else if ( object.isCamera ) {\n\n\t\t\tnodeDef.camera = this.processCamera( object );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) this.skins.push( object );\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tconst children = [];\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = object.children[ i ];\n\n\t\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\t\tif ( nodeIndex !== null ) children.push( nodeIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( children.length > 0 ) nodeDef.children = children;\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.writeNode && ext.writeNode( object, nodeDef );\n\n\t\t} );\n\n\t\tconst nodeIndex = json.nodes.push( nodeDef ) - 1;\n\t\tnodeMap.set( object, nodeIndex );\n\t\treturn nodeIndex;\n\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param {Scene} node Scene to process\n\t */\n\tprocessScene( scene ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! json.scenes ) {\n\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif ( scene.name !== '' ) sceneDef.name = scene.name;\n\n\t\tjson.scenes.push( sceneDef );\n\n\t\tconst nodes = [];\n\n\t\tfor ( let i = 0, l = scene.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = scene.children[ i ];\n\n\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\tconst nodeIndex = this.processNode( child );\n\n\t\t\t\tif ( nodeIndex !== null ) nodes.push( nodeIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( nodes.length > 0 ) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData( scene, sceneDef );\n\n\t}\n\n\t/**\n\t * Creates a Scene to hold a list of objects and parse it\n\t * @param {Array} objects List of objects to process\n\t */\n\tprocessObjects( objects ) {\n\n\t\tconst scene = new Scene();\n\t\tscene.name = 'AuxScene';\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t// modify the .parent and break its original scene and hierarchy\n\t\t\tscene.children.push( objects[ i ] );\n\n\t\t}\n\n\t\tthis.processScene( scene );\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|Array<THREE.Object3D>} input\n\t */\n\tprocessInput( input ) {\n\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [ input ];\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.beforeParse && ext.beforeParse( input );\n\n\t\t} );\n\n\t\tconst objectsWithoutScene = [];\n\n\t\tfor ( let i = 0; i < input.length; i ++ ) {\n\n\t\t\tif ( input[ i ] instanceof Scene ) {\n\n\t\t\t\tthis.processScene( input[ i ] );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsWithoutScene.push( input[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsWithoutScene.length > 0 ) this.processObjects( objectsWithoutScene );\n\n\t\tfor ( let i = 0; i < this.skins.length; ++ i ) {\n\n\t\t\tthis.processSkin( this.skins[ i ] );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < options.animations.length; ++ i ) {\n\n\t\t\tthis.processAnimation( options.animations[ i ].clip, options.animations[i].mesh);\n\n\t\t}\n\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\text.afterParse && ext.afterParse( input );\n\n\t\t} );\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tfor ( let i = 0, il = this.plugins.length; i < il; i ++ ) {\n\n\t\t\tfunc( this.plugins[ i ] );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\n\t}\n\n\twriteNode( light, nodeDef ) {\n\n\t\tif ( ! light.isLight ) return;\n\n\t\tif ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif ( light.name ) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif ( light.isDirectionalLight ) {\n\n\t\t\tlightDef.type = 'directional';\n\n\t\t} else if ( light.isPointLight ) {\n\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t} else if ( light.isSpotLight ) {\n\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = ( light.penumbra - 1.0 ) * light.angle * - 1.0;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\n\t\t}\n\n\t\tif ( light.decay !== undefined && light.decay !== 2 ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.' );\n\n\t\t}\n\n\t\tif ( light.target\n\t\t\t\t&& ( light.target.parent !== light\n\t\t\t\t|| light.target.position.x !== 0\n\t\t\t\t|| light.target.position.y !== 0\n\t\t\t\t|| light.target.position.z !== - 1 ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, '\n\t\t\t\t+ 'make light.target a child of the light with position 0,0,-1.' );\n\n\t\t}\n\n\t\tif ( ! extensionsUsed[ this.name ] ) {\n\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[ this.name ] = { lights: [] };\n\t\t\textensionsUsed[ this.name ] = true;\n\n\t\t}\n\n\t\tconst lights = json.extensions[ this.name ].lights;\n\t\tlights.push( lightDef );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { light: lights.length - 1 };\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isMeshBasicMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = {};\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\n\n\t}\n\n}\n\n/**\n * Specular-Glossiness Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n */\nclass GLTFMaterialsPBRSpecularGlossiness {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_pbrSpecularGlossiness';\n\n\t}\n\n\twriteMaterial( material, materialDef ) {\n\n\t\tif ( ! material.isGLTFSpecularGlossinessMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( materialDef.pbrMetallicRoughness.baseColorFactor ) {\n\n\t\t\textensionDef.diffuseFactor = materialDef.pbrMetallicRoughness.baseColorFactor;\n\n\t\t}\n\n\t\tconst specularFactor = [ 1, 1, 1 ];\n\t\tmaterial.specular.toArray( specularFactor, 0 );\n\t\textensionDef.specularFactor = specularFactor;\n\t\textensionDef.glossinessFactor = material.glossiness;\n\n\t\tif ( materialDef.pbrMetallicRoughness.baseColorTexture ) {\n\n\t\t\textensionDef.diffuseTexture = materialDef.pbrMetallicRoughness.baseColorTexture;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tconst specularMapDef = { index: writer.processTexture( material.specularMap ) };\n\t\t\twriter.applyTextureTransform( specularMapDef, material.specularMap );\n\t\t\textensionDef.specularGlossinessTexture = specularMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Static utility functions\n */\nGLTFExporter.Utils = {\n\n\tinsertKeyframe: function ( track, time ) {\n\n\t\tconst tolerance = 0.001; // 1ms\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = new track.TimeBufferType( track.times.length + 1 );\n\t\tconst values = new track.ValueBufferType( track.values.length + valueSize );\n\t\tconst interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );\n\n\t\tlet index;\n\n\t\tif ( track.times.length === 0 ) {\n\n\t\t\ttimes[ 0 ] = time;\n\n\t\t\tfor ( let i = 0; i < valueSize; i ++ ) {\n\n\t\t\t\tvalues[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time < track.times[ 0 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;\n\n\t\t\ttimes[ 0 ] = time;\n\t\t\ttimes.set( track.times, 1 );\n\n\t\t\tvalues.set( interpolant.evaluate( time ), 0 );\n\t\t\tvalues.set( track.values, valueSize );\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time > track.times[ track.times.length - 1 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {\n\n\t\t\t\treturn track.times.length - 1;\n\n\t\t\t}\n\n\t\t\ttimes[ times.length - 1 ] = time;\n\t\t\ttimes.set( track.times, 0 );\n\n\t\t\tvalues.set( track.values, 0 );\n\t\t\tvalues.set( interpolant.evaluate( time ), track.values.length );\n\n\t\t\tindex = times.length - 1;\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < track.times.length; i ++ ) {\n\n\t\t\t\tif ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;\n\n\t\t\t\tif ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {\n\n\t\t\t\t\ttimes.set( track.times.slice( 0, i + 1 ), 0 );\n\t\t\t\t\ttimes[ i + 1 ] = time;\n\t\t\t\t\ttimes.set( track.times.slice( i + 1 ), i + 2 );\n\n\t\t\t\t\tvalues.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );\n\t\t\t\t\tvalues.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );\n\t\t\t\t\tvalues.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );\n\n\t\t\t\t\tindex = i + 1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttrack.times = times;\n\t\ttrack.values = values;\n\n\t\treturn index;\n\n\t},\n\n\tmergeMorphTargetTracks: function ( clip, root ) {\n\n\t\tconst tracks = [];\n\t\tconst mergedTracks = {};\n\t\tconst sourceTracks = clip.tracks;\n\n\t\tfor ( let i = 0; i < sourceTracks.length; ++ i ) {\n\n\t\t\tlet sourceTrack = sourceTracks[ i ];\n\t\t\tconst sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name );\n\t\t\tconst sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName );\n\n\t\t\tif ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {\n\n\t\t\t\t// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.\n\t\t\t\ttracks.push( sourceTrack );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete\n\t\t\t\t&& sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {\n\n\t\t\t\tif ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\t\t// This should never happen, because glTF morph target animations\n\t\t\t\t\t// affect all targets already.\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );\n\n\t\t\t\tsourceTrack = sourceTrack.clone();\n\t\t\t\tsourceTrack.setInterpolation( InterpolateLinear );\n\n\t\t\t}\n\n\t\t\tconst targetCount = sourceTrackNode.morphTargetInfluences.length;\n\t\t\tconst targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];\n\n\t\t\tif ( targetIndex === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );\n\n\t\t\t}\n\n\t\t\tlet mergedTrack;\n\n\t\t\t// If this is the first time we've seen this object, create a new\n\t\t\t// track to store merged keyframe data for each morph target.\n\t\t\tif ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {\n\n\t\t\t\tmergedTrack = sourceTrack.clone();\n\n\t\t\t\tconst values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );\n\n\t\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\t\tvalues[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];\n\n\t\t\t\t}\n\n\t\t\t\t// We need to take into consideration the intended target node\n\t\t\t\t// of our original un-merged morphTarget animation.\n\t\t\t\tmergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';\n\t\t\t\tmergedTrack.values = values;\n\n\t\t\t\tmergedTracks[ sourceTrackNode.uuid ] = mergedTrack;\n\t\t\t\ttracks.push( mergedTrack );\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );\n\n\t\t\tmergedTrack = mergedTracks[ sourceTrackNode.uuid ];\n\n\t\t\t// For every existing keyframe of the merged track, write a (possibly\n\t\t\t// interpolated) value from the source track.\n\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\tmergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );\n\n\t\t\t}\n\n\t\t\t// For every existing keyframe of the source track, write a (possibly\n\t\t\t// new) keyframe to the merged track. Values from the previous loop may\n\t\t\t// be written again, but keyframes are de-duplicated.\n\t\t\tfor ( let j = 0; j < sourceTrack.times.length; j ++ ) {\n\n\t\t\t\tconst keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );\n\t\t\t\tmergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\treturn clip;\n\n\t}\n\n};\n\nexport { GLTFExporter };\n","import { GLTFExporter } from './three/GLTFExporter';\n\n/**\n * Provides an object which uses for exporting the scene\n *\n * @class\n * @author Alan Wu\n * @return {SceneExporter}\n */\nconst SceneExporter = function (sceneIn) {\n const scene = sceneIn;\n\n\tthis.exportGLTF = (binary) => {\n const rootRegion = scene.getRootRegion();\n const zincObjects = rootRegion.getAllObjects(true);\n const animations = [];\n zincObjects.forEach(zincObject => {\n if (zincObject.animationClip) {\n animations.push({clip: zincObject.animationClip[0], mesh: zincObject.getMorph()});\n }\n });\n const exporter = new GLTFExporter();\n const options = { binary, animations };\n return new Promise((resolve, reject) => {\n exporter.parse( scene.getThreeJSScene(), function ( gltf ) {\n resolve(gltf);\n }, options );\n });\n\t}\n}\n\nexport { SceneExporter };\n","import * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';\nimport { Geometry } from '../primitives/geometry';\nimport { Lines } from '../primitives/lines';\nimport { Pointset } from '../primitives/pointset';\n\nconst GLTFToZincJSLoader = function () {\n\n const _this = this;\n\n this.parseGLTFObjects = (object, region, depth, finishCallback) => {\n let childRegion = region;\n if (depth !== 0) {\n if (object.type === \"Object3D\") {\n if (object.name !== \"\") {\n if (region)\n childRegion = region.findOrCreateChildFromPath(object.name);\n if (childRegion) {\n const group = childRegion.getGroup();\n group.position.copy(object.position);\n group.rotation.copy(object.rotation);\n group.quaternion.copy(object.quaternion);\n group.matrixAutoUpdate = true;\n }\n }\n } else {\n let zincGeometry = undefined;\n if (object.type === \"Mesh\") {\n zincGeometry = new Geometry();\n } else if (object.type === \"LineSegments\") {\n zincGeometry = new Lines();\n } else if (object.type === \"Points\") {\n zincGeometry = new Pointset();\n }\n if (zincGeometry) {\n let localTimeEnabled = false;\n let localMorphColour = false;\n if (object.geometry && object.geometry.morphAttributes) {\n localTimeEnabled = object.geometry.morphAttributes.position ? true : false;\n localMorphColour = object.geometry.morphAttributes.color ? true : false;\n }\n zincGeometry.setMesh(object.clone(), localTimeEnabled, localMorphColour);\n const morph = zincGeometry.getMorph();\n zincGeometry.groupName = morph.name;\n morph.matrixAutoUpdate = true;\n region.addZincObject(zincGeometry);\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(zincGeometry);\n }\n }\n }\n depth++;\n object.children.forEach( child => {\n _this.parseGLTFObjects(child, childRegion, depth, finishCallback);\n });\n }\n\n this.setCamera = scene => {\n scene.viewAll();\n const cameraControls = scene.getZincCameraControls();\n const viewport = cameraControls.getCurrentViewport();\n cameraControls.addViewport('default', viewport);\n cameraControls.setDefaultViewport('default');\n }\n\n /**\n * Load GLTF into this scene object.\n *\n * @param {String} url - URL to the GLTF file\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.load = (scene, region, url, finishCallback, allCompletedCallback, options) => {\n const path = url.substring(0, url.lastIndexOf(\"/\") + 1);\n const filename = url.substring(url.lastIndexOf(\"/\") + 1, url.length);\n const loader = new GLTFLoader().setPath(path);\n\n loader.load( filename, function ( gltf ) {\n console.log(gltf)\n _this.parseGLTFObjects(gltf.scene, region, 0, finishCallback);\n _this.setCamera(scene);\n if (allCompletedCallback != undefined && (typeof allCompletedCallback == 'function'))\n allCompletedCallback();\n });\n }\n}\n\nexport { GLTFToZincJSLoader };\n","import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tMaterial,\n\tMesh,\n\tMeshPhongMaterial,\n\tPoints,\n\tPointsMaterial,\n\tVector3\n} from 'three';\n\n// o object_name | g group_name\nconst _object_pattern = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst _material_library_pattern = /^mtllib /;\n// usemtl material_name\nconst _material_use_pattern = /^usemtl /;\n// usemap map_name\nconst _map_use_pattern = /^usemap /;\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _ab = new Vector3();\nconst _cb = new Vector3();\n\nfunction ParserState() {\n\n\tconst state = {\n\t\tobjects: [],\n\t\tobject: {},\n\n\t\tvertices: [],\n\t\tnormals: [],\n\t\tcolors: [],\n\t\tuvs: [],\n\n\t\tmaterials: {},\n\t\tmaterialLibraries: [],\n\n\t\tstartObject: function ( name, fromDeclaration ) {\n\n\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\n\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\n\t\t\tif ( this.object && this.object.fromDeclaration === false ) {\n\n\t\t\t\tthis.object.name = name;\n\t\t\t\tthis.object.fromDeclaration = ( fromDeclaration !== false );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t\tthis.object = {\n\t\t\t\tname: name || '',\n\t\t\t\tfromDeclaration: ( fromDeclaration !== false ),\n\n\t\t\t\tgeometry: {\n\t\t\t\t\tvertices: [],\n\t\t\t\t\tnormals: [],\n\t\t\t\t\tcolors: [],\n\t\t\t\t\tuvs: [],\n\t\t\t\t\thasUVIndices: false\n\t\t\t\t},\n\t\t\t\tmaterials: [],\n\t\t\t\tsmooth: true,\n\n\t\t\t\tstartMaterial: function ( name, libraries ) {\n\n\t\t\t\t\tconst previous = this._finalize( false );\n\n\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\n\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\n\t\t\t\t\tif ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {\n\n\t\t\t\t\t\tthis.materials.splice( previous.index, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst material = {\n\t\t\t\t\t\tindex: this.materials.length,\n\t\t\t\t\t\tname: name || '',\n\t\t\t\t\t\tmtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),\n\t\t\t\t\t\tsmooth: ( previous !== undefined ? previous.smooth : this.smooth ),\n\t\t\t\t\t\tgroupStart: ( previous !== undefined ? previous.groupEnd : 0 ),\n\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\tinherited: false,\n\n\t\t\t\t\t\tclone: function ( index ) {\n\n\t\t\t\t\t\t\tconst cloned = {\n\t\t\t\t\t\t\t\tindex: ( typeof index === 'number' ? index : this.index ),\n\t\t\t\t\t\t\t\tname: this.name,\n\t\t\t\t\t\t\t\tmtllib: this.mtllib,\n\t\t\t\t\t\t\t\tsmooth: this.smooth,\n\t\t\t\t\t\t\t\tgroupStart: 0,\n\t\t\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\t\t\tinherited: false\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcloned.clone = this.clone.bind( cloned );\n\t\t\t\t\t\t\treturn cloned;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.materials.push( material );\n\n\t\t\t\t\treturn material;\n\n\t\t\t\t},\n\n\t\t\t\tcurrentMaterial: function () {\n\n\t\t\t\t\tif ( this.materials.length > 0 ) {\n\n\t\t\t\t\t\treturn this.materials[ this.materials.length - 1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t},\n\n\t\t\t\t_finalize: function ( end ) {\n\n\t\t\t\t\tconst lastMultiMaterial = this.currentMaterial();\n\t\t\t\t\tif ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) {\n\n\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n\t\t\t\t\t\tlastMultiMaterial.inherited = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\n\t\t\t\t\tif ( end && this.materials.length > 1 ) {\n\n\t\t\t\t\t\tfor ( let mi = this.materials.length - 1; mi >= 0; mi -- ) {\n\n\t\t\t\t\t\t\tif ( this.materials[ mi ].groupCount <= 0 ) {\n\n\t\t\t\t\t\t\t\tthis.materials.splice( mi, 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\t// Guarantee at least one empty material, this makes the creation later more straight forward.\n\t\t\t\t\tif ( end && this.materials.length === 0 ) {\n\n\t\t\t\t\t\tthis.materials.push( {\n\t\t\t\t\t\t\tname: '',\n\t\t\t\t\t\t\tsmooth: this.smooth\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn lastMultiMaterial;\n\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Inherit previous objects material.\n\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\n\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\n\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\n\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n\n\t\t\tif ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {\n\n\t\t\t\tconst declared = previousMaterial.clone( 0 );\n\t\t\t\tdeclared.inherited = true;\n\t\t\t\tthis.object.materials.push( declared );\n\n\t\t\t}\n\n\t\t\tthis.objects.push( this.object );\n\n\t\t},\n\n\t\tfinalize: function () {\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t},\n\n\t\tparseVertexIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseNormalIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseUVIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 2 ) * 2;\n\n\t\t},\n\n\t\taddVertex: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddVertexPoint: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddVertexLine: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.normals;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddFaceNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\t_vA.fromArray( src, a );\n\t\t\t_vB.fromArray( src, b );\n\t\t\t_vC.fromArray( src, c );\n\n\t\t\t_cb.subVectors( _vC, _vB );\n\t\t\t_ab.subVectors( _vA, _vB );\n\t\t\t_cb.cross( _ab );\n\n\t\t\t_cb.normalize();\n\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\n\t\t},\n\n\t\taddColor: function ( a, b, c ) {\n\n\t\t\tconst src = this.colors;\n\t\t\tconst dst = this.object.geometry.colors;\n\n\t\t\tif ( src[ a ] !== undefined ) dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tif ( src[ b ] !== undefined ) dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tif ( src[ c ] !== undefined ) dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddUV: function ( a, b, c ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ] );\n\n\t\t},\n\n\t\taddDefaultUV: function () {\n\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\n\t\t},\n\n\t\taddUVLine: function ( a ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\n\t\t},\n\n\t\taddFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tlet ia = this.parseVertexIndex( a, vLen );\n\t\t\tlet ib = this.parseVertexIndex( b, vLen );\n\t\t\tlet ic = this.parseVertexIndex( c, vLen );\n\n\t\t\tthis.addVertex( ia, ib, ic );\n\t\t\tthis.addColor( ia, ib, ic );\n\n\t\t\t// normals\n\n\t\t\tif ( na !== undefined && na !== '' ) {\n\n\t\t\t\tconst nLen = this.normals.length;\n\n\t\t\t\tia = this.parseNormalIndex( na, nLen );\n\t\t\t\tib = this.parseNormalIndex( nb, nLen );\n\t\t\t\tic = this.parseNormalIndex( nc, nLen );\n\n\t\t\t\tthis.addNormal( ia, ib, ic );\n\n\t\t\t} else {\n\n\t\t\t\tthis.addFaceNormal( ia, ib, ic );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tif ( ua !== undefined && ua !== '' ) {\n\n\t\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\t\tia = this.parseUVIndex( ua, uvLen );\n\t\t\t\tib = this.parseUVIndex( ub, uvLen );\n\t\t\t\tic = this.parseUVIndex( uc, uvLen );\n\n\t\t\t\tthis.addUV( ia, ib, ic );\n\n\t\t\t\tthis.object.geometry.hasUVIndices = true;\n\n\t\t\t} else {\n\n\t\t\t\t// add placeholder values (for inconsistent face definitions)\n\n\t\t\t\tthis.addDefaultUV();\n\n\t\t\t}\n\n\t\t},\n\n\t\taddPointGeometry: function ( vertices ) {\n\n\t\t\tthis.object.geometry.type = 'Points';\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tconst index = this.parseVertexIndex( vertices[ vi ], vLen );\n\n\t\t\t\tthis.addVertexPoint( index );\n\t\t\t\tthis.addColor( index );\n\n\t\t\t}\n\n\t\t},\n\n\t\taddLineGeometry: function ( vertices, uvs ) {\n\n\t\t\tthis.object.geometry.type = 'Line';\n\n\t\t\tconst vLen = this.vertices.length;\n\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tthis.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n\t\t\t}\n\n\t\t\tfor ( let uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {\n\n\t\t\t\tthis.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tstate.startObject( '', false );\n\n\treturn state;\n\n}\n\n//\n\nclass OBJLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.materials = null;\n\n\t}\n\n\tload( 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( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.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\tsetMaterials( materials ) {\n\n\t\tthis.materials = materials;\n\n\t\treturn this;\n\n\t}\n\n\tparse( text ) {\n\n\t\tconst state = new ParserState();\n\n\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t}\n\n\t\tif ( text.indexOf( '\\\\\\n' ) !== - 1 ) {\n\n\t\t\t// join lines separated by a line continuation character (\\)\n\t\t\ttext = text.replace( /\\\\\\n/g, '' );\n\n\t\t}\n\n\t\tconst lines = text.split( '\\n' );\n\t\tlet line = '', lineFirstChar = '';\n\t\tlet lineLength = 0;\n\t\tlet result = [];\n\n\t\t// Faster to just trim left side of the line. Use if available.\n\t\tconst trimLeft = ( typeof ''.trimLeft === 'function' );\n\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tline = lines[ i ];\n\n\t\t\tline = trimLeft ? line.trimLeft() : line.trim();\n\n\t\t\tlineLength = line.length;\n\n\t\t\tif ( lineLength === 0 ) continue;\n\n\t\t\tlineFirstChar = line.charAt( 0 );\n\n\t\t\t// @todo invoke passed in handler if any\n\t\t\tif ( lineFirstChar === '#' ) continue;\n\n\t\t\tif ( lineFirstChar === 'v' ) {\n\n\t\t\t\tconst data = line.split( /\\s+/ );\n\n\t\t\t\tswitch ( data[ 0 ] ) {\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tstate.vertices.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ( data.length >= 7 ) {\n\n\t\t\t\t\t\t\tstate.colors.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 4 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 5 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 6 ] )\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\t// if no colors are defined, add placeholders so color and vertex indices match\n\n\t\t\t\t\t\t\tstate.colors.push( undefined, undefined, undefined );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vn':\n\t\t\t\t\t\tstate.normals.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vt':\n\t\t\t\t\t\tstate.uvs.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'f' ) {\n\n\t\t\t\tconst lineData = line.substr( 1 ).trim();\n\t\t\t\tconst vertexData = lineData.split( /\\s+/ );\n\t\t\t\tconst faceVertices = [];\n\n\t\t\t\t// Parse the face vertex data into an easy to work with format\n\n\t\t\t\tfor ( let j = 0, jl = vertexData.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst vertex = vertexData[ j ];\n\n\t\t\t\t\tif ( vertex.length > 0 ) {\n\n\t\t\t\t\t\tconst vertexParts = vertex.split( '/' );\n\t\t\t\t\t\tfaceVertices.push( vertexParts );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n\t\t\t\tconst v1 = faceVertices[ 0 ];\n\n\t\t\t\tfor ( let j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {\n\n\t\t\t\t\tconst v2 = faceVertices[ j ];\n\t\t\t\t\tconst v3 = faceVertices[ j + 1 ];\n\n\t\t\t\t\tstate.addFace(\n\t\t\t\t\t\tv1[ 0 ], v2[ 0 ], v3[ 0 ],\n\t\t\t\t\t\tv1[ 1 ], v2[ 1 ], v3[ 1 ],\n\t\t\t\t\t\tv1[ 2 ], v2[ 2 ], v3[ 2 ]\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'l' ) {\n\n\t\t\t\tconst lineParts = line.substring( 1 ).trim().split( ' ' );\n\t\t\t\tlet lineVertices = [];\n\t\t\t\tconst lineUVs = [];\n\n\t\t\t\tif ( line.indexOf( '/' ) === - 1 ) {\n\n\t\t\t\t\tlineVertices = lineParts;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let li = 0, llen = lineParts.length; li < llen; li ++ ) {\n\n\t\t\t\t\t\tconst parts = lineParts[ li ].split( '/' );\n\n\t\t\t\t\t\tif ( parts[ 0 ] !== '' ) lineVertices.push( parts[ 0 ] );\n\t\t\t\t\t\tif ( parts[ 1 ] !== '' ) lineUVs.push( parts[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.addLineGeometry( lineVertices, lineUVs );\n\n\t\t\t} else if ( lineFirstChar === 'p' ) {\n\n\t\t\t\tconst lineData = line.substr( 1 ).trim();\n\t\t\t\tconst pointData = lineData.split( ' ' );\n\n\t\t\t\tstate.addPointGeometry( pointData );\n\n\t\t\t} else if ( ( result = _object_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t// o object_name\n\t\t\t\t// or\n\t\t\t\t// g group_name\n\n\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n\t\t\t\t// let name = result[ 0 ].substr( 1 ).trim();\n\t\t\t\tconst name = ( ' ' + result[ 0 ].substr( 1 ).trim() ).substr( 1 );\n\n\t\t\t\tstate.startObject( name );\n\n\t\t\t} else if ( _material_use_pattern.test( line ) ) {\n\n\t\t\t\t// material\n\n\t\t\t\tstate.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );\n\n\t\t\t} else if ( _material_library_pattern.test( line ) ) {\n\n\t\t\t\t// mtl file\n\n\t\t\t\tstate.materialLibraries.push( line.substring( 7 ).trim() );\n\n\t\t\t} else if ( _map_use_pattern.test( line ) ) {\n\n\t\t\t\t// the line is parsed but ignored since the loader assumes textures are defined MTL files\n\t\t\t\t// (according to https://www.okino.com/conv/imp_wave.htm, 'usemap' is the old-style Wavefront texture reference method)\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Rendering identifier \"usemap\" not supported. Textures must be defined in MTL files.' );\n\n\t\t\t} else if ( lineFirstChar === 's' ) {\n\n\t\t\t\tresult = line.split( ' ' );\n\n\t\t\t\t// smooth shading\n\n\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n\t\t\t\t// but does not define a usemtl for each face set.\n\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n\t\t\t\t// where explicit usemtl defines geometry groups.\n\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n\t\t\t\t/*\n\t\t\t\t\t * http://paulbourke.net/dataformats/obj/\n\t\t\t\t\t * or\n\t\t\t\t\t * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n\t\t\t\t\t *\n\t\t\t\t\t * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n\t\t\t\t\t * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n\t\t\t\t\t * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n\t\t\t\t\t * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n\t\t\t\t\t * than 0.\"\n\t\t\t\t\t */\n\t\t\t\tif ( result.length > 1 ) {\n\n\t\t\t\t\tconst value = result[ 1 ].trim().toLowerCase();\n\t\t\t\t\tstate.object.smooth = ( value !== '0' && value !== 'off' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// ZBrush can produce \"s\" lines #11707\n\t\t\t\t\tstate.object.smooth = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = state.object.currentMaterial();\n\t\t\t\tif ( material ) material.smooth = state.object.smooth;\n\n\t\t\t} else {\n\n\t\t\t\t// Handle null terminated files without exception\n\t\t\t\tif ( line === '\\0' ) continue;\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Unexpected line: \"' + line + '\"' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.finalize();\n\n\t\tconst container = new Group();\n\t\tcontainer.materialLibraries = [].concat( state.materialLibraries );\n\n\t\tconst hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 );\n\n\t\tif ( hasPrimitives === true ) {\n\n\t\t\tfor ( let i = 0, l = state.objects.length; i < l; i ++ ) {\n\n\t\t\t\tconst object = state.objects[ i ];\n\t\t\t\tconst geometry = object.geometry;\n\t\t\t\tconst materials = object.materials;\n\t\t\t\tconst isLine = ( geometry.type === 'Line' );\n\t\t\t\tconst isPoints = ( geometry.type === 'Points' );\n\t\t\t\tlet hasVertexColors = false;\n\n\t\t\t\t// Skip o/g line declarations that did not follow with any faces\n\t\t\t\tif ( geometry.vertices.length === 0 ) continue;\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) );\n\n\t\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\t\thasVertexColors = true;\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( geometry.colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.hasUVIndices === true ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Create materials\n\n\t\t\t\tconst createdMaterials = [];\n\n\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\tconst materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;\n\t\t\t\t\tlet material = state.materials[ materialHash ];\n\n\t\t\t\t\tif ( this.materials !== null ) {\n\n\t\t\t\t\t\tmaterial = this.materials.create( sourceMaterial.name );\n\n\t\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\n\t\t\t\t\t\tif ( isLine && material && ! ( material instanceof LineBasicMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialLine = new LineBasicMaterial();\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialLine, material );\n\t\t\t\t\t\t\tmaterialLine.color.copy( material.color );\n\t\t\t\t\t\t\tmaterial = materialLine;\n\n\t\t\t\t\t\t} else if ( isPoints && material && ! ( material instanceof PointsMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialPoints = new PointsMaterial( { size: 10, sizeAttenuation: false } );\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialPoints, material );\n\t\t\t\t\t\t\tmaterialPoints.color.copy( material.color );\n\t\t\t\t\t\t\tmaterialPoints.map = material.map;\n\t\t\t\t\t\t\tmaterial = materialPoints;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( material === undefined ) {\n\n\t\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\t\tmaterial = new LineBasicMaterial();\n\n\t\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\t\tmaterial = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaterial.name = sourceMaterial.name;\n\t\t\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? false : true;\n\t\t\t\t\t\tmaterial.vertexColors = hasVertexColors;\n\n\t\t\t\t\t\tstate.materials[ materialHash ] = material;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcreatedMaterials.push( material );\n\n\t\t\t\t}\n\n\t\t\t\t// Create mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tif ( createdMaterials.length > 1 ) {\n\n\t\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\t\tbuffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = object.name;\n\n\t\t\t\tcontainer.add( mesh );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// if there is only the default parser state object with no geometry data, interpret data as point cloud\n\n\t\t\tif ( state.vertices.length > 0 ) {\n\n\t\t\t\tconst material = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( state.vertices, 3 ) );\n\n\t\t\t\tif ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( state.colors, 3 ) );\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst points = new Points( buffergeometry, material );\n\t\t\t\tcontainer.add( points );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn container;\n\n\t}\n\n}\n\nexport { OBJLoader };\n","import { JSONLoader } from './JSONLoader';\nimport * as THREE from 'three';\nconst FileLoader = THREE.FileLoader;\n\nconst mergeGlyphData = (glyphData) => {\n const merge = (glyphData1, glyphData2) => {\n glyphData1.metadata.number_of_vertices += glyphData2.metadata.number_of_vertices;\n if ('labels' in glyphData1) {\n glyphData1.labels.push(...glyphData1.labels);\n }\n const fields = ['axis1', 'axis2', 'axis3', 'colors', 'positions', 'scale'];\n fields.forEach(field => {\n if (field in glyphData1) {\n Object.keys(glyphData1[field]).forEach((step) => {\n const len = glyphData2[field][step].length;\n for (let i = 0; i < len; i++) {\n glyphData1[field][step].push(glyphData2[field][step][i]);\n }\n });\n }\n });\n }\n\n if (glyphData && glyphData.length > 0) {\n while (glyphData.length > 1) {\n const glyphData2 = glyphData.splice(1,1);\n merge(glyphData[0], glyphData2[0]);\n }\n }\n}\n\nconst mergeGeometries = (geometries) => {\n const merge = (geometry1, geometry2) => {\n geometry1.merge(geometry2);\n }\n\n if (geometries && geometries.length > 0) {\n while (geometries.length > 1) {\n const geometry2 = geometries.splice(1,1);\n merge(geometries[0], geometry2[0]);\n }\n return geometries[0];\n }\n return undefined;\n}\n\nconst IndexedSourcesHandler = function(urlIn, crossOrigin, onDownloadedCallback) {\n const fileLoader = new FileLoader();\n const jsonLoader = new JSONLoader();\n fileLoader.crossOrigin = crossOrigin;\n const url = urlIn;\n const onDownloaded = onDownloadedCallback;\n let data = undefined;\n let downloading = false;\n let finished = false;\n let error = undefined;\n const items = [];\n\n const processItemDownloaded = (item) => {\n const modelData = data[item.index];\n if (modelData) {\n if (\"GlyphGeometriesURL\" in modelData) {\n item.onLoad(modelData);\n } else {\n let obj = jsonLoader.parse( modelData );\n item.onLoad(obj.geometry, obj.materials);\n }\n } else {\n processItemError(item, {responseURL: url});\n }\n }\n\n const processItemError = (item) => {\n if (item.onError) {\n if (!error) {\n error = {responseURL: url};\n }\n item.onError(error);\n }\n }\n\n this.downloadCompleted = (args) => {\n try {\n data = JSON.parse(args[0]);\n downloading = false;\n finished = true;\n if (Array.isArray(data)) {\n items.forEach(item => processItemDownloaded(item));\n } else {\n items.forEach(item => processItemError(item));\n }\n } catch {\n items.forEach(item => processItemError(item));\n }\n }\n\n const errorHandling = () => {\n return xhr => {\n error = xhr;\n finished = true;\n downloading = false;\n items.forEach((item) => {\n processItemError(item);\n });\n }\n }\n\n const progressHandling = () => {\n return xhr => {\n items.forEach((item) => {\n if (item.onProgress) {\n item.onProgress(xhr);\n }\n });\n }\n }\n\n this.load = (index, onLoad, onProgress, onError) => {\n const item = {\n index,\n onLoad,\n onProgress,\n onError,\n };\n if (finished) {\n if (data) {\n processItemDownloaded(item);\n } else {\n processItemError(error);\n }\n } else if (downloading) {\n //quene it up\n items.push(item);\n } else {\n items.push(item);\n downloading = true;\n fileLoader.load(url, onDownloaded, progressHandling, errorHandling);\n }\n }\n}\n\nconst MultiSourcesHandler = function(numberIn, onLoadCallback, options) {\n const allData = [];\n const number = numberIn;\n const onLoad = onLoadCallback;\n let totalDownloaded = 0;\n const isGlyphData = options.isGlyphsets;\n\n this.itemDownloaded = (order, args) => {\n allData[order]= args;\n totalDownloaded++;\n if (totalDownloaded == number) {\n if (allData.length > 0) {\n //Assume when item length is one then it is a glyphset otherwise geometry\n if (!isGlyphData) {\n const materials = allData[0][1];\n const geometries = allData.map((data) => data[0]);\n //All geometries will be merged into the first one\n const geometry = mergeGeometries(geometries);\n for (let i = 1; i < number; i++) {\n allData[order][0].dispose();\n allData[order][1].forEach((material) => material.dispose());\n }\n onLoad(geometry, materials);\n } else {\n const glyphData = allData.map((item) => {\n return JSON.parse(item[0])\n });\n mergeGlyphData(glyphData);\n onLoad(glyphData[0]);\n }\n }\n }\n }\n}\n\nconst PrimitivesLoader = function () {\n let concurrentDownloads = 0;\n const MAX_DOWNLOAD = 20;\n this.crossOrigin = \"Anonymous\";\n const jsonloader = new JSONLoader();\n const fileloader = new FileLoader();\n fileloader.crossOrigin = \"Anonymous\";\n const waitingList = [];\n //URL to loader pair\n const indexedLoaders = {};\n\n //Load the first file then the rest will be handled separately\n const loadFromMultipleSources = (urls, onLoad, onProgress, onError, options) => {\n const number = urls.length;\n const msHandler = new MultiSourcesHandler(number, onLoad, options);\n //The order here will give us hint on the sequence on merging the primitives\n let order = 0;\n urls.forEach((url) => {\n const newOptions = options ? {...options} : {};\n newOptions.msHandler = msHandler;\n newOptions.order = order;\n order++;\n loadFromSingleSource(url, onLoad, onProgress, onError, newOptions);\n });\n }\n\n const handleIndexedSource = (url, onLoad, onProgress, onError, options) => {\n const newOptions = options ? {...options} : {};\n let indexedLoader = indexedLoaders[url];\n if (!indexedLoader) {\n if (MAX_DOWNLOAD > concurrentDownloads) {\n const onLoadCallback = new onFinally(undefined, this, newOptions);\n ++concurrentDownloads;\n indexedLoader = new IndexedSourcesHandler(url, this.crossOrigin, onLoadCallback);\n indexedLoaders[url] = indexedLoader;\n } else {\n waitingList.push({\n url,\n onLoad,\n onProgress,\n onError,\n options,\n });\n }\n }\n if (indexedLoader) {\n newOptions.isHandler = indexedLoader;\n indexedLoader.load(options.index, onLoad, onProgress, onError);\n }\n }\n\n const loadFromSingleSource = (url, onLoad, onProgress, onError, options) => {\n if (options && (options.index !== undefined) ) {\n handleIndexedSource(url, onLoad, onProgress, onError, options);\n } else {\n //Standard loading\n if (MAX_DOWNLOAD > concurrentDownloads) {\n ++concurrentDownloads;\n const onLoadCallback = new onFinally(onLoad, this, options);\n const onErrorCallback = new onFinally(onError, this, options);\n if (!options.isGlyphsets) {\n jsonloader.crossOrigin = this.crossOrigin;\n jsonloader.load(url, onLoadCallback, onProgress, onErrorCallback);\n } else {\n fileloader.load(url, onLoadCallback, onProgress, onErrorCallback);\n }\n } else {\n waitingList.push({\n url,\n onLoad,\n onProgress,\n onError,\n options,\n });\n }\n }\n }\n\n this.load = (url, onLoad, onProgress, onError, options) => {\n if (Array.isArray(url)) {\n loadFromMultipleSources(url, onLoad, onProgress, onError, options);\n } else {\n loadFromSingleSource(url, onLoad, onProgress, onError, options);\n }\n }\n\n this.loadFromWaitingList = () => {\n while (MAX_DOWNLOAD > concurrentDownloads) {\n const item = waitingList.shift();\n if (item) {\n this.load(item.url, item.onLoad, item.onProgress, item.onError, item.options);\n } else {\n return;\n }\n }\n }\n\n this.itemRemainingCheck = () => {\n if (waitingList.length === 0 && concurrentDownloads === 0) {\n for (let key in indexedLoaders) {\n if (indexedLoaders.hasOwnProperty(key)) {\n delete indexedLoaders[key];\n }\n }\n }\n }\n\n const onFinally = function(callback, loader, options) {\n return (...args) => {\n --concurrentDownloads;\n if (options?.msHandler) {\n options.msHandler.itemDownloaded(options.order, args);\n } else if (options?.isHandler) {\n options.isHandler.downloadCompleted(args);\n } else {\n if (callback) {\n callback(...args);\n }\n }\n loader.loadFromWaitingList();\n loader.itemRemainingCheck();\n }\n }\n\n this.parse = data => {\n return loader.parse(data);\n }\n\n}\n\nexport { PrimitivesLoader };","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tLoaderUtils,\n\tVector3\n} from 'three';\n\n/**\n * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files, with automatic detection of type.\n *\n * The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n * Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n * There is perhaps some question as to how valid it is to always assume little-endian-ness.\n * ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n * const loader = new STLLoader();\n * loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {\n * scene.add( new THREE.Mesh( geometry ) );\n * });\n *\n * For binary STLs geometry might contain colors for vertices. To use it:\n * // use the same code to load STL as above\n * if (geometry.hasColors) {\n * material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true });\n * } else { .... }\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * const mesh = new THREE.Mesh( geometry, material );\n *\n * For example:\n *\n * const materials = [];\n * const nGeometryGroups = geometry.groups.length;\n *\n * const colorMap = ...; // Some logic to index colors.\n *\n * for (let i = 0; i < nGeometryGroups; i++) {\n *\n *\t\tconst material = new THREE.MeshPhongMaterial({\n *\t\t\tcolor: colorMap[i],\n *\t\t\twireframe: false\n *\t\t});\n *\n * }\n *\n * materials.push(material);\n * const mesh = new THREE.Mesh(geometry, materials);\n */\n\n\nclass STLLoader 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 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( this.withCredentials );\n\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.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( data ) {\n\n\t\tfunction isBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 );\n\t\t\tconst n_faces = reader.getUint32( 80, true );\n\t\t\tconst expect = 80 + ( 32 / 8 ) + ( n_faces * face_size );\n\n\t\t\tif ( expect === reader.byteLength ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// An ASCII STL data must begin with 'solid ' as the first six bytes.\n\t\t\t// However, ASCII STLs lacking the SPACE after the 'd' are known to be\n\t\t\t// plentiful. So, check the first 5 bytes for 'solid'.\n\n\t\t\t// Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n\t\t\t// https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n\t\t\t// Search for \"solid\" to start anywhere after those prefixes.\n\n\t\t\t// US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n\t\t\tconst solid = [ 115, 111, 108, 105, 100 ];\n\n\t\t\tfor ( let off = 0; off < 5; off ++ ) {\n\n\t\t\t\t// If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n\t\t\t\tif ( matchDataViewAt( solid, reader, off ) ) return false;\n\n\t\t\t}\n\n\t\t\t// Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction matchDataViewAt( query, reader, offset ) {\n\n\t\t\t// Check if each byte in query matches the corresponding byte from the current offset\n\n\t\t\tfor ( let i = 0, il = query.length; i < il; i ++ ) {\n\n\t\t\t\tif ( query[ i ] !== reader.getUint8( offset + i, false ) ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction parseBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst faces = reader.getUint32( 80, true );\n\n\t\t\tlet r, g, b, hasColors = false, colors;\n\t\t\tlet defaultR, defaultG, defaultB, alpha;\n\n\t\t\t// process STL header\n\t\t\t// check for default color in header (\"COLOR=rgba\" sequence).\n\n\t\t\tfor ( let index = 0; index < 80 - 10; index ++ ) {\n\n\t\t\t\tif ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) {\n\n\t\t\t\t\thasColors = true;\n\t\t\t\t\tcolors = new Float32Array( faces * 3 * 3 );\n\n\t\t\t\t\tdefaultR = reader.getUint8( index + 6 ) / 255;\n\t\t\t\t\tdefaultG = reader.getUint8( index + 7 ) / 255;\n\t\t\t\t\tdefaultB = reader.getUint8( index + 8 ) / 255;\n\t\t\t\t\talpha = reader.getUint8( index + 9 ) / 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst dataOffset = 84;\n\t\t\tconst faceLength = 12 * 4 + 2;\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst vertices = new Float32Array( faces * 3 * 3 );\n\t\t\tconst normals = new Float32Array( faces * 3 * 3 );\n\n\t\t\tfor ( let face = 0; face < faces; face ++ ) {\n\n\t\t\t\tconst start = dataOffset + face * faceLength;\n\t\t\t\tconst normalX = reader.getFloat32( start, true );\n\t\t\t\tconst normalY = reader.getFloat32( start + 4, true );\n\t\t\t\tconst normalZ = reader.getFloat32( start + 8, true );\n\n\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\tconst packedColor = reader.getUint16( start + 48, true );\n\n\t\t\t\t\tif ( ( packedColor & 0x8000 ) === 0 ) {\n\n\t\t\t\t\t\t// facet has its own unique color\n\n\t\t\t\t\t\tr = ( packedColor & 0x1F ) / 31;\n\t\t\t\t\t\tg = ( ( packedColor >> 5 ) & 0x1F ) / 31;\n\t\t\t\t\t\tb = ( ( packedColor >> 10 ) & 0x1F ) / 31;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tr = defaultR;\n\t\t\t\t\t\tg = defaultG;\n\t\t\t\t\t\tb = defaultB;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 1; i <= 3; i ++ ) {\n\n\t\t\t\t\tconst vertexstart = start + i * 12;\n\t\t\t\t\tconst componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );\n\n\t\t\t\t\tvertices[ componentIdx ] = reader.getFloat32( vertexstart, true );\n\t\t\t\t\tvertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );\n\t\t\t\t\tvertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );\n\n\t\t\t\t\tnormals[ componentIdx ] = normalX;\n\t\t\t\t\tnormals[ componentIdx + 1 ] = normalY;\n\t\t\t\t\tnormals[ componentIdx + 2 ] = normalZ;\n\n\t\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\t\tcolors[ componentIdx ] = r;\n\t\t\t\t\t\tcolors[ componentIdx + 1 ] = g;\n\t\t\t\t\t\tcolors[ componentIdx + 2 ] = b;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\t\t\t\tgeometry.hasColors = true;\n\t\t\t\tgeometry.alpha = alpha;\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction parseASCII( data ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst patternSolid = /solid([\\s\\S]*?)endsolid/g;\n\t\t\tconst patternFace = /facet([\\s\\S]*?)endfacet/g;\n\t\t\tlet faceCounter = 0;\n\n\t\t\tconst patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source;\n\t\t\tconst patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' );\n\t\t\tconst patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' );\n\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\n\t\t\tconst normal = new Vector3();\n\n\t\t\tlet result;\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet startVertex = 0;\n\t\t\tlet endVertex = 0;\n\n\t\t\twhile ( ( result = patternSolid.exec( data ) ) !== null ) {\n\n\t\t\t\tstartVertex = endVertex;\n\n\t\t\t\tconst solid = result[ 0 ];\n\n\t\t\t\twhile ( ( result = patternFace.exec( solid ) ) !== null ) {\n\n\t\t\t\t\tlet vertexCountPerFace = 0;\n\t\t\t\t\tlet normalCountPerFace = 0;\n\n\t\t\t\t\tconst text = result[ 0 ];\n\n\t\t\t\t\twhile ( ( result = patternNormal.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tnormal.x = parseFloat( result[ 1 ] );\n\t\t\t\t\t\tnormal.y = parseFloat( result[ 2 ] );\n\t\t\t\t\t\tnormal.z = parseFloat( result[ 3 ] );\n\t\t\t\t\t\tnormalCountPerFace ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( ( result = patternVertex.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tvertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );\n\t\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\t\t\tvertexCountPerFace ++;\n\t\t\t\t\t\tendVertex ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// every face have to own ONE valid normal\n\n\t\t\t\t\tif ( normalCountPerFace !== 1 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the normal of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// each face have to own THREE valid vertices\n\n\t\t\t\t\tif ( vertexCountPerFace !== 3 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the vertices of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCounter ++;\n\n\t\t\t\t}\n\n\t\t\t\tconst start = startVertex;\n\t\t\t\tconst count = endVertex - startVertex;\n\n\t\t\t\tgeometry.addGroup( start, count, groupCount );\n\t\t\t\tgroupCount ++;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction ensureString( buffer ) {\n\n\t\t\tif ( typeof buffer !== 'string' ) {\n\n\t\t\t\treturn LoaderUtils.decodeText( new Uint8Array( buffer ) );\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction ensureBinary( buffer ) {\n\n\t\t\tif ( typeof buffer === 'string' ) {\n\n\t\t\t\tconst array_buffer = new Uint8Array( buffer.length );\n\t\t\t\tfor ( let i = 0; i < buffer.length; i ++ ) {\n\n\t\t\t\t\tarray_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian\n\n\t\t\t\t}\n\n\t\t\t\treturn array_buffer.buffer || array_buffer;\n\n\t\t\t} else {\n\n\t\t\t\treturn buffer;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// start\n\n\t\tconst binData = ensureBinary( data );\n\n\t\treturn isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) );\n\n\t}\n\n}\n\nexport { STLLoader };\n","import * as THREE from 'three';\nimport { mergeGeometries } from '../utilities';\nimport { ZincObject } from './zincObject';\n\n/**\n * Provides an object which stores lines.\n * This is created when a valid json file containing lines is read into a {@link Zinc.Scene}\n * object.\n *\n * @class\n * @author Alan Wu\n * @return {TubeLines}\n */\nconst TubeLines = function () {\n ZincObject.call(this);\n this.isTubeLines = true;\n let dataIn = {};\n let geometryConfig = { radius: 1, radialSegments: 8, smooth: false };\n\n /**\n * Create the line segements using geometry and material.\n *\n * @param {THREE.Geomtry} geometryIn - Geometry of lines to be rendered.\n * @param {THREE.Material} materialIn - Material to be set for the lines.\n * @param {Object} options - Provide various options\n * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is\n * time dependent.\n * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is\n * time dependent.\n */\n this.createLineSegment = (geometryIn, materialIn, options) => {\n if (geometryIn && materialIn) {\n dataIn = { geometryIn, materialIn, options };\n const geometry = getTubeLinesGeometry(geometryIn.vertices);\n const material = new THREE.MeshStandardMaterial({ color: materialIn.color });\n const mesh = new THREE.Mesh(geometry, material);\n this.setMesh(mesh, options.localTimeEnabled, options.localMorphColour);\n }\n }\n\n /**\n * Set the width for the lines.\n *\n * @param {Number} width - Width of the lines.\n */\n\tthis.setWidth = width => {\n\t\tif (this.morph && this.morph.material) {\n\t\t\tthis.morph.material.linewidth = width;\n\t\t\tthis.morph.material.needsUpdate = true;\n\t\t}\n\t}\n\n /**\n * Set the opacity of this Geometry. This function will also set the transparent\n * according to the provided alpha value.\n *\n * @param {Number} alpah - Alpha value to set for this geometry,\n * can be any value between from 0 to 1.0.\n */\n this.setAlpha = function (alpha) {\n let mesh = this.getMorph();\n mesh.material.opacity = alpha;\n mesh.material.transparent = alpha < 1.0;\n mesh.material.depthWrite = alpha > 0.5;\n }\n\n /**\n * Set the wireframe mode for this geometry.\n * @param {Boolean} wireframe\n */\n this.setWireframe = (wireframe) => {\n let mesh = this.getMorph();\n mesh.material.wireframe = wireframe;\n }\n\n /**\n * Update tube radius/radialSegments value\n *\n * @param {Float} radius The radius of the tube.\n * @param {Integer} radialSegments The number of segments that make up the cross-section.\n */\n this.setTubeLines = (radius, radialSegments) => {\n if (radius && radialSegments) {\n const { geometryIn } = dataIn;\n let mesh = this.getMorph();\n mesh.geometry.dispose();\n\n geometryConfig = Object.assign(geometryConfig, { radius, radialSegments });\n mesh.geometry = getTubeLinesGeometry(geometryIn.vertices);\n }\n }\n\n /**\n * Get merged geometry from list of geometry vertices\n *\n * @param {Array} vertices - An array of THREE.Vector3 vertices.\n * @returns {Object}\n */\n const getTubeLinesGeometry = (vertices) => {\n const { radius, radialSegments, smooth } = geometryConfig;\n let finalGeometry;\n if (smooth) {\n const curve = new THREE.CatmullRomCurve3(vertices);\n finalGeometry = new THREE.TubeGeometry(curve, vertices.length, radius, radialSegments, false);\n } else {\n const geometries = [];\n for (let i = 0; i + 1 < vertices.length; i = i + 2) {\n const curve = new THREE.LineCurve3(vertices[i], vertices[i+1]);\n const tubeGeometry = new THREE.TubeGeometry(curve, 1, radius, radialSegments, false);\n geometries.push(tubeGeometry);\n }\n finalGeometry = mergeGeometries(geometries, true);\n geometries.forEach(g => g.dispose());\n }\n return finalGeometry;\n }\n}\n\nTubeLines.prototype = Object.create(ZincObject.prototype);\nexport { TubeLines };\n","import * as THREE from 'three';\nimport { GLTFToZincJSLoader } from './loaders/GLTFToZincJSLoader';\nimport { OBJLoader } from './loaders/OBJLoader';\nimport { PrimitivesLoader } from './loaders/primitivesLoader';\nimport { STLLoader } from './loaders/STLLoader';\nimport { Geometry } from './primitives/geometry';\nimport { Glyphset } from './primitives/glyphset';\nimport { Lines } from './primitives/lines';\nimport { Pointset } from './primitives/pointset';\nimport { TextureSlides } from './primitives/textureSlides';\nimport { TubeLines } from './primitives/tubeLines';\nimport { createNewURL, isRegionGroup, resolveURL } from './utilities';\nimport Zinc from './zinc';\n\n/**\n * A helper class to help with reading / importing primitives and\n * settings into a {@link Scene}.\n *\n * @class\n * @param {Object} containerIn - Container to create the renderer on.\n * @author Alan Wu\n * @return {SceneLoader}\n */\nconst SceneLoader = function (sceneIn) {\n const scene = sceneIn;\n this.toBeDownloaded = 0;\n this.progressMap = {};\n let viewLoaded = false;\n let errorDownload = false;\n const primitivesLoader = new PrimitivesLoader();\n /**\n * This function returns a three component array, which contains\n * [totalsize, totalLoaded and errorDownload] of all the downloads happening\n * in this scene.\n * @returns {Array}\n */\n this.getDownloadProgress = () => {\n let totalSize = 0;\n let totalLoaded = 0;\n let unknownFound = false;\n\n for (const key in this.progressMap) {\n const progress = this.progressMap[key];\n\n totalSize += progress[1];\n totalLoaded += progress[0];\n\n if (progress[1] == 0)\n unknownFound = true;\n }\n if (unknownFound) {\n totalSize = 0;\n }\n return [ totalSize, totalLoaded, errorDownload ];\n }\n\n //Stores the current progress of downloads\n this.onProgress = id => {\n return xhr => {\n this.progressMap[id] = [ xhr.loaded, xhr.total ];\n };\n }\n\n this.onError = finishCallback => {\n return xhr => {\n this.toBeDownloaded = this.toBeDownloaded - 1;\n errorDownload = true;\n console.error(`There is an issue with external resource ${xhr?.responseURL ? \": \" + xhr?.responseURL: \"\"}.`);\n const payload = {\n type: \"Error\",\n xhr\n };\n if (finishCallback) {\n finishCallback(payload);\n }\n }\n };\n\n let loadMultipleViews = (referenceURL, views) => {\n const defaultView = views.Default;\n if (views.Inline) {\n scene.setupMultipleViews(defaultView, views.Entries);\n } else {\n const promises = [];\n for (const [key, value] of Object.entries(views.Entries)) {\n if (referenceURL) {\n const newURL = createNewURL(value, referenceURL);\n promises.push(new Promise((resolve, reject) => {\n // Add parameters if we are sent them\n fetch(newURL)\n .then(response => response.json())\n .then(data => resolve({key: key, data: data}))\n .catch(data => reject(data));\n }));\n }\n }\n Promise.all(promises)\n .then(values => {\n const entries = {};\n values.forEach(entry => {\n entries[entry.key] = entry.data;\n });\n scene.setupMultipleViews(defaultView, entries);\n let zincCameraControls = scene.getZincCameraControls();\n if (zincCameraControls)\n zincCameraControls.setCurrentViewport(defaultView);\n viewLoaded = true;\n });\n }\n }\n\n /**\n * Load the viewport from an external location provided by the url.\n * @param {String} URL - address to the file containing viewport information.\n */\n this.loadViewURL = (url, finishCallback) => {\n this.toBeDownloaded += 1;\n const requestURL = resolveURL(url);\n fetch(requestURL)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n })\n .then((viewData) => {\n scene.setupMultipleViews(\"default\", { \"default\" : viewData });\n scene.resetView();\n viewLoaded = true;\n --this.toBeDownloaded;\n if (finishCallback !== undefined && typeof finishCallback === 'function') {\n finishCallback();\n }\n })\n .catch((error) => {\n console.error(`Fetch failed for URL: ${requestURL}`, error);\n (this.onError(finishCallback))({ responseURL: requestURL });\n });\n }\n\n/**\n * Load a legacy model(s) format with the provided URLs and parameters. This only loads the geometry\n * without any of the metadata. Therefore, extra parameters should be provided.\n *\n * @deprecated\n */\n this.loadModelsURL = (region, urls, colours, opacities, timeEnabled, morphColour, finishCallback) => {\n const number = urls.length;\n this.toBeDownloaded += number;\n for (let i = 0; i < number; i++) {\n const filename = urls[i];\n let colour = Zinc.defaultMaterialColor;\n let opacity = Zinc.defaultOpacity;\n if (colours != undefined && colours[i] != undefined)\n colour = colours[i] ? true : false;\n if (opacities != undefined && opacities[i] != undefined)\n opacity = opacities[i];\n let localTimeEnabled = 0;\n if (timeEnabled != undefined && timeEnabled[i] != undefined)\n localTimeEnabled = timeEnabled[i] ? true : false;\n let localMorphColour = 0;\n if (morphColour != undefined && morphColour[i] != undefined)\n localMorphColour = morphColour[i] ? true : false;\n primitivesLoader.load(resolveURL(filename), meshloader(region, colour, opacity, localTimeEnabled, localMorphColour, undefined, undefined,\n undefined, undefined, finishCallback), this.onProgress(filename), this.onError(finishCallback));\n }\n }\n\n /**\n * Load a legacy file format containing the viewport and its meta file from an external\n * location provided by the url. Use the new metadata format with\n * {@link Zinc.SceneLoader.#loadMetadataURL} instead.\n *\n * @param {String} URL - address to the file containing viewport and model information.\n * @deprecated\n */\n this.loadFromViewURL = (targetRegion, jsonFilePrefix, finishCallback) => {\n const requestURL = resolveURL(jsonFilePrefix + \"_view.json\");\n fetch(requestURL)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n })\n .then((viewData) => {\n scene.loadView(viewData);\n const urls = [];\n const filename_prefix = jsonFilePrefix + \"_\";\n for (let i = 0; i < viewData.numberOfResources; i++) {\n const filename = filename_prefix + (i + 1) + \".json\";\n urls.push(filename);\n }\n this.loadModelsURL(\n targetRegion,\n urls,\n viewData.colour,\n viewData.opacity,\n viewData.timeEnabled,\n viewData.morphColour,\n finishCallback\n );\n })\n .catch((error) => {\n console.error(`Failed to load view data from: ${requestURL}`, error);\n });\n }\n\n //Internal loader for a regular zinc geometry.\n const linesloader = (region, localTimeEnabled, localMorphColour, groupName,\n anatomicalId, renderOrder, lod, tubeLines, finishCallback) => {\n return (geometry, materials) => {\n const newLines = tubeLines ? new TubeLines() : new Lines();\n let material = undefined;\n if (materials && materials[0]) {\n material = new THREE.LineBasicMaterial({color:materials[0].color.clone()});\n if (1.0 > materials[0].opacity) {\n material.transparent = true;\n }\n material.opacity = materials[0].opacity;\n material.morphTargets = localTimeEnabled;\n material.vertexColors = materials[0].vertexColors;\n }\n let options = {};\n options.localTimeEnabled = localTimeEnabled;\n options.localMorphColour = localMorphColour;\n if (newLines) {\n newLines.createLineSegment(geometry, material, options);\n newLines.setName(groupName);\n newLines.setAnatomicalId(anatomicalId);\n newLines.setRenderOrder(renderOrder);\n region.addZincObject(newLines);\n newLines.setDuration(scene.getDuration());\n if (lod && lod.levels) {\n for (const [key, value] of Object.entries(lod.levels)) {\n newLines.addLOD(primitivesLoader, key, value.URL, value.Index, lod.preload);\n }\n }\n }\n --this.toBeDownloaded;\n geometry.dispose();\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newLines);\n };\n }\n\n /**\n * Load lines into this scene object.\n *\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadLinesURL = (region, url, timeEnabled, morphColour, groupName, finishCallback, options) => {\n\t let localTimeEnabled = 0;\n this.toBeDownloaded += 1;\n let isInline = options?.isInline ? options.isInline : false;\n let anatomicalId = options?.anatomicalId ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n\t if (timeEnabled != undefined)\n\t\t localTimeEnabled = timeEnabled ? true : false;\n\t let localMorphColour = 0;\n\t if (morphColour != undefined)\n\t\t localMorphColour = morphColour ? true : false;\n let tubeLines = options.tubeLines && !localTimeEnabled && !localMorphColour;\n if (isInline) {\n let object = primitivesLoader.parse( url );\n (linesloader(region, localTimeEnabled, localMorphColour, groupName, anatomicalId,\n renderOrder, options.lod, tubeLines, finishCallback))( object.geometry, object.materials );\n } else {\n primitivesLoader.load(url, linesloader(region, localTimeEnabled, localMorphColour, groupName,\n anatomicalId, renderOrder, options.lod, tubeLines, finishCallback), this.onProgress(url), this.onError(finishCallback),\n options.loaderOptions);\n }\n }\n\n const glyphsetloader = (region, glyphurl, groupName, finishCallback, options) => {\n return (data) => {\n let glyphsetData = data;\n if (typeof glyphsetData === 'string' || glyphsetData instanceof String) {\n glyphsetData = JSON.parse(data);\n }\n let isInline = (options && options.isInline) ? options.isInline : undefined;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let displayLabels = (options && options.displayLabels) ? options.displayLabels : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n const newGlyphset = new Glyphset();\n newGlyphset.setDuration(scene.getDuration());\n newGlyphset.groupName = groupName;\n let myCallback = () => {\n --this.toBeDownloaded;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newGlyphset);\n }\n ++this.toBeDownloaded;\n if (isInline) {\n newGlyphset.load(glyphsetData, glyphurl, myCallback, isInline, displayLabels);\n }\n else {\n newGlyphset.load(glyphsetData, resolveURL(glyphurl), myCallback, isInline, displayLabels);\n }\n newGlyphset.setAnatomicalId(anatomicalId);\n newGlyphset.setRenderOrder(renderOrder);\n region.addZincObject(newGlyphset);\n }\n };\n\n //Load a glyphset into this scene.\n const onLoadGlyphsetReady = (region, xmlhttp, glyphurl, groupName, finishCallback, options) => {\n return () => {\n if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {\n let glyphsetData = JSON.parse(xmlhttp.responseText);\n if (Array.isArray(glyphsetData)) {\n const index = options?.loaderOptions?.index;\n if (index !== undefined) {\n if (glyphsetData.length > index) {\n glyphsetData = glyphsetData[index];\n }\n }\n }\n (glyphsetloader(region, glyphurl, groupName, finishCallback, options))(glyphsetData);\n }\n };\n };\n\n /**\n * Load a glyphset into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {String} glyphurl - regular json model file providing geometry of the glyph.\n * @param {String} groupName - name to assign the glyphset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadGlyphsetURL = (region, metaurl, glyphurl, groupName, finishCallback, options) => {\n const isInline = (options && options.isInline) ? options.isInline : false;\n if (isInline) {\n (glyphsetloader(region, glyphurl, groupName, finishCallback, options))(metaurl);\n } else {\n primitivesLoader.load(metaurl, glyphsetloader(region, glyphurl, groupName,\n finishCallback, options), this.onProgress(metaurl),\n this.onError(finishCallback), options.loaderOptions);\n\n /*\n const xmlhttp = new XMLHttpRequest();\n\n xmlhttp.onreadystatechange = onLoadGlyphsetReady(region, xmlhttp, glyphurl,\n groupName, finishCallback, options);\n xmlhttp.open(\"GET\", resolveURL(metaurl), true);\n xmlhttp.send();*/\n }\n }\n\n //Internal loader for zinc pointset.\n const pointsetloader = (region, localTimeEnabled, localMorphColour, groupName, anatomicalId, renderOrder, finishCallback) => {\n return (geometry, materials) => {\n const newPointset = new Pointset();\n let material = new THREE.PointsMaterial({ alphaTest: 0.5, size: 10, sizeAttenuation: false });\n if (materials && materials[0]) {\n if (1.0 > materials[0].opacity) {\n material.transparent = true;\n }\n material.opacity = materials[0].opacity;\n material.color = materials[0].color;\n material.morphTargets = localTimeEnabled;\n material.vertexColors = materials[0].vertexColors;\n }\n let options = {};\n options.localTimeEnabled = localTimeEnabled;\n options.localMorphColour = localMorphColour;\n if (newPointset) {\n newPointset.createMesh(geometry, material, options);\n newPointset.setName(groupName);\n newPointset.setAnatomicalId(anatomicalId);\n region.addZincObject(newPointset);\n newPointset.setDuration(scene.getDuration());\n newPointset.setRenderOrder(renderOrder);\n }\n geometry.dispose();\n --this.toBeDownloaded;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newPointset);\n };\n }\n\n /**\n * Read a STL file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the STL geometry is succssfully loaded.\n */\n this.loadSTL = (region, url, groupName, finishCallback) => {\n this.toBeDownloaded += 1;\n const colour = Zinc.defaultMaterialColor;\n const opacity = Zinc.defaultOpacity;\n const loader = new STLLoader();\n loader.crossOrigin = \"Anonymous\";\n loader.load(resolveURL(url), meshloader(region, colour, opacity, false,\n false, groupName, undefined, undefined, undefined, finishCallback));\n }\n\n /**\n * Read a OBJ file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the OBJ geometry is succssfully loaded.\n */\n this.loadOBJ = (region, url, groupName, finishCallback) => {\n this.toBeDownloaded += 1;\n const colour = Zinc.defaultMaterialColor;\n const opacity = Zinc.defaultOpacity;\n const loader = new OBJLoader();\n loader.crossOrigin = \"Anonymous\";\n loader.load(resolveURL(url), meshloader(region, colour, opacity, false,\n false, groupName, undefined, undefined, undefined, finishCallback));\n }\n\n /**\n * Load a geometry into this scene, this is a subsequent called from\n * {@link Zinc.Scene#loadMetadataURL}, although it can be used to read\n * in geometry into the scene externally.\n *\n * @param {String} url - regular json model file providing geometry.\n * @param {Boolean} timeEnabled - Indicate if geometry morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {STRING} fileFormat - name supported formats are STL, OBJ and JSON.\n * @param {Function} finishCallback - Callback function which will be called\n * once the geometry is succssfully loaded in.\n */\n const loadSurfaceURL = (region ,url, timeEnabled, morphColour, groupName, finishCallback, options) => {\n this.toBeDownloaded += 1;\n const colour = Zinc.defaultMaterialColor;\n const opacity = Zinc.defaultOpacity;\n let localTimeEnabled = 0;\n let isInline = (options && options.isInline) ? options.isInline : false;\n let fileFormat = (options && options.fileFormat) ? options.fileFormat : undefined;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n if (timeEnabled != undefined)\n localTimeEnabled = timeEnabled ? true : false;\n let localMorphColour = 0;\n if (morphColour != undefined)\n localMorphColour = morphColour ? true : false;\n let loader = primitivesLoader;\n if (fileFormat !== undefined) {\n if (fileFormat == \"STL\") {\n loader = new STLLoader();\n } else if (fileFormat == \"OBJ\") {\n loader = new OBJLoader();\n loader.crossOrigin = \"Anonymous\";\n loader.load(url, objloader(region, colour, opacity, localTimeEnabled,\n localMorphColour, groupName, anatomicalId, finishCallback), this.onProgress(url), this.onError,\n options.loaderOptions);\n return;\n }\n }\n if (isInline) {\n const object = primitivesLoader.parse( url );\n\t\t\t(meshloader(region, colour, opacity, localTimeEnabled,\n localMorphColour, groupName, anatomicalId, renderOrder, options, finishCallback))( object.geometry, object.materials );\n } else {\n loader.crossOrigin = \"Anonymous\";\n primitivesLoader.load(url, meshloader(region, colour, opacity, localTimeEnabled,\n localMorphColour, groupName, anatomicalId, renderOrder, options, finishCallback),\n this.onProgress(url), this.onError(finishCallback), options.loaderOptions);\n }\n };\n\n //Object to keep track of number of items downloaded and when all items are downloaded\n //allCompletedCallback is called\n const metaFinishCallback = function (numberOfDownloaded, finishCallback, allCompletedCallback) {\n let downloadedItem = 0;\n return zincObject => {\n downloadedItem = downloadedItem + 1;\n if (zincObject && (finishCallback != undefined) && (typeof finishCallback == 'function')) {\n finishCallback(zincObject);\n }\n if (downloadedItem == numberOfDownloaded) {\n if (viewLoaded === false)\n scene.viewAll();\n if (allCompletedCallback != undefined && (typeof allCompletedCallback == 'function')) {\n allCompletedCallback();\n let zincCameraControls = scene.getZincCameraControls();\n if (zincCameraControls) {\n zincCameraControls.calculateMaxAllowedDistance(scene);\n }\n }\n }\n };\n };\n\n /**\n * Load a pointset into this scene object.\n *\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadPointsetURL = (region, url, timeEnabled, morphColour, groupName, finishCallback, options) => {\n let localTimeEnabled = 0;\n this.toBeDownloaded += 1;\n if (timeEnabled != undefined)\n localTimeEnabled = timeEnabled ? true : false;\n let localMorphColour = 0;\n if (morphColour != undefined)\n localMorphColour = morphColour ? true : false;\n let isInline = (options && options.isInline) ? options.isInline : false;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n if (isInline) {\n const object = primitivesLoader.parse( url );\n (pointsetloader(region, localTimeEnabled, localMorphColour, groupName,\n anatomicalId, renderOrder, finishCallback))(object.geometry, object.materials );\n } else {\n primitivesLoader.load(url, pointsetloader(region, localTimeEnabled, localMorphColour,\n groupName, anatomicalId, renderOrder, finishCallback),\n this.onProgress(url), this.onError(finishCallback), options.loaderOptions);\n }\n }\n\n const loadTexture = (region, referenceURL, textureData, groupName, finishCallback, options) => {\n let isInline = (options && options.isInline) ? options.isInline : undefined;\n let anatomicalId = (options && options.anatomicalId) ? options.anatomicalId : undefined;\n let renderOrder = (options && \"renderOrder\" in options) ? options.renderOrder : undefined;\n let newTexture = undefined;\n if (textureData) {\n if (referenceURL && textureData.images && textureData.images.source) {\n const source = textureData.images.source;\n for (let i = 0; i < source.length; i++) {\n const newURL = createNewURL(source[i], referenceURL);\n textureData.images.source[i] = newURL;\n }\n }\n if (textureData.type === \"slides\") {\n newTexture = new TextureSlides();\n }\n if (newTexture) {\n newTexture.groupName = groupName;\n let myCallback = () => {\n //Add zincObject after it has sort out all the required download\n region.addZincObject(newTexture);\n --this.toBeDownloaded;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newTexture);\n }\n ++this.toBeDownloaded;\n newTexture.load(textureData, myCallback, isInline);\n newTexture.setAnatomicalId(anatomicalId);\n newTexture.setRenderOrder(renderOrder);\n }\n }\n };\n\n /**\n * Load a texture into this scene object.\n *\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadTextureURL = (region, url, groupName, finishCallback, options) => {\n const isInline = (options && options.isInline) ? options.isInline : false;\n if (isInline) {\n loadTexture(region, undefined, url, groupName, finishCallback, options);\n } else {\n const requestURL = resolveURL(url);\n fetch(requestURL)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const referenceURL = response.url || (new URL(requestURL)).href;\n return response.json().then((textureData) => ({ textureData, referenceURL }));\n })\n .then(({textureData, referenceURL}) => {\n loadTexture(region, referenceURL, textureData, groupName, finishCallback, options);\n })\n .catch((error) => {\n console.error(`Fetch failed for texture URL: ${requestURL}`, error);\n });\n }\n }\n\n /**\n * Add a user provided {THREE.Geometry} into the scene as zinc geometry.\n *\n * @param {Three.Geometry} geometry - The threejs geometry to be added as {@link Zinc.Geometry}.\n * @param {THREE.Color} color - Colour to be assigned to this geometry, overrided if materialIn is provided.\n * @param {Number} opacity - Opacity to be set for this geometry, overrided if materialIn is provided.\n * @param {Boolean} localTimeEnabled - Set this to true if morph geometry is present, overrided if materialIn is provided.\n * @param {Boolean} localMorphColour - Set this to true if morph colour is present, overrided if materialIn is provided.\n * @param {Boolean} external - Set this to true if morph geometry is present, overrided if materialIn is provided.\n * @param {Function} finishCallback - Callback once the geometry has been added succssfully.\n * @param {THREE.Material} materialIn - Material to be set for this geometry if it is present.\n *\n * @returns {Zinc.Geometry}\n */\n const addZincGeometry = (\n region,\n geometryIn,\n colour,\n opacity,\n localTimeEnabled,\n localMorphColour,\n finishCallback,\n materialIn,\n groupName,\n renderOrder,\n anatomicalId\n ) => {\n let options = {};\n options.colour = colour;\n options.opacity = opacity;\n options.localTimeEnabled = localTimeEnabled;\n options.localMorphColour = localMorphColour\n const newGeometry = new Geometry();\n newGeometry.createMesh(geometryIn, materialIn, options);\n if (newGeometry.getMorph()) {\n newGeometry.setName(groupName);\n newGeometry.setRenderOrder(renderOrder);\n newGeometry.setAnatomicalId(anatomicalId);\n if (region) region.addZincObject(newGeometry);\n newGeometry.setDuration(scene.getDuration());\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback(newGeometry);\n if (newGeometry.videoHandler)\n scene.setVideoHandler(newGeometry.videoHandler);\n return newGeometry;\n }\n return undefined;\n }\n\n //Internal loader for a regular zinc geometry.\n const meshloader = (\n region,\n colour,\n opacity,\n localTimeEnabled,\n localMorphColour,\n groupName,\n anatomicalId,\n renderOrder,\n options,\n finishCallback\n ) => {\n return (geometry, materials) => {\n let material = undefined;\n if (materials && materials[0]) {\n material = materials[0];\n }\n const zincGeometry = addZincGeometry(region, geometry, colour, opacity,\n localTimeEnabled, localMorphColour, undefined, material, groupName, renderOrder, anatomicalId);\n if (options.lod && options.lod.levels) {\n for (const [key, value] of Object.entries(options.lod.levels)) {\n zincGeometry.addLOD(primitivesLoader, key, value.URL, value.Index, options.lod.preload);\n }\n }\n --this.toBeDownloaded;\n geometry.dispose();\n if (finishCallback != undefined && (typeof finishCallback == 'function')) {\n finishCallback(zincGeometry);\n }\n };\n }\n\n //Turn ISO 8601 duration string into an array.\n const parseDuration = (durationString) => {\n const regex = /P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?$/;\n const [, years, months, weeks, days, hours, mins, secs] =\n durationString.match(regex);\n return {years: years,months: months, weeks: weeks, days: days,\n hours: hours, mins: mins, secs: secs };\n }\n\n //Load settings from metadata item.\n this.loadSettings = (item) => {\n if (item) {\n //duration uses the ISO 8601 standard - PnYnMnDTnHnMnS\n if (item.Duration) {\n const duration = parseDuration(item.Duration);\n scene.setDurationFromObject(duration);\n }\n if (item.OriginalDuration) {\n const duration = parseDuration(item.OriginalDuration);\n scene.setOriginalDurationFromObject(duration);\n }\n if (item.TimeStamps) {\n for (const key in item.TimeStamps) {\n const time = parseDuration(item.TimeStamps[key]);\n scene.addMetadataTimeStamp(key, time);\n }\n }\n }\n }\n\n //Function to process each of the graphical metadata item except for view and\n //settings.\n const readPrimitivesItem = (region, referenceURL, item, order, finishCallback) => {\n if (item) {\n let newURL = undefined;\n let isInline = false;\n if (item.URL) {\n //Convert it into an array\n newURL = item.URL;\n if (referenceURL)\n newURL = createNewURL(newURL, referenceURL);\n } else if (item.Inline) {\n newURL = item.Inline.URL;\n isInline = true;\n }\n const lod = {};\n if (item.LOD && item.LOD.Levels) {\n lod.preload = item.LOD.Preload ? true : false;\n lod.levels = {};\n for (const [key, value] of Object.entries(item.LOD.Levels)) {\n lod.levels[key] = {};\n lod.levels[key][\"URL\"] = createNewURL(value.URL, referenceURL);\n lod.levels[key][\"Index\"] = value.Index;\n }\n }\n let groupName = item.GroupName;\n if (groupName === undefined || groupName === \"\") {\n groupName = \"_Unnamed\";\n }\n\n let options = {\n loaderOptions: {\n index: item.Index,\n },\n isInline: isInline,\n fileFormat: item.FileFormat,\n anatomicalId: item.AnatomicalId,\n compression: item.compression,\n tubeLines: item.tubeLines,\n lod: lod,\n renderOrder: order\n };\n\n switch (item.Type) {\n case \"Surfaces\":\n loadSurfaceURL(region, newURL, item.MorphVertices, item.MorphColours, groupName, finishCallback, options);\n break;\n case \"Glyph\":\n let newGeometryURL = undefined;\n if (!isInline) {\n newGeometryURL = item.GlyphGeometriesURL;\n newGeometryURL = createNewURL(item.GlyphGeometriesURL, referenceURL);\n } else {\n newGeometryURL = item.Inline.GlyphGeometriesURL;\n }\n if (item.DisplayLabels) {\n options.displayLabels = true;\n }\n options.loaderOptions.isGlyphsets = true;\n this.loadGlyphsetURL(region, newURL, newGeometryURL, groupName, finishCallback, options);\n break;\n case \"Points\":\n this.loadPointsetURL(region, newURL, item.MorphVertices, item.MorphColours, groupName, finishCallback, options);\n break;\n case \"Lines\":\n this.loadLinesURL(region, newURL, item.MorphVertices, item.MorphColours, groupName, finishCallback, options);\n break;\n case \"Texture\":\n this.loadTextureURL(region, newURL, groupName, finishCallback, options);\n break;\n default:\n break;\n }\n }\n };\n\n //Function to read the view item first\n const readViewAndSettingsItem = (referenceURL, item, finishCallback) => {\n if (item) {\n let newURL = undefined;\n let isInline = false;\n if (item.URL) {\n newURL = item.URL;\n if (referenceURL)\n newURL = createNewURL(item.URL, referenceURL);\n } else if (item.Inline) {\n newURL = item.Inline.URL;\n isInline = true;\n }\n switch (item.Type) {\n case \"View\":\n if (isInline) {\n scene.setupMultipleViews(\"default\", { \"default\" : newURL});\n viewLoaded = true;\n if (finishCallback != undefined && (typeof finishCallback == 'function'))\n finishCallback();\n }\n else\n this.loadViewURL(newURL, finishCallback);\n break;\n case \"Settings\":\n this.loadSettings(item);\n break;\n default:\n break;\n }\n }\n };\n\n /**\n * Load GLTF into this scene object.\n *\n * @param {String} url - URL to the GLTF file\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadGLTF = (region, url, finishCallback, allCompletedCallback, options) => {\n const loader = new GLTFToZincJSLoader();\n loader.load(scene, region, url, finishCallback, allCompletedCallback, options);\n }\n\n let loadRegions = (currentRegion, referenceURL, regions, callback) => {\n if (regions.Primitives) {\n regions.Primitives.forEach(primitive => {\n let order = 1;\n if (primitive.Order)\n order = primitive.Order;\n readPrimitivesItem(currentRegion, referenceURL, primitive, order, callback);\n });\n }\n if (regions.Transformation) {\n currentRegion.setTransformation(regions.Transformation);\n }\n if (regions.Children) {\n for (const [regionName, value] of Object.entries(regions.Children)) {\n const childRegion = currentRegion.findOrCreateChildFromPath(regionName);\n if (childRegion) {\n loadRegions(childRegion, referenceURL, value, callback);\n }\n }\n }\n }\n\n let supplementPrimitivesArray = (array, options) => {\n let newArray = array;\n const include = options?.enabled?.include;\n const exclude = options?.enabled?.exclude;\n const tubeLines = options?.tubeLines;\n if (include?.length || exclude?.length) {\n if (include) {\n newArray = array.filter((item) => {\n if (item.Type === \"View\") {\n return true;\n }\n for (let i = 0; i < include.length; i++) {\n if (isRegionGroup(item.RegionPath, item.GroupName, include[i])) {\n return true;\n }\n }\n return false;\n });\n }\n if (exclude) {\n newArray = newArray.filter((item) => {\n if (item.Type === \"View\") {\n return true;\n }\n for (let i = 0; i < exclude.length; i++) {\n if (isRegionGroup(item.RegionPath, item.GroupName, exclude[i])) {\n return false;\n }\n }\n return true;\n });\n }\n }\n if (tubeLines) {\n newArray.forEach((item) => {\n if (item.Type === \"Lines\") {\n item.tubeLines = true;\n }\n });\n }\n return newArray;\n }\n\n let supplementMetadataInArray = (metadata, options) => {\n if (Array.isArray(metadata)) {\n return supplementPrimitivesArray(metadata, options);\n }\n return metadata;\n }\n\n let getNumberOfDownloadsInArray = (array, includeViews) => {\n if (Array.isArray(array)) {\n let count = 0;\n for (let i = 0; i < array.length; i++) {\n if (array[i].Type && (\n (includeViews && array[i].Type === \"View\") ||\n array[i].Type === \"Surfaces\" ||\n array[i].Type === \"Glyph\" ||\n array[i].Type === \"Points\" ||\n array[i].Type === \"Lines\" ||\n array[i].Type === \"Texture\"))\n {\n count++;\n }\n }\n return count;\n }\n return 0;\n }\n\n let getNumberOfObjectsInRegions = (regionJson) => {\n let counts = regionJson.Primitives ?\n getNumberOfDownloadsInArray(regionJson.Primitives, false) : 0;\n if (regionJson.Children) {\n Object.values(regionJson.Children).forEach(childRegion => {\n counts += getNumberOfObjectsInRegions(childRegion);\n });\n }\n return counts;\n }\n\n let getNumberOfObjects = (metadata) => {\n if (Array.isArray(metadata)) {\n return getNumberOfDownloadsInArray(metadata, true);\n } else if ((typeof metadata) === \"object\" && metadata !== null) {\n if (metadata.Version === \"2.0\") {\n return getNumberOfObjectsInRegions(metadata.Regions);\n }\n }\n }\n\n let readVersionOneRegionPath = (region, referenceURL, item, order, callback) => {\n let targetRegion = region;\n if (item.RegionPath && item.RegionPath !== \"\") {\n targetRegion = region.findOrCreateChildFromPath(item.RegionPath);\n }\n //Render order is set to i * 2 to account for front and back rendering\n readPrimitivesItem(targetRegion, referenceURL, item, order * 2, callback);\n }\n\n let loadVersionOne = (targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback, options) => {\n const filteredMetada = supplementMetadataInArray(metadata, options);\n let numberOfObjects = getNumberOfObjects(filteredMetada);\n // view file does not receive callback\n let callback = new metaFinishCallback(numberOfObjects, finishCallback, allCompletedCallback);\n // Prioritise the view file and settings before loading anything else\n for (let i = 0; i < metadata.length; i++)\n readViewAndSettingsItem(referenceURL, filteredMetada[i], callback);\n for (let i = 0; i < metadata.length; i++) {\n readVersionOneRegionPath(targetRegion, referenceURL, filteredMetada[i], i, callback);\n }\n }\n\n let loadVersionTwo = (targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback) => {\n let numberOfObjects = getNumberOfObjects(metadata);\n // view file does not receive callback\n let callback = new metaFinishCallback(numberOfObjects, finishCallback, allCompletedCallback);\n if (metadata.Settings)\n this.loadSettings(metadata.Settings);\n if (metadata.Views)\n loadMultipleViews(referenceURL, metadata.Views, referenceURL);\n if (metadata.Regions)\n loadRegions(targetRegion, referenceURL, metadata.Regions, callback);\n }\n\n /**\n * Load a metadata file from the provided URL into this scene. Once\n * succssful scene proceeds to read each items into scene for visualisations.\n *\n * @param {String} url - Location of the metadata file\n * @param {Function} finishCallback - Callback function which will be called\n * @param {options} Optional settings, it can be used to ignore some regions/groups\n * in the metadata file. Only supports version 1 at this moment.\n * for each glyphset and geometry that has been written in.\n */\n this.loadMetadataURL = (targetRegion, url, finishCallback, allCompletedCallback, options) => {\n const requestURL = resolveURL(url);\n fetch(requestURL)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const referenceURL = response.url || (new URL(requestURL)).href;\n return response.json().then((metadata) => ({ metadata, referenceURL }));\n })\n .then(({metadata, referenceURL}) => {\n scene.resetMetadata();\n scene.resetDuration();\n viewLoaded = false;\n if (Array.isArray(metadata)) {\n loadVersionOne(targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback, options);\n } else if (typeof metadata === \"object\" && metadata !== null) {\n if (metadata.Version === \"2.0\") {\n loadVersionTwo(targetRegion, metadata, referenceURL, finishCallback, allCompletedCallback);\n }\n }\n })\n .catch((error) => {\n console.error(`Fetch failed for URL: ${requestURL}`, error);\n });\n }\n}\n\nexport { SceneLoader };\n","import * as THREE from 'three';\nimport { CameraControls, StereoEffect } from './controls';\nimport { LineSegments } from './three/line/LineSegments';\nimport { MarkerCluster } from './primitives/markerCluster';\nimport { Minimap } from './minimap';\nimport { Region } from './region';\nimport { Points } from './three/Points';\nimport { SceneExporter } from './sceneExporter';\nimport { SceneLoader } from './sceneLoader';\nimport { Viewport } from './controls';\nimport {\n createBufferGeometry,\n createNewSpriteText,\n getCircularTexture\n} from './utilities';\n\nlet uniqueiId = 0;\n\nconst getUniqueId = function () {\n return \"sc\" + uniqueiId++;\n}\n\nconst defaultMetadata = function() {\n return {\n Duration: \"6 secs\",\n OriginalDuration: \"-\",\n TimeStamps: {}\n }\n};\n\nconst defaultDuration = 6000;\n\n/**\n * A Scene contains {@link Region},and\n * {@link CameraControls} which controls the viewport and additional features.\n * It is the main object used for controlling what is and what is not displayed\n * on the renderer.\n *\n * @class\n * @param {Object} containerIn - Container to create the renderer on.\n * @author Alan Wu\n * @return {Scene}\n */\nconst Scene = function (containerIn, rendererIn) {\n const container = containerIn;\n let cameraHelper = undefined;\n let videoHandler = undefined;\n let sceneLoader = new SceneLoader(this);\n let minimap = undefined;\n let zincObjectAddedCallbacks = {};\n let zincObjectAddedCallbacks_id = 0;\n let zincObjectRemovedCallbacks = {};\n let zincObjectRemovedCallbacks_id = 0;\n const scene = new THREE.Scene();\n const miniAxesScene = new THREE.Scene();\n const rootRegion = new Region(undefined, this);\n scene.add(rootRegion.getGroup());\n const tempGroup = new THREE.Group();\n scene.add(tempGroup);\n /**\n * A {@link THREE.DirectionalLight} object for controlling lighting of this scene.\n */\n this.directionalLight = undefined;\n /**\n * a {@link THREE.AmbientLight} for controlling the ambient lighting of this scene.\n */\n this.ambient = undefined;\n this.camera = undefined;\n let duration = 6000;\n let zincCameraControls = undefined;\n this.sceneName = undefined;\n let stereoEffectFlag = false;\n let stereoEffect = undefined;\n this.autoClearFlag = true;\n this.displayMarkers = false;\n this.displayMinimap = false;\n this.displayMiniAxes = false;\n this.minimapScissor = {\n x_offset: 16,\n y_offset: 16,\n width: 128,\n height: 128,\n align: \"top-right\",\n updateRequired: true\n };\n let scissor = {x: 0, y: 0};\n let metadata = defaultMetadata();\n let _markerTarget = new THREE.Vector2();\n let pickableObjectsList = [];\n this.forcePickableObjectsUpdate = false;\n this.uuid = getUniqueId();\n let markerCluster = new MarkerCluster(this);\n markerCluster.disable();\n scene.add(markerCluster.group);\n let axisDisplay = {\n main: [],\n mini: [],\n }\n const _v3 = new THREE.Vector3( 0, 0, 0 );\n\n const getDrawingWidth = () => {\n if (container)\n if (typeof container.clientWidth !== \"undefined\")\n return container.clientWidth;\n else\n return container.width;\n return 0;\n }\n\n const getDrawingHeight = () => {\n if (container)\n if (typeof container.clientHeight !== \"undefined\")\n return container.clientHeight;\n else\n return container.height;\n return 0;\n }\n\n /**\n * This function returns a three component array, which contains\n * [totalsize, totalLoaded and errorDownload] of all the downloads happening\n * in this scene.\n * @returns {Array}\n */\n this.getDownloadProgress = () => {\n return sceneLoader.getDownloadProgress();\n }\n\n //called from Renderer when panel has been resized\n this.onWindowResize = () => {\n const wHeight = getDrawingHeight();\n this.camera.aspect = getDrawingWidth() / wHeight;\n this.camera.updateProjectionMatrix();\n this.minimapScissor.updateRequired = true;\n zincCameraControls.onResize();\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(wHeight);\n }\n\n /**\n * Reset the viewport of this scene to its original state.\n */\n this.resetView = () => {\n this.onWindowResize();\n zincCameraControls.resetView();\n }\n\n /**\n * Set the zoom level by unit scroll rate\n */\n this.changeZoomByScrollRateUnit = unit => {\n zincCameraControls.changeZoomByScrollRateUnit(unit);\n }\n\n //Setup the camera for this scene, it also initialise the lighting\n const setupCamera = () => {\n this.camera = new THREE.PerspectiveCamera(40, getDrawingWidth() / getDrawingHeight(), 0.0, 10.0);\n this.ambient = new THREE.AmbientLight(0xffffff, 0.2);\n scene.add(this.ambient);\n\n this.directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);\n scene.add(this.directionalLight);\n zincCameraControls = new CameraControls(this.camera, rendererIn.domElement, rendererIn, this);\n\n zincCameraControls.setDirectionalLight(this.directionalLight);\n zincCameraControls.resetView();\n\n minimap = new Minimap(this);\n };\n\n setupCamera();\n\n /**\n * Load the viewport Data from the argument {@link Zinc.Viewport} and set it as\n * the default viewport of this scene.\n *\n * @param {Zinc.Viewport} viewData - Viewport data to be loaded.\n */\n this.loadView = settings => {\n const viewPort = new Viewport();\n viewPort.setFromObject(settings);\n zincCameraControls.setCurrentCameraSettings(viewPort);\n return true;\n }\n\n /**\n * Set up multiple views.\n *\n * @param {Zinc.Viewport} viewData - Viewport data to be loaded.\n */\n this.setupMultipleViews = (defaultView, entries) => {\n for (const [name, settings] of Object.entries(entries)) {\n const viewport = new Viewport();\n viewport.setFromObject(settings);\n zincCameraControls.addViewport(name, viewport);\n }\n zincCameraControls.setDefaultViewport(defaultView);\n }\n\n /**\n * Get the bounding box of all the object in this scene only.\n *\n * @returns {THREE.Box3}\n */\n this.getBoundingBox = () => {\n return rootRegion.getBoundingBox(true);\n }\n\n /**\n * Adjust the viewport to display the desired volume provided by the bounding box.\n *\n * @param {THREE.Box3} boundingBox - The bounding box which describes the volume of\n * which we the viewport should be displaying.\n */\n this.viewAllWithBoundingBox = boundingBox => {\n if (boundingBox) {\n const viewport = zincCameraControls.getViewportFromBoundingBox(boundingBox, 1.0);\n zincCameraControls.setCurrentCameraSettings(viewport);\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(getDrawingHeight());\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n /**\n * Adjust zoom distance to include all primitives in scene only.\n */\n this.viewAll = () => {\n const boundingBox = this.getBoundingBox();\n this.viewAllWithBoundingBox(boundingBox);\n markerCluster.markerUpdateRequired = true;\n }\n\n /**\n * A function which iterates through the list of geometries and call the callback\n * function with the geometries as the argument.\n * @param {Function} callbackFunction - Callback function with the geometry\n * as an argument.\n */\n this.forEachGeometry = callbackFunction => {\n rootRegion.forEachGeometry(callbackFunction, true);\n }\n\n /**\n * A function which iterates through the list of glyphsets and call the callback\n * function with the glyphset as the argument.\n * @param {Function} callbackFunction - Callback function with the glyphset\n * as an argument.\n */\n this.forEachGlyphset = callbackFunction => {\n rootRegion.forEachGlyphset(callbackFunction, true);\n }\n\n /**\n * A function which iterates through the list of pointsets and call the callback\n * function with the pointset as the argument.\n * @param {Function} callbackFunction - Callback function with the pointset\n * as an argument.\n */\n this.forEachPointset = callbackFunction => {\n rootRegion.forEachPointset(callbackFunction, true);\n }\n\n /**\n * A function which iterates through the list of lines and call the callback\n * function with the lines as the argument.\n * @param {Function} callbackFunction - Callback function with the lines\n * as an argument.\n */\n this.forEachLine = callbackFunction => {\n rootRegion.forEachLine(callbackFunction, true);\n }\n\n /**\n * Find and return all geometries in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findGeometriesWithGroupName = GroupName => {\n return rootRegion.findGeometriesWithGroupName(GroupName, true);\n }\n\n /**\n * Find and return all pointsets in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findPointsetsWithGroupName = GroupName => {\n return rootRegion.findPointsetsWithGroupName(GroupName, true);\n }\n /**\n * Find and return all glyphsets in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findGlyphsetsWithGroupName = GroupName => {\n return rootRegion.findGlyphsetsWithGroupName(GroupName, true);\n }\n\n /**\n * Find and return all lines in this scene with the matching GroupName.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findLinesWithGroupName = GroupName => {\n return rootRegion.findLinesWithGroupName(GroupName, true);\n }\n\n /**\n * Find a list of objects with the specified name, this will\n * tranverse through the region tree to find all child objects\n * with matching name.\n *\n * @param {String} GroupName - Groupname to match with.\n * @returns {Array}\n */\n this.findObjectsWithGroupName = GroupName => {\n return rootRegion.findObjectsWithGroupName(GroupName, true);\n }\n\n this.findObjectsWithAnatomicalId = anatomicalId => {\n return rootRegion.findObjectsWithAnatomicalId(anatomicalId, true);\n }\n\n /**\n * Get the bounding box of all zinc objects in list.\n *\n * @param {Array} objectsArray - Groupname to match with.\n * @returns {THREE.Box3}\n */\n this.getBoundingBoxOfZincObjects = objectsArray => {\n let boundingBox = undefined;\n for (let i = 0; i < objectsArray.length; i++) {\n let box = objectsArray[i].getBoundingBox();\n if (box) {\n if (!boundingBox)\n boundingBox = box;\n else\n boundingBox.union(box);\n }\n }\n return boundingBox;\n }\n\n /**\n * Convert the vector3 into screen coordinates.\n *\n * @param {THREE.Vector3} point - Vector 3 containing the point to convert,\n * this vector will be overwritten with the returned value.\n * @param {Array} objectsArray - Groupname to match with.\n * @returns {THREE.Vector3}\n */\n this.vectorToScreenXY = point => {\n point.project(this.camera);\n let width = getDrawingWidth();\n let height = getDrawingHeight();\n let widthHalf = (width / 2);\n let heightHalf = (height / 2);\n point.x = (point.x * widthHalf) + widthHalf;\n point.y = - (point.y * heightHalf) + heightHalf;\n return point;\n }\n\n /**\n * Get the screen coordinate of the centroid of provided list of objects.\n *\n * @param {Array} zincObjects - List of {@link ZincObject}.\n * @returns {THREE.Vector3}\n */\n this.getObjectsScreenXY = zincObjects => {\n if (zincObjects && zincObjects.length > 0) {\n let boundingBox = this.getBoundingBoxOfZincObjects(zincObjects);\n const center = new THREE.Vector3();\n boundingBox.getCenter(center);\n return this.vectorToScreenXY(center);\n }\n return undefined;\n }\n\n /**\n * Get the screen coordinate of the centroid of all objects\n * in scene with the provided name.\n *\n * @param {String} name - List of {@link ZincObject}.\n * @returns {THREE.Vector3}\n */\n this.getNamedObjectsScreenXY = name => {\n let zincObjects = this.findObjectsWithGroupName(name);\n return this.getObjectsScreenXY(zincObjects);\n };\n\n /**\n * Add zinc object into the root {@link Region} of sfcene.\n *\n * @param {ZincObject} - zinc object ot be added.\n * @returns {THREE.Vector3}\n */\n this.addZincObject = zincObject => {\n if (zincObject) {\n rootRegion.addZincObject(zincObject);\n if (zincCameraControls)\n zincCameraControls.calculateMaxAllowedDistance(this);\n }\n }\n\n /**\n * Load a glyphset into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {String} glyphurl - regular json model file providing geometry of the glyph.\n * @param {String} groupName - name to assign the glyphset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadGlyphsetURL = (metaurl, glyphurl, groupName, finishCallback) => {\n sceneLoader.loadGlyphsetURL(rootRegion, metaurl, glyphurl, groupName, finishCallback);\n }\n\n /**\n * Load a pointset into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadPointsetURL = (url, timeEnabled, morphColour, groupName, finishCallback) => {\n sceneLoader.loadPointsetURL(rootRegion, url, timeEnabled, morphColour, groupName, finishCallback);\n }\n\n /**\n * Load lines into this scene object.\n *\n * @param {String} metaurl - Provide informations such as transformations, colours\n * and others for each of the glyph in the glyphsset.\n * @param {Boolean} timeEnabled - Indicate if morphing is enabled.\n * @param {Boolean} morphColour - Indicate if color morphing is enabled.\n * @param {STRING} groupName - name to assign the pointset's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the glyphset is succssfully load in.\n */\n this.loadLinesURL = (url, timeEnabled, morphColour, groupName, finishCallback) => {\n sceneLoader.loadLinesURL(rootRegion, url, timeEnabled, morphColour, groupName, finishCallback);\n }\n\n /**\n * Read a STL file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the STL geometry is succssfully loaded.\n */\n this.loadSTL = (url, groupName, finishCallback) => {\n sceneLoader.loadSTL(rootRegion, url, groupName, finishCallback);\n }\n\n /**\n * Read a OBJ file into this scene, the geometry will be presented as\n * {@link Zinc.Geometry}.\n *\n * @param {STRING} url - location to the STL file.\n * @param {STRING} groupName - name to assign the geometry's groupname to.\n * @param {Function} finishCallback - Callback function which will be called\n * once the OBJ geometry is succssfully loaded.\n */\n this.loadOBJ = (url, groupName, finishCallback) => {\n sceneLoader.loadOBJ(rootRegion, url, groupName, finishCallback);\n }\n\n /**\n * Load a metadata file from the provided URL into this scene. Once\n * succssful scene proceeds to read each items into scene for visualisations.\n *\n * @param {String} url - Location of the metafile\n * @param {Function} finishCallback - Callback function which will be called\n * for each glyphset and geometry that has been written in.\n * @param {options} Optional settings, it can be used to ignore some regions/groups\n * in the metadata file. Only supports version 1 at this moment.\n */\n this.loadMetadataURL = (url, finishCallback, allCompletedCallback, options) => {\n sceneLoader.loadMetadataURL(rootRegion, url, finishCallback, allCompletedCallback, options);\n }\n\n /**\n * Load a legacy model(s) format with the provided URLs and parameters. This only loads the geometry\n * without any of the metadata. Therefore, extra parameters should be provided.\n *\n * @deprecated\n */\n this.loadModelsURL = (urls, colours, opacities, timeEnabled, morphColour, finishCallback) => {\n sceneLoader.loadModelsURL(rootRegion. urls, colours, opacities, timeEnabled, morphColour, finishCallback);\n }\n\n /**\n * Load the viewport from an external location provided by the url.\n * @param {String} URL - address to the file containing viewport information.\n */\n this.loadViewURL = url => {\n sceneLoader.loadViewURL(url);\n }\n\n /**\n * Load a legacy file format containing the viewport and its meta file from an external\n * location provided by the url. Use the new metadata format with\n * {@link Zinc.Scene#loadMetadataURL} instead.\n *\n * @param {String} URL - address to the file containing viewport and model information.\n * @deprecated\n */\n this.loadFromViewURL = (jsonFilePrefix, finishCallback) => {\n sceneLoader.loadFromViewURL(jsonFilePrefix, finishCallback);\n }\n\n /**\n * Load GLTF into this scene object.\n */\n this.loadGLTF = (url, finishCallback, allCompletedCallback, options) => {\n sceneLoader.loadGLTF(rootRegion, url, finishCallback, allCompletedCallback, options);\n }\n\n //Update the directional light for this scene.\n this.updateDirectionalLight = () => {\n zincCameraControls.updateDirectionalLight();\n }\n\n /**\n * Add any {THREE.Object} into this scene.\n * @param {THREE.Object} object - to be addded into this scene.\n */\n this.addObject = object => {\n scene.add(object);\n }\n\n /**\n * Remove any {THREE.Object} from this scene.\n * @param {THREE.Object} object - to be removed from this scene.\n */\n this.removeObject = object => {\n scene.remove(object);\n }\n\n /**\n * Get the current time of the scene.\n * @return {Number}\n */\n this.getCurrentTime = () => {\n if (videoHandler != undefined) {\n return videoHandler.getCurrentTime(duration);\n }\n const time = rootRegion.getCurrentTime();\n if (time !== -1)\n return time;\n\n return 0;\n }\n\n /**\n * Set the current time of all the geometries and glyphsets of this scene.\n * @param {Number} time - Value to set the time to.\n */\n this.setMorphsTime = (time) => {\n if (videoHandler != undefined) {\n videoHandler.setMorphTime(time, duration);\n }\n rootRegion.setMorphTime(time, true);\n }\n\n /**\n * Check if any object in this scene is time varying.\n *\n * @return {Boolean}\n */\n this.isTimeVarying = () => {\n if (videoHandler && videoHandler.video && !videoHandler.video.error) {\n \treturn true;\n }\n return rootRegion.isTimeVarying();\n }\n\n /**\n * Update geometries and glyphsets based on the calculated time.\n * @private\n */\n this.renderGeometries = (playRate, delta, playAnimation) => {\n // Let video dictates the progress if one is present\n let options = {};\n options.camera = zincCameraControls;\n //Global markers flag, marker can be set at individual zinc object level\n //overriding this flag.\n options.displayMarkers = this.displayMarkers;\n options.markerCluster = markerCluster;\n options.markersList = markerCluster.markers;\n options.ndcToBeUpdated = false;\n //Always set marker cluster update required when playAnimation is true\n //to make sure it is updated when it stops\n if (playAnimation) {\n options.markerCluster.markerUpdateRequired = true;\n }\n\t if (videoHandler) {\n\t\t if (videoHandler.isReadyToPlay()) {\n\t\t\t if (playAnimation) {\n videoHandler.video.play();\n\t\t\t } else {\n\t\t\t\t videoHandler.video.pause();\n\t\t\t }\n const currentTime = videoHandler.video.currentTime /\n videoHandler.getVideoDuration() * duration;\n\t\t\t if (0 == sceneLoader.toBeDownloaded) {\n\t\t\t\t zincCameraControls.setTime(currentTime);\n\t\t\t\t options.ndcToBeUpdated = zincCameraControls.update(0);\n if (options.ndcToBeUpdated) {\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(getDrawingHeight());\n }\n rootRegion.setMorphTime(currentTime, true);\n rootRegion.renderGeometries(0, 0, playAnimation, zincCameraControls, options, true);\n\t\t\t } else {\n\t\t\t\t zincCameraControls.update(0);\n\t\t\t }\n\t\t\t //console.log(videoHandler.video.currentTime / videoHandler.getVideoDuration() * 6000);\n\t\t } else {\n\t\t\t myPlayRate = 0;\n\t\t }\n\t } else {\n\t\t if (0 == sceneLoader.toBeDownloaded) {\n options.ndcToBeUpdated = zincCameraControls.update(delta);\n if (options.ndcToBeUpdated) {\n zincCameraControls.calculateHeightPerPixelAtZeroDepth(getDrawingHeight());\n }\n rootRegion.renderGeometries(playRate, delta, playAnimation, zincCameraControls, options, true);\n\t\t } else {\n\t\t\t zincCameraControls.update(0);\n\t\t }\n }\n }\n\n /**\n * Return the internal {THREE.Scene}.\n * @return {THREE.Scene}\n */\n this.getThreeJSScene = () => {\n return scene;\n }\n\n this.setVideoHandler = (videoHandlerIn) => {\n if (!videoHandler)\n videoHandler = videoHandlerIn;\n }\n\n /**\n * Set a group of scenes into this parent scene. This group of\n * scenes will also be rendered when this scene is rendered.\n * @private\n */\n this.setAdditionalScenesGroup = scenesGroup => {\n scene.add(scenesGroup);\n }\n\n let getWindowsPosition = (align, x_offset, y_offset, width, height,\n renderer_width, renderer_height) => {\n let x = 0;\n let y = 0;\n if (align.includes(\"top\")) {\n y = renderer_height - height - y_offset;\n } else if (align.includes(\"bottom\")) {\n y = y_offset;\n } else {\n y = Math.floor((renderer_height - height) / 2.0);\n }\n if (align.includes(\"left\")) {\n x = x_offset;\n } else if (align.includes(\"right\")) {\n x = renderer_width - x_offset- width;\n } else {\n x = Math.floor((renderer_width - width) / 2.0);\n }\n return {x: x, y: y};\n }\n\n const renderMinimap = renderer => {\n if (this.displayMinimap || this.displayMiniAxes) {\n renderer.setScissorTest(true);\n renderer.getSize(_markerTarget);\n if (this.minimapScissor.updateRequired) {\n scissor = getWindowsPosition(this.minimapScissor.align,\n this.minimapScissor.x_offset,\n this.minimapScissor.y_offset,\n this.minimapScissor.width,\n this.minimapScissor.height,\n _markerTarget.x, _markerTarget.y);\n this.minimapScissor.updateRequired = false;\n }\n renderer.setScissor(\n scissor.x,\n scissor.y,\n this.minimapScissor.width,\n this.minimapScissor.height);\n renderer.setViewport(\n scissor.x,\n scissor.y,\n this.minimapScissor.width,\n this.minimapScissor.height);\n minimap.updateCamera();\n if (this.displayMiniAxes) {\n renderer.render(miniAxesScene, minimap.camera);\n } else {\n scene.add(minimap.mask);\n renderer.render(scene, minimap.camera);\n scene.remove(minimap.mask);\n }\n renderer.setScissorTest(false);\n renderer.setViewport(0, 0, _markerTarget.x, _markerTarget.y);\n }\n }\n\n /**\n * Render the scene.\n * @private\n */\n this.render = renderer => {\n if (this.autoClearFlag)\n renderer.clear();\n if (stereoEffectFlag && stereoEffect) {\n stereoEffect.render(scene, this.camera);\n } else {\n renderer.render(scene, this.camera);\n renderMinimap(renderer);\n }\n }\n\n /**\n * Enable or disable interactive control, this is on by default.\n *\n * @param {Boolean} flag - Indicate either interactive control\n * should be enabled or disabled.\n */\n this.setInteractiveControlEnable = flag => {\n if (flag == true)\n zincCameraControls.enable();\n else\n zincCameraControls.disable();\n }\n\n /**\n * Get the camera control of this scene.\n * @return {Zinc.CameraControls}\n */\n this.getZincCameraControls = () => {\n return zincCameraControls;\n }\n\n /**\n * Get the internal {THREE.Scene}.\n * @return {THREE.Scene}\n */\n this.getThreeJSScene = () => {\n return scene;\n }\n\n /**\n * Set the default duration value for geometries and glyphsets\n * that are to be loaded into this scene.\n * @param {Number} durationIn - duration of the scene.\n */\n this.setDuration = durationIn => {\n rootRegion.setDuration(durationIn);\n duration = durationIn;\n zincCameraControls.setPathDuration(durationIn);\n sceneLoader.duration = durationIn;\n }\n\n /**\n * Get the default duration value.\n * @return {Number}\n */\n this.getDuration = () => {\n return duration;\n }\n\n /**\n * Enable or disable stereo effect of this scene.\n * @param {Boolean} stereoFlag - Indicate either stereo effect control\n * should be enabled or disabled.\n */\n this.setStereoEffectEnable = stereoFlag => {\n if (stereoFlag == true) {\n if (!stereoEffect) {\n stereoEffect = new StereoEffect(rendererIn);\n }\n }\n rendererIn.setSize(getDrawingWidth(), getDrawingHeight());\n this.camera.updateProjectionMatrix();\n stereoEffectFlag = stereoFlag;\n }\n\n\n /**\n * Check rather object is in scene.\n *\n * @return {Boolean}\n */\n this.objectIsInScene = zincObject => {\n return rootRegion.objectIsInRegion(zincObject, true);\n }\n\n /**\n * Rotate the camera view to view the entirety of the\n * bounding box with a smooth transition within the providied\n * transitionTime.\n *\n * @param {THREE.Box3} boundingBox - the bounding box to target\n * @param {Number} transitionTime - Duration to perform the transition.\n */\n this.alignBoundingBoxToCameraView = (boundingBox, transitionTime) => {\n if (boundingBox) {\n boundingBox.getCenter(_v3);\n const viewport = this.getZincCameraControls().getCurrentViewport();\n const target = new THREE.Vector3(viewport.targetPosition[0],\n viewport.targetPosition[1], viewport.targetPosition[2]);\n const eyePosition = new THREE.Vector3(viewport.eyePosition[0],\n viewport.eyePosition[1], viewport.eyePosition[2]);\n const newVec1 = new THREE.Vector3();\n const newVec2 = new THREE.Vector3();\n newVec1.subVectors(target, eyePosition).normalize();\n newVec2.subVectors(target, _v3).normalize();\n const newVec3 = new THREE.Vector3();\n newVec3.crossVectors(newVec1, newVec2);\n const angle = newVec1.angleTo(newVec2);\n if (transitionTime > 0) {\n this.getZincCameraControls().rotateCameraTransition(newVec3,\n angle, transitionTime);\n this.getZincCameraControls().enableCameraTransition();\n } else {\n this.getZincCameraControls().rotateAboutLookAtpoint(newVec3, angle);\n }\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n\n /**\n * Translate the camera view to the center of the\n * bounding box with a smooth transition within the providied\n * transitionTime.\n *\n * @param {THREE.Box3} boundingBox - the bounding box to target\n * @param {Number} transitionTime - Duration to perform the transition.\n */\n this.translateBoundingBoxToCameraView = (boundingBox, scaleRadius, transitionTime) => {\n if (boundingBox) {\n const oldViewport = this.getZincCameraControls().getCurrentViewport();\n const viewport = this.getZincCameraControls().getViewportFromBoundingBox(boundingBox, scaleRadius);\n if (transitionTime > 0) {\n this.getZincCameraControls().cameraTransition(oldViewport,\n viewport, transitionTime);\n this.getZincCameraControls().enableCameraTransition();\n }\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n /**\n * Transition the camera into viewing the zinc object with a\n * smooth transition within the providied transitionTime.\n *\n * @param {ZincObject} zincObject - the bounding box to target\n * @param {Number} transitionTime - Duration to perform the transition.\n */\n this.alignObjectToCameraView = (zincObject, transitionTime) => {\n if (this.objectIsInScene(zincObject)) {\n const boundingBox = zincObject.getBoundingBox();\n this.alignBoundingBoxToCameraView(boundingBox, transitionTime);\n }\n }\n\n /**\n * Set the camera to point to the centroid of the zinc object.\n *\n * @param {ZincObject} zincObject - the bounding box to target\n */\n this.setCameraTargetToObject = zincObject => {\n if (this.objectIsInScene(zincObject)) {\n const boundingBox = zincObject.getBoundingBox();\n const viewport = this.getZincCameraControls().getCurrentViewport();\n boundingBox.getCenter(_v3);\n const target = new THREE.Vector3(viewport.targetPosition[0],\n viewport.targetPosition[1], viewport.targetPosition[2]);\n const eyePosition = new THREE.Vector3(viewport.eyePosition[0],\n viewport.eyePosition[1], viewport.eyePosition[2]);\n const newVec1 = new THREE.Vector3();\n const newVec2 = new THREE.Vector3();\n newVec1.subVectors(eyePosition, target);\n newVec2.addVectors(_v3, newVec1);\n viewport.eyePosition[0] = newVec2.x;\n viewport.eyePosition[1] = newVec2.y;\n viewport.eyePosition[2] = newVec2.z;\n viewport.targetPosition[0] = _v3.x;\n viewport.targetPosition[1] = _v3.y;\n viewport.targetPosition[2] = _v3.z;\n this.getZincCameraControls().setCurrentCameraSettings(viewport);\n markerCluster.markerUpdateRequired = true;\n }\n }\n\n /**\n * Check if stereo effect is enabled.\n * @returns {Boolean}\n */\n this.isStereoEffectEnable = () => {\n return stereoEffectFlag;\n }\n\n /**\n * Remove a ZincObject from this scene if it presents. This will eventually\n * destroy the object and free up the memory.\n * @param {Zinc.Object} zincObject - object to be removed from this scene.\n */\n this.removeZincObject = zincObject => {\n rootRegion.removeZincObject(zincObject);\n if (zincCameraControls) {\n zincCameraControls.calculateMaxAllowedDistance(this);\n }\n markerCluster.markerUpdateRequired = true;\n }\n\n /**\n * Update pickable objects list\n */\n this.updatePickableThreeJSObjects = () => {\n pickableObjectsList.length = 0;\n if (markerCluster.isEnabled) {\n pickableObjectsList.push(markerCluster.group);\n }\n rootRegion.getPickableThreeJSObjects(pickableObjectsList, true);\n this.forcePickableObjectsUpdate = false;\n }\n\n /**\n * Get all pickable objects.\n */\n this.getPickableThreeJSObjects = () => {\n //The list will only be updated if changes have been made\n //in region or a flag has been raise\n if (this.forcePickableObjectsUpdate ||\n rootRegion.checkPickableUpdateRequred(true)) {\n this.updatePickableThreeJSObjects();\n }\n return pickableObjectsList;\n }\n\n /**\n * Get the Normalised coordinates on minimap if mouse event is\n * inside the minimap\n */\n this.getNormalisedMinimapCoordinates = (renderer, event) => {\n if (this.displayMinimap) {\n const target = new THREE.Vector2();\n renderer.getSize(target);\n let offsetY = target.y - event.clientY;\n if (((scissor.x + this.minimapScissor.width) > event.clientX) &&\n (event.clientX > scissor.x) &&\n ((scissor.y + this.minimapScissor.height) > offsetY) &&\n (offsetY > scissor.y)) {\n let x = ((event.clientX - scissor.x) /\n this.minimapScissor.width) * 2.0 - 1.0;\n let y = ((offsetY - scissor.y) /\n this.minimapScissor.height) * 2.0 - 1.0;\n return {\"x\": x, \"y\": y};\n }\n }\n return undefined;\n }\n\n /**\n * Get the coordinates difference of the current viewing\n * point and projected coordinates.\n */\n this.getMinimapDiffFromNormalised = (x, y) => {\n if (minimap)\n return minimap.getDiffFromNormalised(x, y);\n return undefined;\n }\n\n this.isWebGL2 = () => {\n return rendererIn.isWebGL2();\n }\n\n /**\n * Remove all objects that are created with ZincJS APIs and it will free the memory allocated.\n * This does not remove obejcts that are added using the addObject APIs.\n */\n this.clearAll = () => {\n markerCluster.clear();\n rootRegion.clear(true);\n this.clearZincObjectAddedCallbacks();\n this.clearZincObjectRemovedCallbacks();\n sceneLoader.toBeDwonloaded = 0;\n if (zincCameraControls) {\n zincCameraControls.calculateMaxAllowedDistance(this);\n }\n markerCluster.markerUpdateRequired = true;\n }\n\n /**\n * All time stamp to the metadata TimeStamps field.\n */\n this.addMetadataTimeStamp = (key, time) => {\n metadata[\"TimeStamps\"][key] = convertDurationObjectTomSec(time);\n }\n\n /**\n * Get a specific metadata field.\n */\n this.getMetadataTag = key => {\n return metadata[key];\n }\n\n /**\n * Get all metadata set for the scene.\n */\n this.getMetadata = () => {\n return metadata;\n }\n\n /**\n * Set a specific metadata field.\n */\n this.setMetadataTag = (key, value) => {\n metadata[key] = value;\n }\n\n /**\n * Remove a specific metadata field.\n */\n this.removeMetadataTag = key => {\n delete metadata[key];\n }\n\n /**\n * Reset all metadata fields to original value.\n */\n this.resetMetadata = () => {\n metadata = defaultMetadata();\n }\n\n /**\n * Reset duration of scene to default value.\n */\n this.resetDuration = () => {\n this.setDuration(defaultDuration);\n }\n\n // Turn the object into a readable string {years: years,months: months,\n // weeks: weeks, days: days, hours: hours, mins: mins, secs: secs }\n const convertDurationObjectToString = duration => {\n return [\n ...(duration.years ? [`${duration.years}years`] : []),\n ...(duration.months ? [`${duration.months}months`] : []),\n ...(duration.weeks ? [`${duration.weeks}weeks`] : []),\n ...(duration.days ? [`${duration.days}days`] : []),\n ...(duration.hours ? [`${duration.hours}hours`] : []),\n ...(duration.mins ? [`${duration.mins}mins`] : []),\n ...(duration.secs ? [`${duration.secs}secs`] : []),\n ].join(' ');\n }\n\n // Turn the object into a number representing milliesecond {years: years,months: months,\n // weeks: weeks, days: days, hours: hours, mins: mins, secs: secs }\n const convertDurationObjectTomSec = duration => {\n return duration.years ? duration.years * 31536000000 : 0 +\n duration.months ? duration.months * 2592000000 : 0 +\n duration.weeks ? duration.weeks * 604800000 : 0 +\n duration.days ? duration.days * 86400000 : 0 +\n duration.hours ? duration.hours * 3600000 : 0 +\n duration.mins ? duration.mins * 60000 : 0 +\n duration.secs ? duration.secs * 1000 : 0;\n }\n\n // Set the readable duration and timer using an object\n // with the following format {years: years,months: months, weeks: weeks, days: days,\n // hours: hours, mins: mins, secs: secs }\n this.setDurationFromObject = duration => {\n const string = convertDurationObjectToString(duration);\n const millisec = convertDurationObjectTomSec(duration);\n this.setMetadataTag(\"Duration\", string);\n this.setDuration(millisec);\n }\n\n // Set the readable original duration using an object\n // with the following format {years: years,months: months, weeks: weeks, days: days,\n // hours: hours, mins: mins, secs: secs }\n this.setOriginalDurationFromObject = duration => {\n const string = convertDurationObjectToString(duration);\n this.setMetadataTag(\"OriginalDuration\", string);\n }\n\n /**\n * Export the scene in GLTF format, it can either return it in\n * string or binary form.\n *\n * @param {Boolean} binary - Indicate it should be exported as binary or\n * text.\n *\n * @return {Promise} The exported data if the promise resolve successfully\n */\n this.exportGLTF = (binary) => {\n const exporter = new SceneExporter(this);\n return exporter.exportGLTF(binary);\n }\n\n /**\n * Get the root region of the scene.\n *\n * @return {Region} Return the root region of the scene\n */\n this.getRootRegion = () => {\n return rootRegion;\n }\n\n /**\n * Create points in region specified in the path\n *\n */\n this.createLines = ( regionPath, groupName, coords, colour ) => {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n return region.createLines(groupName, coords, colour);\n }\n\n /**\n * Create points in region specified in the path\n *\n */\n this.createPoints = ( regionPath, groupName, coords, labels, colour ) => {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n return region.createPoints(groupName, coords, labels, colour);\n }\n\n\t/**\n\t * Add a callback function which will be called everytime zinc object is added.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addZincObjectAddedCallbacks = callbackFunction => {\n\t\tzincObjectAddedCallbacks_id = zincObjectAddedCallbacks_id + 1;\n\t\tzincObjectAddedCallbacks[zincObjectAddedCallbacks_id] = callbackFunction;\n\t\treturn zincObjectAddedCallbacks_id;\n\t}\n\n\t/**\n\t * Add a callback function which will be called everytime zinc object is removed.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addZincObjectRemovedCallbacks = callbackFunction => {\n\t\tzincObjectRemovedCallbacks_id = zincObjectRemovedCallbacks_id + 1;\n\t\tzincObjectRemovedCallbacks[zincObjectRemovedCallbacks_id] = callbackFunction;\n\t\treturn zincObjectRemovedCallbacks_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeZincObjectAddedCallbacks = id => {\n\t\tif (id in zincObjectAddedCallbacks_id) {\n \t\t\tdelete zincObjectAddedCallbacks[id];\n\t\t}\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeZincObjectRemovedCallbacks = id => {\n\t\tif (id in zincObjectRemovedCallbacks_id) {\n \t\t\tdelete zincObjectRemovedCallbacks[id];\n\t\t}\n\t}\n\n /**\n\t * Clear all zinc object callback function\n\t */\n\tthis.clearZincObjectAddedCallbacks = () => {\n\t\tzincObjectAddedCallbacks = {};\n zincObjectAddedCallbacks_id = 0;\n\t}\n\n /**\n\t * Clear all zinc object callback function\n\t */\n\tthis.clearZincObjectRemovedCallbacks = () => {\n\t\tzincObjectRemovedCallbacks = {};\n zincObjectRemovedCallbacks_id = 0;\n\t}\n\n /**\n\t * Used to trigger zinc object added callback\n\t */\n this.triggerObjectAddedCallback = (zincObject) => {\n for (let key in zincObjectAddedCallbacks) {\n if (zincObjectAddedCallbacks.hasOwnProperty(key)) {\n zincObjectAddedCallbacks[key](zincObject);\n }\n }\n }\n\n /**\n\t * Used to trigger zinc object removed callback\n\t */\n this.triggerObjectRemovedCallback= (zincObject) => {\n for (let key in zincObjectRemovedCallbacks) {\n if (zincObjectRemovedCallbacks.hasOwnProperty(key)) {\n zincObjectRemovedCallbacks[key](zincObject);\n }\n }\n }\n\n /*\n\t * Add temporary points to the scene which can be removed\n * with clearTemporaryPrimitives method.\n\t */\n this.addTemporaryPoints = (coords, colour) => {\n const geometry = createBufferGeometry(coords.length, coords);\n let material = new THREE.PointsMaterial({ alphaTest: 0.5, size: 15,\n color: colour, sizeAttenuation: false });\n const texture = getCircularTexture();\n material.map = texture;\n let point = new Points(geometry, material);\n tempGroup.add(point);\n return point;\n }\n\n /*\n\t * Add temporary lines to the scene which can be removed\n * with clearTemporaryPrimitives method.\n\t */\n this.addTemporaryLines = (coords, colour) => {\n const geometry = createBufferGeometry(coords.length, coords);\n const material = new THREE.LineBasicMaterial({color:colour});\n const line = new LineSegments(geometry, material);\n tempGroup.add(line);\n return line;\n }\n\n\n /*\n\t * Display frustum\n\t */\n this.enableFrustumDisplay = () => {\n if (this.camera && !cameraHelper) {\n cameraHelper = new THREE.CameraHelper(this.camera);\n scene.add(cameraHelper);\n }\n }\n\n /*\n\t * Hide frustum\n\t */\n this.disableFrustumDisplay = () => {\n if (cameraHelper) {\n scene.remove(cameraHelper);\n cameraHelper.dispose();\n cameraHelper = undefined;\n }\n }\n\n /*\n\t * Remove object from temporary objects list\n\t */\n this.removeTemporaryPrimitive = (object) => {\n tempGroup.remove(object);\n object.geometry.dispose();\n object.material.dispose();\n }\n\n /*\n\t * Remove all temporary primitives.\n * Return number of primitives removed;\n\t */\n this.clearTemporaryPrimitives = () => {\n let i = 0;\n const children = tempGroup.children;\n children.forEach(child => {\n child.geometry.dispose();\n child.material.dispose();\n i++;\n });\n tempGroup.clear();\n return i;\n }\n\n /*\n\t * Create primitive based on the bounding box of scene and\n * add to specify region and group name.\n\t */\n this.addBoundingBoxPrimitive = (regionPath, group, colour, opacity,\n visibility, boundingBox = undefined) => {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n const box = boundingBox ? boundingBox : this.getBoundingBox();\n _v3.set(0.0, 0.0, 0.0);\n const dim = _v3.subVectors(box.max, box.min);\n const boxGeo = new THREE.BoxGeometry(dim.x, dim.y, dim.z);\n const primitive = region.createGeometryFromThreeJSGeometry(\n group, boxGeo, colour, opacity, visibility, 10000);\n dim.addVectors(box.min, box.max).multiplyScalar( 0.5 );\n primitive.setPosition(dim.x, dim.y, dim.z);\n return primitive;\n }\n\n /*\n\t * Create primitive based on the bounding box of scene and\n * add to specify region and group name.\n\t */\n this.addSlicesPrimitive = (regionPath, groups, colours, opacity,\n visibility, boundingBox = undefined) => {\n if (groups && groups.length >= 3 &&\n colours && colours.length >= 3) {\n let region = rootRegion.findChildFromPath(regionPath);\n if (region === undefined) {\n region = rootRegion.createChildFromPath(regionPath);\n }\n const box = boundingBox ? boundingBox : this.getBoundingBox();\n _v3.set(0.0, 0.0, 0.0);\n const dim = _v3.subVectors(box.max, box.min);\n const directions = [\"x\", \"y\", \"z\"];\n const primitives = [];\n let index = 0;\n directions.forEach((direction) => {\n let planeGeo = undefined;\n switch(direction) {\n //YZ plane\n case \"x\":\n planeGeo = new THREE.PlaneGeometry(dim.z, dim.y);\n planeGeo.rotateY(Math.PI / 2);\n // code block\n break;\n //XZ plane\n case \"y\":\n planeGeo = new THREE.PlaneGeometry(dim.x, dim.z);\n planeGeo.rotateX(Math.PI / 2);\n // code block\n break;\n //XY plane\n case \"z\":\n planeGeo = new THREE.PlaneGeometry(dim.x, dim.y);\n // code block\n break;\n default:\n break;\n }\n const primitive = region.createGeometryFromThreeJSGeometry(\n groups[index], planeGeo, colours[index], opacity, visibility, 10001);\n primitives.push(primitive);\n index++;\n });\n\n dim.addVectors(box.min, box.max).multiplyScalar( 0.5 );\n primitives.forEach((primitive) => {\n primitive.setPosition(dim.x, dim.y, dim.z);\n });\n return primitives;\n }\n }\n\n /*\n\t * Enable marker cluster to work with markers\n\t */\n this.enableMarkerCluster = (flag) => {\n if (flag) {\n markerCluster.markerUpdateRequired = true;\n markerCluster.enable();\n } else {\n markerCluster.markerUpdateRequired = false;\n markerCluster.disable();\n }\n this.forcePickableObjectsUpdate = true;\n }\n\n /*\n\t * Destory static axis display object\n\t */\n this.destroyAxisDisplay = () => {\n this.displayMiniAxes = false;\n if (axisDisplay.main) {\n this.enableAxisDisplay(false, false);\n axisDisplay.main.forEach(axis => {\n if (axis.dispose) {\n axis.dispose();\n }\n });\n }\n if (axisDisplay.mini) {\n this.enableAxisDisplay(false, true);\n axisDisplay.mini.forEach(axis => {\n if (axis.dispose) {\n axis.dispose();\n }\n });\n }\n axisDisplay = {\n main: [],\n mini: [],\n };\n }\n\n /*\n\t * Create static axis display object\n\t */\n this.createAxisDisplay = (fitBoundingBox = false) => {\n this.destroyAxisDisplay();\n const XYZ = [\n {\n name: \"x\",\n dir: new THREE.Vector3(1, 0, 0),\n colour: \"red\",\n hex: 0xFF5555\n },\n {\n name: \"y\",\n dir: new THREE.Vector3(0, 1, 0),\n colour: \"green\",\n hex: 0x55FF55\n },\n {\n name: \"z\",\n dir: new THREE.Vector3(0, 0, 1),\n colour: \"blue\",\n hex: 0x5555FF\n }\n ];\n const boundingBox = this.getBoundingBox();\n const size = boundingBox.min.distanceTo(boundingBox.max);\n let origin = new THREE.Vector3(0, 0, 0);\n if (fitBoundingBox) {\n origin.copy(boundingBox.min);\n }\n XYZ.forEach((xyzObj) => {\n const arrowHelper = new THREE.ArrowHelper(xyzObj.dir, origin, size, xyzObj.hex);\n axisDisplay.main.push(arrowHelper);\n const miniArrowHelper = new THREE.ArrowHelper(xyzObj.dir, boundingBox.getCenter(_v3), size / 2, xyzObj.hex);\n axisDisplay.mini.push(miniArrowHelper);\n\n /*\n const miniLabel = createNewSpriteText(xyzObj.name, 0.1, xyzObj.colour, \"Asap\", 120, 400);\n const miniPosition = xyzObj.dir.clone().multiplyScalar(size/2).add(_v3[xyzObj.name]);\n miniLabel.position.set(miniPosition.x, miniPosition.y, miniPosition.z);\n axisDisplay.mini.push(miniLabel);\n */\n\n const axesLabel = createNewSpriteText(xyzObj.name, 0.036, xyzObj.colour, \"Asap\", 120, 700);\n const position = xyzObj.dir.clone().multiplyScalar(size).add(origin);\n axesLabel.position.set(position.x, position.y, position.z);\n axisDisplay.main.push(axesLabel);\n })\n }\n\n /*\n\t * Enable static axis display, createAxisDisplay must be called\n * before the axis can be display.\n\t */\n this.enableAxisDisplay = (enable, miniaxes = false) => {\n if (miniaxes && axisDisplay?.mini?.length) {\n this.displayMiniAxes = enable;\n axisDisplay.mini.forEach(axis => {\n enable ? miniAxesScene.add(axis) : miniAxesScene.remove(axis);\n });\n } else if (!miniaxes && axisDisplay.main) {\n axisDisplay.main.forEach(axis => {\n enable ? scene.add(axis) : scene.remove(axis);\n });\n }\n }\n}\n\nexport { Scene };\n","import * as THREE from 'three';\nimport { ResizeSensor } from 'css-element-queries';\nimport { Scene } from './scene';\n/**\n * Create a Zinc 3D renderer in the container provided.\n * The primary function of a Zinc 3D renderer is to display the current\n * scene (@link Scene} set to the renderer and each scene may contain as\n * many geometries, glyphset and other primitives as the system can support.\n * Zinc.Renderer also allows additional scenes to be displayed.\n *\n * @param {Object} containerIn - Container to create the renderer on.\n * @class\n * @author Alan Wu\n * @return {Renderer}\n */\nconst Renderer = function (containerIn) {\n\n\tlet container = containerIn;\n\n\tconst stats = 0;\n\n\tlet renderer = undefined;\n\tlet currentScene = undefined;\n\n\t//myGezincGeometriestains a tuple of the threejs mesh, timeEnabled, morphColour flag, unique id and morph\n\tconst clock = new THREE.Clock(false);\n\tthis.playAnimation = true;\n /* default animation update rate, rate is 1000 and duration\n is default to 6000, 6s to finish a full animation */\n\tlet playRate = 1000;\n\tlet preRenderCallbackFunctions = {};\n\tlet preRenderCallbackFunctions_id = 0;\n\tlet postRenderCallbackFunctions = {};\n\tlet postRenderCallbackFunctions_id = 0;\n\tlet contextLostCallbackFunctions = {};\n\tlet contextLostCallbackFunctions_id = 0;\n\tlet contextRestoredCallbackFunctions = {};\n\tlet contextRestoredCallbackFunctions_id = 0;\n\tlet animated_id = undefined;\n\tlet cameraOrtho = undefined, sceneOrtho = undefined, logoSprite = undefined;\n\tlet sceneMap = [];\n\tlet additionalActiveScenes = [];\n\tlet scenesGroup = new THREE.Group();\n\tlet canvas = undefined;\n let sensor = undefined;\n let isRendering = false;\n\tlet isInitialised = false;\n\tconst _this = this;\n\tconst currentSize = [0, 0];\n\tconst currentOffset = [0, 0];\n\n\tthis.getDrawingWidth = () => {\n\t\tif (container) {\n\t\t\treturn container.clientWidth;\n\t\t} else if (canvas)\n\t\t\tif (typeof canvas.clientWidth !== 'undefined')\n\t\t\t\treturn Math.round(canvas.clientWidth);\n\t\t\telse\n\t\t\t\treturn Math.round(canvas.width);\n\t\treturn 0;\n\t}\n\n\tthis.getDrawingHeight = () => {\n\t\tif (container) {\n\t\t\treturn container.clientHeight;\n\t\t} else if (canvas)\n\t\t\tif (typeof canvas.clientHeight !== 'undefined')\n\t\t\t\treturn Math.round(canvas.clientHeight);\n\t\t\telse\n\t\t\t\treturn Math.round(canvas.height);\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Call this to resize the renderer, this is normally call automatically.\n\t */\n\tthis.onWindowResize = () => {\n\t\tcurrentScene.onWindowResize();\n\t\tconst width = this.getDrawingWidth();\n\t\tconst height = this.getDrawingHeight();\n\t\tif (renderer != undefined) {\n\t\t\tlet localRect = undefined;\n\t\t\tif (container) {\n\t\t\t\tlocalRect = container.getBoundingClientRect();\n\t\t\t\trenderer.setSize(width, height);\n\t\t\t} else if (canvas) {\n\t\t\t\tif (typeof canvas.getBoundingClientRect !== 'undefined') {\n\t\t\t\t\tlocalRect = canvas.getBoundingClientRect();\n\t\t\t\t\tcanvas.width = width;\n\t\t\t\t\tcanvas.height = height;\n\t\t\t\t\trenderer.setSize(width, height, false);\n\t\t\t\t} else {\n\t\t\t\t\trenderer.setSize(width, height, false);\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (localRect) {\n\t\t\t\tcurrentOffset[0] = localRect.left;\n\t\t\t\tcurrentOffset[1] = localRect.top;\n\t\t\t}\n\t\t\tconst target = new THREE.Vector2();\n\t\t\trenderer.getSize(target);\n\t\t\tcurrentSize[0] = target.x;\n\t\t\tcurrentSize[1] = target.y;\n\t\t}\n\t}\n\n\t/**\n\t * Initialise the renderer and its visualisations.\n\t */\n\tthis.initialiseVisualisation = parameters => {\n\t\tif (!isInitialised) {\n\t\t\tparameters = parameters || {};\n\t\t\tif (parameters['antialias'] === undefined) {\n\t\t\t\tlet onMobile = false;\n\t\t\t\ttry {\n\t\t\t\t\tif( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {\n\t\t\t\t\t\tonMobile = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(err) {\n\t\t\t\t\tonMobile = false;\n\t\t\t\t}\n\t\t\t\tif (onMobile)\n\t\t\t\t\tparameters['antialias'] = false;\n\t\t\t\telse\n\t\t\t\t\tparameters['antialias'] = true;\n\t\t\t}\n\t\t\tif (parameters[\"canvas\"]) {\n\t\t\t\tcontainer = undefined;\n\t\t\t\tcanvas = parameters[\"canvas\"];\n\t\t\t}\n\t\t\trenderer = new THREE.WebGLRenderer(parameters);\n\t\t\tif (container !== undefined) {\n\t\t\t\tcontainer.appendChild( renderer.domElement );\n\t\t\t}\n\t\t\trenderer.setClearColor( 0xffffff, 1);\n\t\t\tif (canvas && canvas.style) {\n\t\t\t\tcanvas.style.height = \"100%\";\n\t\t\t\tcanvas.style.width = \"100%\";\n\t\t\t}\n\t\t\tconst domCanvas = renderer.domElement;\n\t\t\tdomCanvas.addEventListener(\"webglcontextlost\", onContextLost, false);\n\t\t\tdomCanvas.addEventListener(\"webglcontextrestored\", onContextRestored, false);\n\n\t\t\trenderer.autoClear = false;\n\t\t\tconst scene = this.createScene(\"default\");\n\t\t\tthis.setCurrentScene(scene);\n\t\t\tisInitialised = true;\n\t\t}\n\t}\n\n const onContextLost = event => {\n event.preventDefault();\n for (let key of Object.keys(preRenderCallbackFunctions)) {\n if (contextLostCallbackFunctions.hasOwnProperty(key)) {\n contextLostCallbackFunctions[key].call();\n }\n }\n }\n\n const onContextRestored = event => {\n event.preventDefault();\n for (let key of Object.keys(preRenderCallbackFunctions)) {\n if (contextRestoredCallbackFunctions.hasOwnProperty(key)) {\n contextRestoredCallbackFunctions[key].call();\n }\n }\n }\n\n\t/**\n\t * Get the current scene on display.\n\t * @return {Zinc.Scene};\n\t */\n\tthis.getCurrentScene = () => {\n\t\treturn currentScene;\n\t}\n\n\t/**\n\t * Set the current scene on display.\n\t *\n\t * @param {Zinc.Scene} sceneIn - The scene to be set, only scene created by this instance\n\t * of ZincRenderer is supported currently.\n\t */\n\tthis.setCurrentScene = sceneIn => {\n\t\tif (sceneIn) {\n\t\t\tthis.removeActiveScene(sceneIn);\n\t\t\tconst oldScene = currentScene;\n\t\t\tcurrentScene = sceneIn;\n\t\t\tif (oldScene) {\n\t\t\t\toldScene.setInteractiveControlEnable(false);\n\t\t\t}\n\t\t\tcurrentScene.setInteractiveControlEnable(true);\n\t\t\tcurrentScene.setAdditionalScenesGroup(scenesGroup);\n\t\t\tthis.onWindowResize();\n\t\t}\n\t}\n\n\t/**\n\t * Return scene with the matching name if scene with that name has been created.\n\t *\n\t * @param {String} name - Name to match\n\t * @return {Zinc.Scene}\n\t */\n\tthis.getSceneByName = name => {\n\t\treturn sceneMap[name];\n\t}\n\n\t/**\n\t * Create a new scene with the provided name if scene with the same name exists,\n\t * return undefined.\n\t *\n\t * @param {String} name - Name of the scene to be created.\n\t * @return {Zinc.Scene}\n\t */\n\tthis.createScene = name => {\n\t\tif (sceneMap[name] != undefined){\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tlet new_scene = undefined;\n\t\t\tif (canvas)\n\t\t\t\tnew_scene = new Scene(canvas, renderer);\n\t\t\telse\n\t\t\t\tnew_scene = new Scene(container, renderer);\n\t\t\tsceneMap[name] = new_scene;\n\t\t\tnew_scene.sceneName = name;\n\t\t\treturn new_scene;\n\t\t}\n\t}\n\n\tconst updateOrthoScene = () => {\n\t\tif (logoSprite != undefined) {\n\t\t\tconst material = logoSprite.material;\n\t\t\tif (material.map) {\n\t\t\t\tconst width = this.getDrawingWidth();\n\t\t\t\tconst height = this.getDrawingHeight();\n\t\t\t\tconst calculatedWidth = (width - material.map.image.width)/2;\n\t\t\t\tconst calculatedHeight = (-height + material.map.image.height)/2;\n\t\t\t\tlogoSprite.position.set(calculatedWidth, calculatedHeight, 1 );\n\t\t\t}\n\t\t}\n\t};\n\n\tconst updateOrthoCamera = () => {\n\t\tif (cameraOrtho != undefined) {\n\t\t\tconst width = this.getDrawingWidth();\n\t\t\tconst height = this.getDrawingHeight();\n\t\t\tcameraOrtho.left = -width / 2;\n\t\t\tcameraOrtho.right = width / 2;\n\t\t\tcameraOrtho.top = height / 2;\n\t\t\tcameraOrtho.bottom = -height / 2;\n\t\t\tcameraOrtho.updateProjectionMatrix();\n\t\t}\n\t};\n\n\t/**\n\t * Reset the viewport of the current scene to its original state.\n\t */\n\tthis.resetView = () => {\n\t\tcurrentScene.resetView();\n\t}\n\n\t/**\n\t * Adjust zoom distance to include all primitives in scene and also the additional scenes\n\t * but the lookat direction and up vectors will remain constant.\n\t */\n\tthis.viewAll = () => {\n\t\tif (currentScene) {\n\t\t\tconst boundingBox = currentScene.getBoundingBox();\n\t\t\tif (boundingBox) {\n\t\t\t for(let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\t const boundingBox2 = additionalActiveScenes[i].getBoundingBox();\n\t\t\t if (boundingBox2) {\n\t\t\t\t\t\t\t\tboundingBox.union(boundingBox2);\n\t\t\t }\n\t\t\t }\n\t\t\t\tcurrentScene.viewAllWithBoundingBox(boundingBox);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load a legacy model(s) format with the provided URLs and parameters. This only loads the geometry\n\t * without any of the metadata. Therefore, extra parameters should be provided. This should be\n\t * called from {@link Zinc.Scene}.\n\t *\n\t * @deprecated\n\t */\n\tthis.loadModelsURL = (urls, colours, opacities, timeEnabled, morphColour, finishCallback) => {\n\t\tcurrentScene.loadModelsURL(urls, colours, opacities, timeEnabled, morphColour, finishCallback);\n\t}\n\n\tconst loadView = viewData => {\n\t\tcurrentScene.loadView(viewData);\n\t};\n\n\t/**\n\t * Load the viewport from an external location provided by the url. This should be\n\t * called from {@link Zinc.Scene};\n\t * @param {String} URL - address to the file containing viewport information.\n\t * @deprecated\n\t */\n\tthis.loadViewURL = url => {\n\t\tcurrentScene.loadViewURL(url);\n\t}\n\n\t/**\n\t * Load a legacy file format containing the viewport and its model file from an external\n\t * location provided by the url. Use the new metadata format with\n\t * {@link Zinc.Scene#loadMetadataURL} instead. This should be\n\t * called from {@link Zinc.Scene};\n\t *\n\t * @param {String} URL - address to the file containing viewport and model information.\n\t * @deprecated\n\t */\n\tthis.loadFromViewURL = (jsonFilePrefix, finishCallback) => {\n\t\tcurrentScene.loadFromViewURL(jsonFilePrefix, finishCallback);\n\t}\n\n\tthis.updateDirectionalLight = () => {\n\t\tcurrentScene.updateDirectionalLight();\n\t}\n\n let runAnimation = () => {\n if (isRendering) {\n animated_id = requestAnimationFrame( runAnimation );\n this.render();\n } else {\n cancelAnimationFrame(animated_id);\n animated_id = undefined;\n }\n }\n\n\t/**\n\t * Stop the animation and renderer to get into the render loop.\n\t */\n\tthis.stopAnimate = () => {\n if (isRendering) {\n clock.stop();\n isRendering = false;\n }\n\t}\n\n\t/**\n\t * Start the animation and begin the rendering loop.\n\t */\n\tthis.animate = () => {\n if (!isRendering) {\n clock.start();\n isRendering = true;\n runAnimation();\n }\n\t}\n\n\tconst prevTime = Date.now();\n\n\t/**\n\t * Add a callback function which will be called when the gl context is lost.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addContextLostCallbackFunction = callbackFunction => {\n\t\tcontextLostCallbackFunctions_id = contextLostCallbackFunctions_id + 1;\n\t\tcontextLostCallbackFunctions[contextLostCallbackFunctions_id] = callbackFunction;\n\t\treturn contextLostCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the renderer.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeContextLostCallbackFunction = id => {\n\t\tif (id in contextLostCallbackFunctions) {\n\t\t\tdelete contextLostCallbackFunctions[id];\n\t\t}\n\t}\n\n\t/**\n\t * Add a callback function which will be called when the gl context is restored.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addContextRestoredCallbackFunction = callbackFunction => {\n\t\tcontextRestoredCallbackFunctions_id = contextRestoredCallbackFunctions_id + 1;\n\t\tcontextRestoredCallbackFunctions[contextRestoredCallbackFunctions_id] = callbackFunction;\n\t\treturn contextRestoredCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the renderer.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removeContextRestoredCallbackFunction = id => {\n\t\tif (id in contextRestoredCallbackFunctions_id) {\n\t\t\tdelete contextRestoredCallbackFunctions_id[id];\n\t\t}\n\t}\n\n\t/**\n\t * Add a callback function which will be called everytime before the renderer renders its scene.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addPreRenderCallbackFunction = callbackFunction => {\n\t\tpreRenderCallbackFunctions_id = preRenderCallbackFunctions_id + 1;\n\t\tpreRenderCallbackFunctions[preRenderCallbackFunctions_id] = callbackFunction;\n\t\treturn preRenderCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removePreRenderCallbackFunction = id => {\n\t\tif (id in preRenderCallbackFunctions) {\n\t\t\tdelete preRenderCallbackFunctions[id];\n\t\t}\n\t}\n\n\t/**\n\t * Add a callback function which will be called everytime after the renderer renders its scene.\n\t * @param {Function} callbackFunction - callbackFunction to be added.\n\t *\n\t * @return {Number}\n\t */\n\tthis.addPostRenderCallbackFunction = callbackFunction => {\n\t\tpostRenderCallbackFunctions_id = postRenderCallbackFunctions_id + 1;\n\t\tpostRenderCallbackFunctions[postRenderCallbackFunctions_id] = callbackFunction;\n\t\treturn postRenderCallbackFunctions_id;\n\t}\n\n\t/**\n\t * Remove a callback function that is previously added to the scene.\n\t * @param {Number} id - identifier of the previously added callback function.\n\t */\n\tthis.removePostRenderCallbackFunction = id => {\n\t\tif (id in postRenderCallbackFunctions) {\n\t\t\tdelete postRenderCallbackFunctions[id];\n\t\t}\n\t}\n\n\t/**\n\t * Get the current play rate, playrate affects how fast an animated object animates.\n\t * Also see {@link Zinc.Scene#duration}.\n\t */\n\tthis.getPlayRate = () => {\n\t\treturn playRate;\n\t}\n\n\t/**\n\t * Set the current play rate, playrate affects how fast an animated object animates.\n\t * @param {Number} PlayRateIn - value to set the playrate to.\n\t * Also see {@link Zinc.Scene#duration}.\n\t */\n\tthis.setPlayRate = playRateIn => {\n\t\tplayRate = playRateIn;\n\t}\n\n\tthis.getCurrentTime = () => {\n\t\treturn currentScene.getCurrentTime();\n\t}\n\n\n\t/**\n\t * Get the current play rate, playrate affects how fast an animated object animates.\n\t * Also see {@link Zinc.Scene#duration}.\n\t */\n\tthis.setMorphsTime = time => {\n\t\tcurrentScene.setMorphsTime(time);\n\t}\n\n\t/**\n\t * Get {Zinc.Geoemtry} by its id. This should be called from {@link Zinc.Scene};\n\t *\n\t * @depreacted\n\t * @return {Zinc.Geometry}\n\t */\n\tthis.getZincGeometryByID = id => {\n\t\treturn currentScene.getZincGeometryByID(id);\n\t}\n\n\t/**\n\t * Add {Three.Object} to the current scene.\n\t */\n\tthis.addToScene = object => {\n\t\tcurrentScene.addObject(object)\n\t}\n\n\t/**\n\t * Add {Three.Object} to the ortho scene, objects added to the ortho scene are rendered in\n\t * normalised coordinates and overlay on top of current scene.\n\t *\n\t */\n\tthis.addToOrthoScene = object => {\n\t\tif (sceneOrtho == undefined)\n\t\t\tsceneOrtho = new THREE.Scene();\n\t\tif (cameraOrtho == undefined) {\n\t\t\tconst width = this.getDrawingWidth();\n\t\t\tconst height = this.getDrawingHeight();\n\t\t\tcameraOrtho = new THREE.OrthographicCamera( -width / 2,\n\t\t\t\t\twidth / 2, height/ 2, -height / 2, 1, 10 );\n\t\t\tcameraOrtho.position.z = 10;\n\t\t}\n\t\tsceneOrtho.add(object)\n\t}\n\n\tconst createHUDSprites = logoSprite => {\n\t\treturn texture => {\n\t\t\ttexture.needsUpdate = true;\n\t\t\tconst material = new THREE.SpriteMaterial( { map: texture } );\n\t\t\tconst imagewidth = material.map.image.width;\n\t\t\tconst imageheight = material.map.image.height;\n\t\t\tlogoSprite.material = material;\n\t\t\tlogoSprite.scale.set( imagewidth, imageheight, 1 );\n\t\t\tconst width = this.getDrawingWidth();\n\t\t\tconst height = this.getDrawingHeight();\n\t\t\tlogoSprite.position.set( (width - imagewidth)/2, (-height + imageheight)/2, 1 );\n\t\t\tthis.addToOrthoScene(logoSprite);\n\t\t};\n\t};\n\n\tthis.addLogo = () => {\n\t\tlogoSprite = new THREE.Sprite();\n\t\tconst logo = THREE.ImageUtils.loadTexture(\n\t\t\t\t\"images/abi_big_logo_transparent_small.png\", undefined, createHUDSprites(logoSprite));\n\t}\n\n\t/**\n\t * Render the current and all additional scenes. It will first update all geometries and glyphsets\n\t * in scenes, clear depth buffer and render the ortho scene, call the preRenderCallbackFunctions stack\n\t * , render the scenes then postRenderCallback.\n\t */\n\tthis.render = () => {\n\t\tif (!sensor) {\n\t\t\tif (container) {\n\t\t\t\tif (container.clientWidth > 0 && container.clientHeight > 0) {\n\t\t\t\t\tsensor = new ResizeSensor(container, this.onWindowResize);\n\t\t\t\t}\n\t\t\t} else if (canvas) {\n\t\t\t\tif (canvas.width > 0 && canvas.height > 0)\n\t\t\t\t\tsensor = new ResizeSensor(canvas, this.onWindowResize);\n\t\t\t}\n\t\t}\n\t\tconst delta = clock.getDelta();\n\t\tcurrentScene.renderGeometries(playRate, delta, this.playAnimation);\n\t for(let i = 0; i < additionalActiveScenes.length; i++) {\n\t const sceneItem = additionalActiveScenes[i];\n\t sceneItem.renderGeometries(playRate, delta, this.playAnimation);\n\t }\n\t\tif (cameraOrtho != undefined && sceneOrtho != undefined) {\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.render( sceneOrtho, cameraOrtho );\n\t\t}\n for (let key of Object.keys(preRenderCallbackFunctions)) {\n if (preRenderCallbackFunctions.hasOwnProperty(key)) {\n preRenderCallbackFunctions[key].call();\n }\n }\n currentScene.render(renderer);\n for (let key of Object.keys(postRenderCallbackFunctions)) {\n if (postRenderCallbackFunctions.hasOwnProperty(key)) {\n postRenderCallbackFunctions[key].call();\n }\n }\n\t}\n\n\tthis.forceContextLoss = () => {\n\t\trenderer.forceContextLoss();\n\t}\n\n\tthis.forceContextRestore= () => {\n\t\trenderer.forceContextRestore();\n\t}\n\n\t/**\n\t * Get the internal {@link Three.Renderer}, to gain access to ThreeJS APIs.\n\t */\n\tthis.getThreeJSRenderer = () => {\n\t\treturn renderer;\n\t}\n\n\t/**\n\t * Check if a scene is currently active.\n\t * @param {Zinc.Scene} sceneIn - Scene to check if it is currently\n\t * rendered.\n\t */\n\tthis.isSceneActive = sceneIn => {\n\t\tif (currentScene === sceneIn) {\n\t\t\treturn true;\n\t\t} else {\n\t\t for(let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\t\t\tconst sceneItem = additionalActiveScenes[i];\n\t\t\t\t\tif (sceneItem === sceneIn)\n\t\t\t\t\t\treturn true;\n\t\t }\n\t\t}\n\t return false;\n\t}\n\n\t/**\n\t * Add additional active scene for rendering, this scene will also be rendered but\n\t * viewport of the currentScene will be used.\n\t * @param {Zinc.Scene} additionalScene - Scene to be added to the rendering.\n\t */\n\tthis.addActiveScene = additionalScene => {\n\t\tif (!this.isSceneActive(additionalScene)) {\n\t\t\tadditionalActiveScenes.push(additionalScene);\n\t\t\tscenesGroup.add(additionalScene.getThreeJSScene());\n\t\t}\n\t}\n\n\t/**\n\t * Remove a currenrtly active scene from the renderer, this scene will also be rendered but\n\t * viewport of the currentScene will be used.\n\t * @param {Zinc.Scene} additionalScene - Scene to be removed from rendering.\n\t */\n\tthis.removeActiveScene = additionalScene => {\n\t\tfor(let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\tconst sceneItem = additionalActiveScenes[i];\n\t\t\tif (sceneItem === additionalScene) {\n\t\t\t\tadditionalActiveScenes.splice(i, 1);\n\t\t\t\tscenesGroup.remove(additionalScene.getThreeJSScene());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clear all additional scenes from rendering except for curentScene.\n\t */\n\tthis.clearAllActiveScene = () => {\n\t\tfor (let i = 0; i < additionalActiveScenes.length; i++) {\n\t\t\tscenesGroup.remove(additionalActiveScenes[i].getThreeJSScene());\n\t\t}\n\t\tadditionalActiveScenes.splice(0,additionalActiveScenes.length);\n\t}\n\n /**\n * Dispose all memory allocated, this will effetively destroy all scenes.\n */\n this.dispose = () => {\n if (isRendering)\n cancelAnimationFrame(animated_id);\n for (const key in sceneMap) {\n if (sceneMap.hasOwnProperty(key)) {\n sceneMap[key].clearAll();\n }\n }\n sceneMap = [];\n additionalActiveScenes = [];\n scenesGroup = new THREE.Group();\n this.stopAnimate();\n preRenderCallbackFunctions = {};\n preRenderCallbackFunctions_id = 0;\n postRenderCallbackFunctions = {};\n postRenderCallbackFunctions = 0;\n contextLostCallbackFunctions = {};\n contextLostCallbackFunctions_id = 0;\n contextRestoredCallbackFunctions = {};\n contextRestoredCallbackFunctions_id = 0;\n cameraOrtho = undefined;\n sceneOrtho = undefined;\n logoSprite = undefined;\n const scene = this.createScene(\"default\");\n this.setCurrentScene(scene);\n sensor = undefined;\n renderer?.dispose();\n }\n\n\t/**\n\t * Transition from the current viewport to the endingScene's viewport in the specified duration.\n\t *\n\t * @param {Zinc.Scene} endingScene - Viewport of this scene will be used as the destination.\n\t * @param {Number} duration - Amount of time to transition from current viewport to the\n\t * endingScene's viewport.\n\t */\n\tthis.transitionScene = (endingScene, duration) => {\n\t\tif (currentScene) {\n\t\t\tconst currentCamera = currentScene.getZincCameraControls();\n\t\t\tconst boundingBox = endingScene.getBoundingBox();\n\t\t\tif (boundingBox) {\n\t\t\t\tconst radius = boundingBox.min.distanceTo(boundingBox.max)/2.0;\n\t\t\t\tconst centreX = (boundingBox.min.x + boundingBox.max.x) / 2.0;\n\t\t\t\tconst centreY = (boundingBox.min.y + boundingBox.max.y) / 2.0;\n\t\t\t\tconst centreZ = (boundingBox.min.z + boundingBox.max.z) / 2.0;\n\t\t\t\tconst clip_factor = 4.0;\n\t\t\t\tconst endingViewport = currentCamera.getViewportFromCentreAndRadius(centreX, centreY, centreZ, radius, 40, radius * clip_factor );\n\t\t\t\tconst startingViewport = currentCamera.getCurrentViewport();\n\t\t\t\tcurrentCamera.cameraTransition(startingViewport, endingViewport, duration);\n\t\t\t\tcurrentCamera.enableCameraTransition();\n\t\t\t}\n\t\t}\n\t}\n\n this.isWebGL2 = () => {\n if (renderer)\n return renderer.capabilities.isWebGL2;\n return false;\n }\n};\n\nexport { Renderer };","import * as THREE from 'three';\nimport PACKAGE from '../package.json';\n\n// Import all internal primitives and modules\nimport { Geometry } from './primitives/geometry';\nimport { Glyph } from './primitives/glyph';\nimport { Glyphset } from './primitives/glyphset';\nimport { Pointset } from './primitives/pointset';\nimport { Label } from './primitives/label';\nimport { Lines } from './primitives/lines';\nimport { TextureArray } from './texture/textureArray';\nimport { TextureSlides } from './primitives/textureSlides';\nimport { Renderer } from './renderer';\nimport { Scene } from './scene';\n//import { GeometryCSG } from './geometryCSG';\n//import { GlyphsetCSG } from './glyphsetCSG';\nimport {\n Viewport,\n CameraControls,\n SmoothCameraTransition,\n RayCaster,\n CameraAutoTumble,\n StereoEffect\n} from './controls';\nimport { loadExternalFile, loadExternalFiles } from './utilities';\n\nconst version = PACKAGE.version;\n\n/**\n * Provides a global namespace for the Zinc javascript library and some default parameters for it.\n *\n * @namespace\n * @author Alan Wu\n */\nconst Zinc = function() {\n this.Revision = version;\n this.defaultMaterialColor = 0xFFFFFF;\n this.defaultOpacity = 1.0;\n this.modelPrefix = undefined;\n // Assign hoisted modules to the instance\n this.Geometry = Geometry;\n this.Glyph = Glyph;\n this.Glyphset = Glyphset;\n this.Pointset = Pointset;\n this.Label = Label;\n this.Lines = Lines;\n this.TextureArray = TextureArray;\n this.TextureSlides = TextureSlides;\n this.Renderer = Renderer;\n this.Scene = Scene;\n //this.GeometryCSG = GeometryCSG;\n //this.GlyphsetCSG = GlyphsetCSG;\n this.Viewport = Viewport;\n this.CameraControls = CameraControls;\n this.SmoothCameraTransition = SmoothCameraTransition;\n this.RayCaster = RayCaster;\n this.CameraAutoTumble = CameraAutoTumble;\n this.StereoEffect = StereoEffect;\n this.loadExternalFile = loadExternalFile;\n this.loadExternalFiles = loadExternalFiles;\n this.THREE = THREE;\n};\n\nexport default new Zinc();\n"],"names":["_m1","Matrix4","_obj","Object3D","_offset","Vector3","_temp","Geometry","MathUtils","EventDispatcher","matrix","normalMatrix","Matrix3","i","il","face","j","jl","angle","x","y","z","vector","geometry","scope","index","attributes","position","normal","color","uv","uv2","Color","addFace","a","b","c","materialIndex","vertexColors","vertexNormals","Face3","Vector2","groups","group","start","count","center","radius","s","cb","ab","f","fl","vA","vB","vC","areaWeighted","vertices","v","vl","tmpGeo","dstNormalsFace","dstNormalsVertex","faceNormal","morphNormals","Box3","Sphere","m","morphTargets1","morphTargets2","n","morphColors1","morphColors2","l","morphTarget1","morphTarget2","k","kl","vertexCopy","morphColor1","morphColor2","materialIndexOffset","vertexOffset","vertices1","vertices2","normals2","faces1","faces2","colors1","colors2","faceVertexNormals","faceVertexColors","faceCopy","faceVertexUvs2","uvs2","uvsCopy","mesh","precisionPoints","verticesMap","unique","changes","precision","key","faceIndicesToRemove","indices","idx","diff","points","point","faces","length","materialIndexSort","uvs1","newUvs1","newUvs2","id","data","parameters","vertex","normals","normalsHash","colors","colorsHash","uvs","uvsHash","hasMaterial","hasFaceUv","hasFaceVertexUv","hasFaceNormal","hasFaceVertexNormal","hasFaceColor","hasFaceVertexColor","faceType","setBit","faceVertexUvs","getUvIndex","getNormalIndex","getColorIndex","value","enabled","hash","source","morphTargets","morphTarget","morphNormal","srcVertexNormal","destVertexNormal","skinWeights","skinIndices","lineDistances","boundingBox","boundingSphere","DirectGeometry","buffergeometry","BufferGeometry","positions","BufferAttribute","name","array","attribute","Float32BufferAttribute","buffer","colorArray","colorsArray","normalsArray","object","hasFaceVertexUv2","morphTargetsLength","morphTargetsPosition","morphNormalsLength","morphTargetsNormal","hasSkinIndices","hasSkinWeights","vertexUvs","discPNG","SpriteText","SpriteTextModule","resolveURL","url","actualURL","prefix","Zinc","createNewURL","target","reference","getNewURL","newURL","paramsStrings","urls","getBoundingBox","cachedBox","b1","v1","v2","influences","found","loadExternalFile","callback","errorCallback","response","responseText","error","loadExternalFiles","numUrls","numComplete","result","partialCallback","text","urlIndex","getColorsRGB","index_in_colors","remainder","hex_value","mycolor","THREE","updateMorphColorAttribute","targetGeometry","morph","morphColors","bound","morphArray","toBufferGeometry","geometryIn","options","THREEGeometry","copyMorphColorsToIndexedBufferGeometry","bufferGeometry","morphColor","mergeAttributes","TypedArray","itemSize","normalized","gpuType","arrayLength","offset","tupleOffset","mergeGeometries","geometries","useGroups","isIndexed","attributesUsed","morphAttributesUsed","morphAttributes","morphTargetsRelative","mergedGeometry","attributesCount","indexOffset","mergedIndex","mergedAttribute","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","createBufferGeometry","coords","coord","getCircularTexture","image","texture","createNewSpriteText","height","colour","font","pixel","weight","sprite","isRegionGroup","regionPath","groupName","comparePath","region","r","g","removeVertexAtIndex","maintainLength","positionAttribute","normalAttribute","deleteCount","removed","removeElements","newArray","augmentMorphColor","shader","_start","_end","_inverseMatrix","_ray","Ray","_sphere","_morphA","_morphB","_tempA","_tempB","Line","material","LineBasicMaterial","raycaster","intersects","matrixWorld","threshold","drawRange","morphPosition","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","step","end","calculatePosition","distance","keys","morphAttribute","ml","morphInfluences","influence","LineSegments","LOD","parent","distanceIn","levelObject","loader","level","preload","currentOnly","updateGeometryColour","flag","order","camera","levels","visibleIndex","optimalIndex","marker","myImage","markerImage","size","spriteMaterial","Marker","zincObject","ZincObject","userTexture","userMaterial","userSprite","userUrl","defaultDisplay","number","label","initialise","min","max","scale","porportion","userImage","numberIn","visible","uniqueiId","getUniqueId","durationIn","localTimeEnabled","localMorphColour","isPickable","anatomicalId","groupNameIn","ratio","time","timeChanged","actualDuration","newTime","alpha","isTransparent","hex","closestIndex","currentDistance","applyMatrixWorld","playAnimation","ndcToBeUpdated","renderOrder","scene","inView","mode","delta","cameraControls","targetTime","primitivesLoader","sources","createMeshForGeometry","materialIn","videoTexture","this","range","v3","wireframe","Label","textIn","colourIn","fontWeight","originalScale","scaling","sizeIn","fontWeightIn","Glyph","idIn","glyphsetIn","labelString","_position","meshIn","axis1","axis2","axis3","Loader","regex","file","handlers","materials","texturePath","crossOrigin","BlendingMode","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","textureLoader","TextureLoader","materialLoader","MaterialLoader","textures","loadTexture","path","repeat","wrap","anisotropy","fullPath","RepeatWrapping","MirroredRepeatWrapping","uuid","json","BackSide","DoubleSide","VertexColors","FaceColors","VideoHandler","srcIn","_this","src","duration","actualTime","AnimationClip","DefaultLoadingManager","FileLoader","LoaderUtils","Vector4","JSONLoader","manager","onLoad","onProgress","onError","metadata","type","e","parseModel","isBitSet","fi","zLength","colorIndex","normalIndex","uvIndex","isQuad","faceA","faceB","uvLayer","u","nUvLayers","parseSkin","influencesPerVertex","w","d","parseMorphing","dstVertices","srcVertices","dstNormals","srcNormals","cl","dstColors","srcColors","parseAnimations","outputAnimations","animations","clip","morphAnimationClips","videoHandler","Glyphset","glyphList","axis1s","axis2s","axis3s","scales","labels","numberOfTimeSteps","numberOfVertices","baseSize","scaleFactors","repeat_mode","morphColours","morphVertices","_transformMatrix","_bot_colour","_top_colour","_boundingBox1","_boundingBox2","_boundingBox3","_current_positions","_current_axis1s","_current_axis2s","_current_axis3s","_current_scales","_current_colors","_glyph_axis_array","glyphsetData","glyphURL","finishCallback","isInline","displayLabels","instancedMesh","meshloader","resolve_glyph_axes","return_arrays","axis_scale","final_axis1","final_axis2","final_axis3","final_point","mirrored_axis1","mirrored_axis2","mirrored_axis3","mirrored_point","sign","number_of_glyphs","use_axis1","use_axis2","use_scale","final_scale1","magnitude","updateGlyphsetTransformation","current_positions","current_axis1s","current_axis2s","current_axis3s","current_scales","numberOfGlyphs","numberOfPositions","current_glyph_index","current_index","current_position","current_axis1","current_axis2","current_axis3","current_scale","arrays","glyph","updateGlyphsetHexColors","current_colors","numberOfColours","hex_values","updateMorphGlyphsets","current_time","bottom_frame","proportion","top_frame","bottom_positions","top_positions","bottom_axis1","top_axis1","bottom_axis2","top_axis2","bottom_axis3","top_axis3","bottom_scale","top_scale","bottom_colors","top_colors","createGlyphs","callbackFunction","tempGeometry","Points","PointsMaterial","testPoint","rayPointDistanceSq","intersectPoint","Pointset","labelSets","labelSize","labelDepthTest","labelVisibility","addLabel","labelText","colourHex","removeLabel","current","maxIndex","oldName","Lines","line","width","Texture","img","resolve","reject","instance","canvas","ctx","srcArrays","TextureArray","h","dataStacks","fullArray","transparent","side","glslVersion","fs","vs","getUniforms","TexturePrimitive","textureIn","textureData","imgArray","tArray","TextureSlides","textureSettings","idTextureMap","edgesLine","flipY","flipZ","brightness","contrast","nChannels","maskTexture","maskEnabled","discardAlpha","lt0","lt1","prevTime","slideSettings","slide","setUniformSlideSettingsOfMesh","settings","uniforms","rotation","shader.getUniforms","shader.fs","shader.vs","shader.glslVersion","item","expandBoxWithSettings","box","quaternion","locations","edges","val","brightnessIn","contrastIn","numbersIn","maskTextureIn","normalisedTime","iTime","t0","t1","Viewport","nearPlane","farPlane","eyePosition","targetPosition","upVector","CameraControls","domElement","renderer","MODE","STATE","ROTATE_DIRECTION","KEYBOARD","CLICK_ACTION","inbuildTime","cameraPath","numberOfCameraPoint","updateLightWithPathFlag","playRate","deviceOrientationControl","defaultViewport","currentMode","smoothCameraTransitionObject","rotateCameraTransitionObject","cameraAutoTumbleObject","zoomSize","rotateMode","zincRayCaster","rect","_a","_b","_c","_new_b","_new_c","_axis","_v","_rel_eye","sceneSphere","_tempEye","hasUpdated","ndcControl","maxDist","viewports","currentDist","updateNearAndFarPlane","travalDist","viewportName","viewport","defaultName","depth","cameraOffset","vFOV","wHeight","positionIn","updateRect","out_x","out_y","buttonName","actionName","setCanvasTabindex","element","checkTravelDistance","newDist","translateViewport","translation","onDocumentMouseDown","event","minimapCoordinates","onDocumentMouseMove","onDocumentMouseUp","onDocumentMouseLeave","onDocumentTouchStart","len","dx","dy","onDocumentTouchMove","onDocumentTouchEnd","onDocumentEnter","forced","observer","entries","entry","onDocumentWheelEvent","onDocumentKeydownEvent","unit","onDocumentKeyupEvent","translate","fact","translate_rate","axis","rel_eyea","rel_eyeb","rel_eyec","upa","upb","upc","cos_angle","sin_angle","returned_values","tumble","delta_x","delta_y","tangent_dist","phi","calculateZoomDelta","dist","flyZoom","directionalLightIn","pathData","path_url","requestURL","playRateIn","updateTime","timeIn","targetTimeFrame","updatePath","time_frame","bot_pos","top_pos","handleSyncControl","controlEnabled","updated","ModifiedDeviceOrientationControls","newViewport","centreX","centreY","centreZ","view_angle","clip_distance","localTargetPosition","eye_distance","localEyePosition","localFarPlane","localNearPlane","nearClippingFactor","radiusScale","currentViewport","startingViewport","endingViewport","SmoothCameraTransition","RotateCameraTransition","tumbleDirectionIn","tumbleRateIn","stopOnCameraInputIn","CameraAutoTumble","sceneIn","callbackFunctionIn","hoverCallbackFunctionIn","RayCaster","NDCCameraControl","targetCameraIn","startingEyePosition","startingTargetPosition","startingUp","endingEyePosition","endingTargetPosition","endingUp","targetCamera","completed","newDuration","updateCameraSettings","axisIn","angleIn","previousTime","hostSceneIn","rendererIn","hostScene","hoverCallbackFunction","mouse","awaiting","lastHoveredDate","lastHoveredEmpty","timeDiff","pickedObjects","lastPosition","pickableObjects","zincCamera","threejsScene","objects","zincObjects","origin","direction","hovered","awaitMove","tumbleAxis","tumbleDirection","computeTumbleAxisAngle","StereoCameraZoomFixed","focus","fov","aspect","near","far","zoom","eyeRight","eyeLeft","projectionMatrix","eyeSep","eyeSepOnProjection","ymax","xmin","xmax","StereoEffect","_stereo","onDeviceOrientationChangeEvent","onScreenOrientationChangeEvent","setObjectQuaternion","zee","euler","q0","q1","cameraObject","beta","gamma","orient","eventCallback","cameraIn","defaultViewportIn","scaledDelta","mapMarkerOrange","MarkerCluster","sprites","_v21","_v22","_radius","createNewSprite","localGroup","activateSpriteForCluster","cluster","drawClusters","clusters","currentIndex","getCluster","markersObj","first","newCluster","prop","Minimap","targetScene","positionAttributes","_box","_center","setCurrentCameraSettings","diameter","v4","cameraControl","_vector","LineSegmentsGeometry","InstancedBufferGeometry","lineSegments","instanceBuffer","InstancedInterleavedBuffer","InterleavedBufferAttribute","instanceColorBuffer","WireframeGeometry","maxRadiusSq","UniformsLib","ShaderLib","UniformsUtils","LineMaterial","ShaderMaterial","_start4","_end4","_ssOrigin","_ssOrigin3","_mvMatrix","_line","Line3","_closestPoint","_clipToWorldVector","LineSegments2","Mesh","instanceStart","instanceEnd","instanceDistanceBuffer","ray","resolution","lineWidth","ssMaxWidth","distanceToSphere","sphereMargin","distanceToBox","boxMargin","isBehindCameraNear","deltaDist","t","param","zPos","isInClipSpace","isInside","pointOnLine","Lines2","arrayIn","linesGeometry","faceIndex","vIndex","Region","parentIn","children","tMatrix","child","transformation","nameIn","paths","p","parentName","childRegion","childName","lowerChildName","pathArray","transverse","objectsList","boundingBox1","boundingBox2","objectsArray","childObjects","lowerObjectName","lowerGroupName","primitive","isNew","pointset","lines","opacity","visibility","zincGeometry","GLTFExporter","writer","GLTFLightExtension","GLTFMaterialsUnlitExtension","GLTFMaterialsPBRSpecularGlossiness","input","onDone","GLTFWriter","plugins","WEBGL_CONSTANTS","THREE_TO_WEBGL","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","ClampToEdgeWrapping","PATH_PROPERTIES","GLB_HEADER_BYTES","GLB_HEADER_MAGIC","GLB_VERSION","GLB_CHUNK_PREFIX_BYTES","GLB_CHUNK_TYPE_JSON","GLB_CHUNK_TYPE_BIN","equalArray","array1","array2","stringToArrayBuffer","isIdentityMatrix","getMinMax","output","getPaddedBufferSize","bufferSize","getPaddedArrayBuffer","arrayBuffer","paddingByte","paddedLength","cachedCanvas","buffers","extensionsUsed","blob","extensionsUsedList","reader","binaryChunk","binaryChunkPrefix","jsonChunk","jsonChunkPrefix","header","headerView","totalByteLength","glbBlob","glbReader","base64data","objectDef","extensionName","cache","mapDef","didTransform","transformDef","componentType","componentSize","byteLength","dataView","bufferViewDef","types","end2","minMax","bufferViewTarget","bufferView","accessorDef","format","pending","cachedImages","mimeType","RGBAFormat","imageDef","RGBFormat","bufferViewIndex","map","samplerDef","textureDef","ext","materialDef","metalRoughMapDef","baseColorMapDef","emissive","maxEmissiveComponent","emissiveMapDef","normalMapDef","occlusionMapDef","meshCacheKeyParts","meshCacheKey","meshDef","primitives","targets","nameConversion","originalNormal","modifiedAttribute","attributeName","accessor","weights","targetNames","reverseDictionary","warned","gltfAttributeName","baseAttribute","relativeAttribute","isMultiMaterial","cacheKey","isOrtho","cameraDef","root","nodeMap","tracks","channels","samplers","track","trackBinding","PropertyBinding","trackNode","trackProperty","inputItemSize","outputItemSize","interpolation","InterpolateDiscrete","node","skeleton","rootJoint","joints","inverseBindMatrices","temporaryBoneInverse","nodeDef","meshIndex","nodeIndex","sceneDef","nodes","Scene","objectsWithoutScene","func","light","lightDef","lights","extensionDef","specularFactor","specularMapDef","valueSize","times","values","interpolant","mergedTracks","sourceTracks","sourceTrack","sourceTrackBinding","sourceTrackNode","InterpolateLinear","targetCount","targetIndex","mergedTrack","sourceInterpolant","keyframeIndex","SceneExporter","binary","exporter","gltf","GLTFToZincJSLoader","allCompletedCallback","filename","GLTFLoader","_object_pattern","_material_library_pattern","_material_use_pattern","_map_use_pattern","_vA","_vB","_vC","_ab","_cb","ParserState","state","fromDeclaration","previousMaterial","libraries","previous","cloned","lastMultiMaterial","mi","declared","dst","ua","ub","uc","na","nb","nc","vLen","ia","ib","ic","nLen","uvLen","vi","uvi","OBJLoader","lineFirstChar","lineLength","trimLeft","vertexData","faceVertices","vertexParts","lineParts","lineVertices","lineUVs","li","llen","parts","pointData","container","Group","isLine","isPoints","hasVertexColors","createdMaterials","miLen","sourceMaterial","materialHash","materialLine","Material","materialPoints","MeshPhongMaterial","mergeGlyphData","glyphData","merge","glyphData1","glyphData2","field","geometry1","geometry2","IndexedSourcesHandler","urlIn","onDownloadedCallback","fileLoader","jsonLoader","onDownloaded","downloading","finished","items","processItemDownloaded","modelData","obj","processItemError","args","errorHandling","xhr","progressHandling","MultiSourcesHandler","onLoadCallback","allData","totalDownloaded","isGlyphData","PrimitivesLoader","concurrentDownloads","MAX_DOWNLOAD","jsonloader","fileloader","waitingList","indexedLoaders","loadFromMultipleSources","msHandler","newOptions","loadFromSingleSource","handleIndexedSource","indexedLoader","onFinally","onErrorCallback","STLLoader","isBinary","face_size","n_faces","solid","off","matchDataViewAt","query","parseBinary","hasColors","defaultR","defaultG","defaultB","dataOffset","faceLength","normalX","normalY","normalZ","packedColor","vertexstart","componentIdx","parseASCII","patternSolid","patternFace","faceCounter","patternFloat","patternVertex","patternNormal","groupCount","startVertex","endVertex","vertexCountPerFace","normalCountPerFace","ensureString","ensureBinary","array_buffer","binData","TubeLines","dataIn","geometryConfig","getTubeLinesGeometry","radialSegments","smooth","finalGeometry","curve","tubeGeometry","SceneLoader","viewLoaded","errorDownload","totalSize","totalLoaded","unknownFound","progress","loadMultipleViews","referenceURL","views","defaultView","promises","zincCameraControls","viewData","colours","opacities","timeEnabled","morphColour","targetRegion","jsonFilePrefix","filename_prefix","linesloader","lod","tubeLines","newLines","glyphsetloader","glyphurl","newGlyphset","myCallback","metaurl","pointsetloader","newPointset","loadSurfaceURL","fileFormat","metaFinishCallback","numberOfDownloaded","downloadedItem","newTexture","addZincGeometry","newGeometry","parseDuration","durationString","years","months","weeks","days","hours","mins","secs","readPrimitivesItem","newGeometryURL","readViewAndSettingsItem","loadRegions","currentRegion","regions","regionName","supplementPrimitivesArray","include","exclude","supplementMetadataInArray","getNumberOfDownloadsInArray","includeViews","getNumberOfObjectsInRegions","regionJson","counts","getNumberOfObjects","readVersionOneRegionPath","loadVersionOne","filteredMetada","numberOfObjects","loadVersionTwo","defaultMetadata","defaultDuration","containerIn","cameraHelper","sceneLoader","minimap","zincObjectAddedCallbacks","zincObjectAddedCallbacks_id","zincObjectRemovedCallbacks","zincObjectRemovedCallbacks_id","miniAxesScene","rootRegion","tempGroup","stereoEffectFlag","stereoEffect","scissor","_markerTarget","pickableObjectsList","markerCluster","axisDisplay","_v3","getDrawingWidth","getDrawingHeight","viewPort","GroupName","widthHalf","heightHalf","currentTime","videoHandlerIn","scenesGroup","getWindowsPosition","align","x_offset","y_offset","renderer_width","renderer_height","renderMinimap","stereoFlag","transitionTime","newVec1","newVec2","newVec3","scaleRadius","oldViewport","offsetY","convertDurationObjectTomSec","convertDurationObjectToString","string","millisec","dim","boxGeo","directions","planeGeo","fitBoundingBox","XYZ","xyzObj","arrowHelper","miniArrowHelper","axesLabel","enable","miniaxes","Renderer","currentScene","clock","preRenderCallbackFunctions","preRenderCallbackFunctions_id","postRenderCallbackFunctions","postRenderCallbackFunctions_id","contextLostCallbackFunctions","contextLostCallbackFunctions_id","contextRestoredCallbackFunctions","contextRestoredCallbackFunctions_id","animated_id","cameraOrtho","sceneOrtho","logoSprite","sceneMap","additionalActiveScenes","sensor","isRendering","isInitialised","localRect","onMobile","domCanvas","onContextLost","onContextRestored","oldScene","new_scene","runAnimation","createHUDSprites","imagewidth","imageheight","ResizeSensor","additionalScene","endingScene","currentCamera","version","PACKAGE","zinc"],"mappings":"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"}
|