{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external {\"commonjs\":\"three\",\"amd\":\"three\",\"root\":\"_\"}","webpack:///./node_modules/worker-loader/dist/workers/InlineWorker.js","webpack:///./source/workers/BinaryDecoderWorker.js","webpack:///./source/workers/LASDecoderWorker.js","webpack:///./source/workers/DEMWorker.js","webpack:///./source/workers/EptLaszipDecoderWorker.js","webpack:///./source/workers/EptBinaryDecoderWorker.js","webpack:///./source/utils/LRU.js","webpack:///./source/utils/WorkerManager.js","webpack:///./source/Global.js","webpack:///./source/PointAttributes.js","webpack:///./source/pointcloud/DEMNode.js","webpack:///./source/pointcloud/DEM.js","webpack:///./source/pointcloud/PointCloudTree.js","webpack:///./source/pointcloud/geometries/PointCloudGreyhoundGeometry.js","webpack:///./source/utils/VersionUtils.js","webpack:///./source/XHRFactory.js","webpack:///./source/loaders/GreyhoundBinaryLoader.js","webpack:///./source/loaders/GreyhoundUtils.js","webpack:///./source/loaders/GreyhoundLoader.js","webpack:///./source/loaders/BinaryLoader.js","webpack:///./source/loaders/LASLoader.js","webpack:///./source/loaders/LASLAZLoader.js","webpack:///./source/pointcloud/geometries/PointCloudOctreeGeometry.js","webpack:///./source/loaders/POCLoader.js","webpack:///./source/loaders/ept/EptBinaryLoader.js","webpack:///./source/loaders/ept/EptLaszipLoader.js","webpack:///./source/pointcloud/geometries/PointCloudEptGeometry.js","webpack:///./source/loaders/EptLoader.js","webpack:///./source/utils/HelperUtils.js","webpack:///./source/Gradients.js","webpack:///./source/Shaders.js","webpack:///./source/pointcloud/materials/PointCloudMaterial.js","webpack:///./source/pointcloud/PointCloudOctree.js","webpack:///./source/pointcloud/PointCloudArena4D.js","webpack:///./source/pointcloud/geometries/PointCloudArena4DGeometry.js","webpack:///./source/lib/BinaryHeap.js","webpack:///./source/Potree.js","webpack:///./source/Points.js","webpack:///./source/objects/BasicGroup.js","webpack:///./source/objects/Group.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","URL","window","webkitURL","content","url","blob","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","append","getBlob","e","Blob","Worker","createObjectURL","encodeURIComponent","Error","LRUItem","node","this","previous","next","first","last","items","elements","numPoints","id","item","loaded","lruItem","string","curr","size","Global","pointLoadLimit","disposeDescendants","stack","push","length","current","pop","dispose","remove","children","workers","type","worker","onMessage","message","transfer","self","getWorker","onmessage","event","returnWorker","undefined","postMessage","BINARY_DECODER","LAS_LAZ","LAS_DECODER","GREYHOUND","DEM","EPT_LAS_ZIP_DECODER","EPT_BINARY_DECODER","debug","workerPath","currentScript","document","scripts","getElementsByTagName","getAttribute","getCurrentScript","src","scriptPath","href","slice","console","error","getBasePath","maxNodesLoadGPUFrame","maxDEMLevel","maxNodesLoading","navigator","hardwareConcurrency","numNodesLoading","measureTimings","workerPool","lru","pointcloudTransformVersion","PointAttributeNames","POSITION_CARTESIAN","COLOR_PACKED","COLOR_FLOATS_1","COLOR_FLOATS_255","NORMAL_FLOATS","FILLER","INTENSITY","CLASSIFICATION","NORMAL_SPHEREMAPPED","NORMAL_OCT16","NORMAL","RETURN_NUMBER","NUMBER_OF_RETURNS","SOURCE_ID","INDICES","SPACING","PointAttributeTypes","DATA_TYPE_DOUBLE","ordinal","DATA_TYPE_FLOAT","DATA_TYPE_INT8","DATA_TYPE_UINT8","DATA_TYPE_INT16","DATA_TYPE_UINT16","DATA_TYPE_INT32","DATA_TYPE_UINT32","DATA_TYPE_INT64","DATA_TYPE_UINT64","obj","PointAttribute","numElements","byteSize","PointAttributes","pointAttributes","attributes","pointAttribute","RGBA_PACKED","RGB_PACKED","FILLER_1B","add","hasColors","hasNormals","box","tileSize","level","data","Float32Array","fill","Infinity","mipMap","mipMapNeedsUpdate","sourceSize","mipSize","parseInt","mipSource","mipData","j","h00","h01","h10","h11","height","weight","isFinite","position","boxSize","getSize","x","min","y","mipMapLevel","uv","Math","a","b","i0","i1","floor","ceil","j0","j1","wh00","wh01","wh10","wh11","wsum","h","heightAtMipMapLevel","handler","child","filter","traverse","pointcloud","matrix","boundingBox","root","version","result","nodeBoxSize","max","index","childBox","clone","map","list","currentHeight","childIndex","z","visibleNodes","equals","matrixWorld","applyMatrix4","vn","demVersion","projectedBox","getBoundingBox","projectedBoxSize","targetNodes","expandAndFindByBox","getLevel","geometryNode","geometry","array","toArray","buffer","transferables","runTask","dem","demNode","u","v","ix","iy","createMipMap","PointCloudTreeNode","needsTransformUpdate","super","PointCloudGreyhoundGeometry","spacing","nodes","hierarchyStepSize","loader","schema","baseDepth","offset","projection","boundingSphere","serverURL","normalize","color","intensity","PointCloudGreyhoundGeometryNode","pcoGeometry","scale","IDCount","charAt","getBoundingSphere","oneTimeDisposeHandlers","baseLoaded","center","bounds","sub","getCenter","multiplyScalar","greyhoundBounds","greyhoundOffset","VersionUtils","vmLength","indexOf","versionMajor","substr","versionMinor","isGeometryNode","isTreeNode","isLoaded","getChildren","getURL","boundsString","JSON","stringify","addChild","parent","load","loading","hasChildren","loadHierarchyThenPoints","loadPoints","transform","parseChildrenCounts","base","parentName","childName","keys","forEach","swd","nwd","swu","nwu","sed","ned","seu","neu","mask","depthBegin","depthEnd","hurl","xhr","XHRFactory","createXMLHttpRequest","overrideMimeType","open","onload","greyhoundHierarchy","decoded","pgg","parentNode","substring","currentNode","GreyhoundLoader","createChildAABB","pow","callback","parse","responseText","onerror","log","status","send","getNumPoints","assign","newerThan","equalOrHigher","upTo","config","withCredentials","customHeaders","header","XMLHttpRequest","Array","isArray","baseOpen","apply","arguments","customHeader","setRequestHeader","fetch","async","resource","headers","Headers","options","credentials","responseType","response","DataView","byteLength","getUint32","bb","THREE","Vector3","nodeOffset","buffers","attributeBuffers","tightBoundingBox","Box3","fromArray","BufferGeometry","setAttribute","BufferAttribute","Uint8Array","bufferAttribute","normalized","set","mean","replace","results","RegExp","exec","location","decodeURIComponent","cb","onreadystatechange","readyState","reduce","fetchBinary","err","view","numBytes","pointSize","pointSizeFrom","colorNorm","intensityNorm","getUint16","loadInfoJSON","split","greyhoundInfo","getQueryParam","parseFloat","red","green","blue","entry","createSchema","srs","Sphere","getNormalization","_","loadPointAttributes","mno","fpa","pa","aabb","dHalfLength","copy","xHalfLength","yHalfLength","zHalfLength","cmin","cmax","estimatedSpacing","pointFormatReaders","dv","getInt32","getUint8","readAs","buf","Type","count","BYTES_PER_ELEMENT","ret","LASLoader","arraybuffer","LAZLoader","nextCB","dorr","req","LASFile","determineVersion","determineFormat","formatId","isCompressed","LASDecoder","pointFormatID","pointsCount","mins","maxs","arrayb","decoder","readOffset","Promise","res","rej","setTimeout","getHeader","pointsOffset","Uint32Array","pointsFormatId","pointsStructSize","Uint16Array","start","Float64Array","parseLASHeader","readData","skip","end","hasMoreData","pointsToRead","bufferSize","pointsRead","close","bit_7","bit_6","ver","Int8Array","versionAsString","getPoint","toLowerCase","ArrayBuffer","lf","then","msg","isOpen","catch","totalRead","reader","positions","colors","intensities","classifications","classification","returnNumbers","returnNumber","numberOfReturns","pointSourceIDs","pointSourceID","indices","PointCloudOctreeGeometry","octreeDir","getHierarchyPath","path","numParts","loadHierachyThenPoints","hbuffer","snode","shift","childChildren","childNumPoints","pco","decodedNumPoints","lx","ly","lz","ux","uy","uz","tightBoundingSphere","hierarchy","subVectors","g","pointSourceId","doneLoading","ept","eptScale","eptOffset","read","extraBytes","las","toVector3","dim","find","info","boundsConforming","xyz","findDim","span","ticks","toBox3","sphereFrom","fallbackProjection","horizontal","authority","wkt","hierarchyType","dataType","dst","step","includes","concat","k","toPotreeName","filename","loadHierarchy","eptHierarchyFile","hier","json","sort","da","xa","ya","za","db","xb","yb","zb","bufferGeometry","np","file","lastIndexOf","width","texture","needsUpdate","magFilter","vertices","setFromPoints","Gradients","RAINBOW","SPECTRAL","PLASMA","YELLOW_GREEN","VIRIDIS","INFERNO","GRAYSCALE","Shaders","vertex","common","logdepthbuf_pars_vertex","logdepthbuf_vertex","fragment","logdepthbuf_pars_fragment","logdepthbuf_fragment","parameters","visibleNodesTexture","generateDataTexture","minFilter","getValid","minSize","maxSize","treeType","TreeType","OCTREE","_pointSizeType","PointSizeType","FIXED","_shape","PointShape","SQUARE","_pointColorType","PointColorType","RGB","_weighted","_gradient","_treeType","_defaultIntensityRangeChanged","_defaultElevationRangeChanged","gradientTexture","generateGradientTexture","lights","fog","defines","Map","normal","uniforms","projectionMatrix","uViewInv","clipPlanes","vnStart","fov","uScreenWidth","uScreenHeight","uOctreeSpacing","near","far","uColor","uOpacity","octreeSize","bbSize","elevationRange","gradient","classificationLUT","diffuse","transition","intensityRange","intensityGamma","intensityContrast","intensityBrightness","rgbGamma","rgbBrightness","uTransition","wRGB","wIntensity","wElevation","wClassification","wReturnNumber","wSourceID","logDepthBufFC","uPCIndex","Classification","DEFAULT","defaultAttributeValues","getDefines","vertexColors","vertexShader","fragmentShader","updateMaterial","removeDefine","delete","opacity","blending","transparent","depthTest","depthWrite","depthFunc","weighted","shader","renderer","capabilities","logarithmicDepthBuffer","USE_LOGDEPTHBUF","USE_LOGDEPTHBUF_EXT","EPSILON","pointSizeTypes","fixed_point_size","ATTENUATED","attenuated_point_size","ADAPTIVE","adaptive_point_size","pointShapes","square_point_shape","CIRCLE","circle_point_shape","PARABOLOID","paraboloid_point_shape","pointColorTypes","color_type_rgb","COLOR","color_type_color","DEPTH","color_type_depth","HEIGHT","color_type_height","color_type_intensity","INTENSITY_GRADIENT","color_type_intensity_gradient","POINT_INDEX","color_type_point_index","color_type_classification","color_type_return_number","SOURCE","color_type_source","color_type_normal","PHONG","color_type_phong","RGB_HEIGHT","color_type_rgb_height","COMPOSITE","color_type_composite","treeTypes","tree_type_octree","KDTREE","tree_type_kdtree","pointSizeType","shape","weighted_splats","_classification","isEqual","recomputeClassification","classificationTexture","generateClassificationTexture","dispatchEvent","target","screenWidth","screenHeight","canvas","createElement","context","getContext","rect","ctxGradient","createLinearGradient","addColorStop","getHexString","fillStyle","w","wrapS","wrapT","_hiddenListeners","_listeners","from","sceneNode","octree","boxNode","posOffset","stride","worldToBox","getInverse","objectToBox","multiplyMatrices","inBox","pos","getFloat32","material","pointBudget","visiblePointsTarget","minimumNodePixelSize","updateMatrix","showBoundingBox","boundingBoxNodes","loadQueue","visibleBounds","visibleGeometry","generateDEM","profileRequests","tempVector3","getBoundingBoxWorld","updateMatrixWorld","bMin","computeTransformedBoundingBox","bMax","heightMin","heightMax","frustumCulled","onBeforeRender","scene","camera","group","visibleNodeTextureOffsets","pcIndex","leafNodes","isLeaf","visible","expandByPoint","octtreeSpacing","PI","domElement","clientWidth","clientHeight","uniformsNeedUpdate","performance","mark","na","nb","v1","intersectSphereBack","ray","sphere","origin","tca","dot","direction","d2","radius2","radius","t1","sqrt","lodRanges","leafNodeLodRanges","constructor","vArrayIndex","bSphere","matrixWorldInverse","distance","getWorldDirection","distance2","distanceTo","has","prevDistance","newDistance","lod","range","measure","offsets","profile","bsWorld","intersects","points","closestPointToPoint","nodesOnRay","_ray","intersectsSphere","force","matrixAutoUpdate","matrixWorldNeedsUpdate","tBox","maxDepth","segments","projectedBoundingBox","ps","getProfile","segment","project","mileage","_start","_end","_mileage","_boundingBox","xAxis","dir","alpha","acos","toOrigin","makeTranslation","alignWithX","makeRotationY","applyMileage","depth","viewer","params","pRenderer","getVal","pickWindowSize","pickState","pointColorType","renderTarget","format","pickMaterial","clippingPlanes","clipping","setSize","pixelPos","gl","enable","SCISSOR_TEST","scissor","state","setTest","setMask","setBlending","setRenderTarget","clearColor","clearTarget","tmp","renderOctree","clamp","number","readPixels","RGBA","UNSIGNED_BYTE","resetGLState","setScissorTest","disable","pixels","ibuffer","hits","Number","MAX_VALUE","pIndex","hit","distanceToCenter","all","point","pc","attributeName","attribute","shrinkedLocalBounds","fittedPosition","fitted","rotation","ds","multiply","maxLevel","char","left","right","kdtree","addEventListener","numVisibleNodes","numVisiblePoints","sizeType","_this","program","useProgram","getUniforms","setValue","levels","boundingBoxNode","childOfChild","la","lb","visibleNodeNames","b1","b2","b3","sourceView","u32Indices","numNodes","provider","_spacing","Name","Provider","Nodes","Points","Version","BoundingBox","Spacing","hasLeft","hasRight","parentBBSize","done","top","BinaryHeap","scoreFunction","element","bubbleUp","sinkDown","score","parentN","elemScore","child2N","child1N","swap","child1","child1Score","child2","AttributeLocations","0","1","2","3","4","5","6","7","8","9","12","ELEVATION","LOD","LEVEL_OF_DETAIL","loadPointCloud","updateVisibility","pointclouds","totalPointBudget","numVisiblePointsInPointclouds","unloadedGeometry","lowestSpacing","structures","updateVisibilityStructures","frustums","camObjPositions","priorityQueue","loadedToGPUThisFrame","domHeight","frustum","camObjPos","insideFrustum","intersectsBox","numVisiblePointsInPointcloud","toTreeNode","touch","_transformVersion","transformVersion","boxHelper","isPerspectiveCamera","screenPixelRadius","tan","candidates","updatingNodes","update","updatePointClouds","updateVisibleBounds","freeMemory","initialized","deepestVisibleLevel","viewI","world","frustumCam","updateProjectionMatrix","proj","fm","setFromProjectionMatrix","worldI","invert","camMatrixObject","setFromMatrixPosition","hideDescendants","currentSize","newSize","thisAttributes","otherAttributes","Set","merged","elementsPerPoint","expanded","union","wireframe","nodeSize","nodeLoadRate","raycaster","budget","recalculateBoxGeometry","splice","pointcloudBox","boxWorld","fromSpacing","pHeight","pFromSpacing","lpos","intersectBox","textures","fetchOctrees","octrees","prepareOcttree","visibleChildren","viewInv","visibilityTextureData","computeVisibilityTextureData","vnt","image","numClippingPlanes","num_clipplanes","planes","flattenedPlanes","constant","clippingPlanesAsVec4Array","weightRGB","weightIntensity","weightElevation","weightClassification","weightReturnNumber","weightSourceID","LN2"],"mappings":"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","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n","module.exports = require(\"three\");","'use strict';\n\n// http://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string\n\nvar URL = window.URL || window.webkitURL;\n\nmodule.exports = function (content, url) {\n  try {\n    try {\n      var blob;\n\n      try {\n        // BlobBuilder = Deprecated, but widely implemented\n        var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n\n        blob = new BlobBuilder();\n\n        blob.append(content);\n\n        blob = blob.getBlob();\n      } catch (e) {\n        // The proposed API\n        blob = new Blob([content]);\n      }\n\n      return new Worker(URL.createObjectURL(blob));\n    } catch (e) {\n      return new Worker('data:application/javascript,' + encodeURIComponent(content));\n    }\n  } catch (e) {\n    if (!url) {\n      throw Error('Inline worker is not supported');\n    }\n\n    return new Worker(url);\n  }\n};","module.exports = function() {\n  return require(\"!!/home/haakon/Documents/potree-core/node_modules/worker-loader/dist/workers/InlineWorker.js\")(\"!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){\\\"undefined\\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\\"Module\\\"}),Object.defineProperty(e,\\\"__esModule\\\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\\\"object\\\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\\\"default\\\",{enumerable:!0,value:e}),2&t&&\\\"string\\\"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\\\"a\\\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\\\"\\\",r(r.s=0)}([function(e,t,r){\\\"use strict\\\";function n(e){this.buffer=e,this.u8=new Uint8Array(e);var t=new ArrayBuffer(4),r=new Float32Array(t),n=new Uint8Array(t);this.getUint32=function(e){return this.u8[e+3]<<24|this.u8[e+2]<<16|this.u8[e+1]<<8|this.u8[e]},this.getUint16=function(e){return this.u8[e+1]<<8|this.u8[e]},this.getFloat32=function(e){return n[0]=this.u8[e+0],n[1]=this.u8[e+1],n[2]=this.u8[e+2],n[3]=this.u8[e+3],r[0]},this.getUint8=function(e){return this.u8[e]}}function i(e){this.version=e;var t=-1===e.indexOf(\\\".\\\")?e.length:e.indexOf(\\\".\\\");this.versionMajor=parseInt(e.substr(0,t)),this.versionMinor=parseInt(e.substr(t+1)),0===this.versionMinor.length&&(this.versionMinor=0)}onmessage=function(e){if(e.data&&e.data.buffer)try{var t=e.data.buffer,r=e.data.pointAttributes,a=t.byteLength/r.byteSize,s=new n(t),o=new i(e.data.version),u=e.data.offset,f=e.data.scale,A=(e.data.spacing,e.data.hasChildren,e.data.name,[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]),T=[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],b=[0,0,0],_={},h=0;for(var I of r.attributes){if(I.name===P.POSITION_CARTESIAN.name){for(var N=new ArrayBuffer(4*a*3),y=new Float32Array(N),E=0;E<a;E++){o.newerThan(\\\"1.3\\\")?(F=s.getUint32(h+E*r.byteSize+0,!0)*f,R=s.getUint32(h+E*r.byteSize+4,!0)*f,Y=s.getUint32(h+E*r.byteSize+8,!0)*f):(F=s.getFloat32(E*r.byteSize+0,!0)+u[0],R=s.getFloat32(E*r.byteSize+4,!0)+u[1],Y=s.getFloat32(E*r.byteSize+8,!0)+u[2]),y[3*E+0]=F,y[3*E+1]=R,y[3*E+2]=Y,b[0]+=F/a,b[1]+=R/a,b[2]+=Y/a,A[0]=Math.min(A[0],F),A[1]=Math.min(A[1],R),A[2]=Math.min(A[2],Y),T[0]=Math.max(T[0],F),T[1]=Math.max(T[1],R),T[2]=Math.max(T[2],Y)}_[I.name]={buffer:N,attribute:I}}else if(I.name===P.COLOR_PACKED.name){N=new ArrayBuffer(4*a);var l=new Uint8Array(N);for(E=0;E<a;E++)l[4*E+0]=s.getUint8(h+E*r.byteSize+0),l[4*E+1]=s.getUint8(h+E*r.byteSize+1),l[4*E+2]=s.getUint8(h+E*r.byteSize+2);_[I.name]={buffer:N,attribute:I}}else if(I.name===P.INTENSITY.name){N=new ArrayBuffer(4*a);var S=new Float32Array(N);for(E=0;E<a;E++){var m=s.getUint16(h+E*r.byteSize,!0);S[E]=m}_[I.name]={buffer:N,attribute:I}}else if(I.name===P.CLASSIFICATION.name){N=new ArrayBuffer(a);var M=new Uint8Array(N);for(E=0;E<a;E++){var O=s.getUint8(h+E*r.byteSize);M[E]=O}_[I.name]={buffer:N,attribute:I}}else if(I.name===P.NORMAL_SPHEREMAPPED.name){N=new ArrayBuffer(4*a*3);var v=new Float32Array(N);for(E=0;E<a;E++){var d=s.getUint8(h+E*r.byteSize+0),g=s.getUint8(h+E*r.byteSize+1),w=2*(d/255)-1,c=2*(g/255)-1,z=1,U=w*-w+c*-c+1*z;z=U,w*=Math.sqrt(U),c*=Math.sqrt(U),w*=2,c*=2,z=2*z-1,v[3*E+0]=w,v[3*E+1]=c,v[3*E+2]=z}_[I.name]={buffer:N,attribute:I}}else if(I.name===P.NORMAL_OCT16.name){for(N=new ArrayBuffer(4*a*3),v=new Float32Array(N),E=0;E<a;E++){d=s.getUint8(h+E*r.byteSize+0),g=s.getUint8(h+E*r.byteSize+1);var D=d/255*2-1,p=g/255*2-1,Y=1-Math.abs(D)-Math.abs(p),F=0,R=0;Y>=0?(F=D,R=p):(F=-(p/Math.sign(p)-1)/Math.sign(D),R=-(D/Math.sign(D)-1)/Math.sign(p));var L=Math.sqrt(F*F+R*R+Y*Y);F/=L,R/=L,Y/=L,v[3*E+0]=F,v[3*E+1]=R,v[3*E+2]=Y}_[I.name]={buffer:N,attribute:I}}else if(I.name===P.NORMAL.name){for(N=new ArrayBuffer(4*a*3),v=new Float32Array(N),E=0;E<a;E++){F=s.getFloat32(h+E*r.byteSize+0,!0),R=s.getFloat32(h+E*r.byteSize+4,!0),Y=s.getFloat32(h+E*r.byteSize+8,!0);v[3*E+0]=F,v[3*E+1]=R,v[3*E+2]=Y}_[I.name]={buffer:N,attribute:I}}h+=I.byteSize}N=new ArrayBuffer(4*a);for(var C=new Uint32Array(N),B=0;B<a;B++)C[B]=B;_[P.INDICES.name]={buffer:N,attribute:P.INDICES};var x={buffer:t,mean:b,attributeBuffers:_,tightBoundingBox:{min:A,max:T}},j=[];for(var G in x.attributeBuffers)j.push(x.attributeBuffers[G].buffer);j.push(t),postMessage(x,j)}catch(e){postMessage({error:\\\"Exeption thrown during execution.\\\"})}},i.prototype.newerThan=function(e){var t=new i(e);return this.versionMajor>t.versionMajor||this.versionMajor===t.versionMajor&&this.versionMinor>t.versionMinor};var a=0,s=1,o=4,u=5,f=6,A=7,T=8,b=9,_=10,h=11,I=12,N=13,y=14,E=15,l={DATA_TYPE_DOUBLE:{ordinal:0,size:8},DATA_TYPE_FLOAT:{ordinal:1,size:4},DATA_TYPE_INT8:{ordinal:2,size:1},DATA_TYPE_UINT8:{ordinal:3,size:1},DATA_TYPE_INT16:{ordinal:4,size:2},DATA_TYPE_UINT16:{ordinal:5,size:2},DATA_TYPE_INT32:{ordinal:6,size:4},DATA_TYPE_UINT32:{ordinal:7,size:4},DATA_TYPE_INT64:{ordinal:8,size:8},DATA_TYPE_UINT64:{ordinal:9,size:8}},S=0;for(var m in l)l[S]=l[m],S++;function P(e,t,r){this.name=e,this.type=t,this.numElements=r,this.byteSize=this.numElements*this.type.size}function M(e){if(this.attributes=[],this.byteSize=0,this.size=0,null!=e)for(var t=0;t<e.length;t++){var r=P[e[t]];this.attributes.push(r),this.byteSize+=r.byteSize,this.size++}}P.POSITION_CARTESIAN=new P(a,l.DATA_TYPE_FLOAT,3),P.RGBA_PACKED=new P(s,l.DATA_TYPE_INT8,4),P.COLOR_PACKED=P.RGBA_PACKED,P.RGB_PACKED=new P(s,l.DATA_TYPE_INT8,3),P.NORMAL_FLOATS=new P(o,l.DATA_TYPE_FLOAT,3),P.FILLER_1B=new P(u,l.DATA_TYPE_UINT8,1),P.INTENSITY=new P(f,l.DATA_TYPE_UINT16,1),P.CLASSIFICATION=new P(A,l.DATA_TYPE_UINT8,1),P.NORMAL_SPHEREMAPPED=new P(T,l.DATA_TYPE_UINT8,2),P.NORMAL_OCT16=new P(b,l.DATA_TYPE_UINT8,2),P.NORMAL=new P(_,l.DATA_TYPE_FLOAT,3),P.RETURN_NUMBER=new P(h,l.DATA_TYPE_UINT8,1),P.NUMBER_OF_RETURNS=new P(I,l.DATA_TYPE_UINT8,1),P.SOURCE_ID=new P(N,l.DATA_TYPE_UINT8,1),P.INDICES=new P(y,l.DATA_TYPE_UINT32,1),P.SPACING=new P(E,l.DATA_TYPE_FLOAT,1),M.prototype.add=function(e){this.attributes.push(e),this.byteSize+=e.byteSize,this.size++},M.prototype.hasColors=function(){for(var e in this.attributes){if(this.attributes[e].name===s)return!0}return!1},M.prototype.hasNormals=function(){for(var e in this.attributes){var t=this.attributes[e];if(t===P.NORMAL_SPHEREMAPPED||t===P.NORMAL_FLOATS||t===P.NORMAL||t===P.NORMAL_OCT16)return!0}return!1}}]);\\n//# sourceMappingURL=main.map\", null);\n};","module.exports = function() {\n  return require(\"!!/home/haakon/Documents/potree-core/node_modules/worker-loader/dist/workers/InlineWorker.js\")(\"!function(e){var r={};function n(t){if(r[t])return r[t].exports;var a=r[t]={i:t,l:!1,exports:{}};return e[t].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=r,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},n.r=function(e){\\\"undefined\\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\\"Module\\\"}),Object.defineProperty(e,\\\"__esModule\\\",{value:!0})},n.t=function(e,r){if(1&r&&(e=n(e)),8&r)return e;if(4&r&&\\\"object\\\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,\\\"default\\\",{enumerable:!0,value:e}),2&r&&\\\"string\\\"!=typeof e)for(var a in e)n.d(t,a,function(r){return e[r]}.bind(null,a));return t},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,\\\"a\\\",r),r},n.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},n.p=\\\"\\\",n(n.s=0)}([function(e,r,n){\\\"use strict\\\";onmessage=function(e){if(e.data&&e.data.buffer){for(var r=e.data.buffer,n=e.data.numPoints,t=e.data.pointSize,a=e.data.pointFormatID,i=e.data.scale,o=e.data.offset,u=(new Uint8Array(r),new DataView(r)),f=new ArrayBuffer(40*n),m=(new DataView(f),{min:[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY],max:[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY]}),s=[0,0,0],c=new ArrayBuffer(3*n*4),I=new ArrayBuffer(4*n),y=new ArrayBuffer(4*n),l=new ArrayBuffer(n),d=new ArrayBuffer(n),b=new ArrayBuffer(n),p=new ArrayBuffer(2*n),w=new Float32Array(c),N=new Uint8Array(I),A=new Float32Array(y),g=new Uint8Array(l),v=new Uint8Array(d),x=new Uint8Array(b),T=new Uint16Array(p),U=0;U<n;U++){var O=u.getInt32(U*t+0,!0),_=u.getInt32(U*t+4,!0),B=u.getInt32(U*t+8,!0),M=O*i[0]+o[0]-e.data.mins[0],S=_*i[1]+o[1]-e.data.mins[1],E=B*i[2]+o[2]-e.data.mins[2];w[3*U+0]=M,w[3*U+1]=S,w[3*U+2]=E,s[0]+=M/n,s[1]+=S/n,s[2]+=E/n,m.min[0]=Math.min(m.min[0],M),m.min[1]=Math.min(m.min[1],S),m.min[2]=Math.min(m.min[2],E),m.max[0]=Math.max(m.max[0],M),m.max[1]=Math.max(m.max[1],S),m.max[2]=Math.max(m.max[2],E);var F=u.getUint16(U*t+12,!0);A[U]=F;var P=u.getUint8(U*t+14,!0),h=7&P,V=(56&P)>>3;v[U]=h,x[U]=V;var j=u.getUint8(U*t+15,!0);g[U]=j;var Y=u.getUint16(U*t+18,!0);if(T[U]=Y,2===a){var D=u.getUint16(U*t+20,!0)/256,G=u.getUint16(U*t+22,!0)/256,R=u.getUint16(U*t+24,!0)/256;N[4*U+0]=D,N[4*U+1]=G,N[4*U+2]=R,N[4*U+3]=255}}var z=new ArrayBuffer(4*n),k=new Uint32Array(z);for(U=0;U<n;U++)k[U]=U;var q={mean:s,position:c,color:I,intensity:y,classification:l,returnNumber:d,numberOfReturns:b,pointSourceID:p,tightBoundingBox:m,indices:z};postMessage(q,[q.position,q.color,q.intensity,q.classification,q.returnNumber,q.numberOfReturns,q.pointSourceID,q.indices])}}}]);\\n//# sourceMappingURL=main.map\", null);\n};","module.exports = function() {\n  return require(\"!!/home/haakon/Documents/potree-core/node_modules/worker-loader/dist/workers/InlineWorker.js\")(\"!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\\\"undefined\\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\\"Module\\\"}),Object.defineProperty(e,\\\"__esModule\\\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\\\"object\\\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\\\"default\\\",{enumerable:!0,value:e}),2&t&&\\\"string\\\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\\\"a\\\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\\\"\\\",n(n.s=0)}([function(e,t,n){\\\"use strict\\\";onmessage=function(e){var t=e.data.boundingBox,n=new Float32Array(e.data.position),r=n.length/3,o=t.max[0]-t.min[0],a=t.max[1]-t.min[1],i=(t.max[2],t.min[2],new Float32Array(4096));i.fill(-1/0);for(var u=0;u<r;u++){var f=n[3*u+0],l=n[3*u+1],c=n[3*u+2],d=f/o,s=l/a;i[parseInt(Math.min(64*d,63))+64*parseInt(Math.min(64*s,63))]=c}var p={dem:{width:64,height:64,data:i.buffer}};postMessage(p,[p.dem.data])}}]);\\n//# sourceMappingURL=main.map\", null);\n};","module.exports = function() {\n  return require(\"!!/home/haakon/Documents/potree-core/node_modules/worker-loader/dist/workers/InlineWorker.js\")(\"!function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){\\\"undefined\\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\\"Module\\\"}),Object.defineProperty(e,\\\"__esModule\\\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\\\"object\\\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\\\"default\\\",{enumerable:!0,value:e}),2&t&&\\\"string\\\"!=typeof e)for(var a in e)r.d(n,a,function(t){return e[t]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\\\"a\\\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\\\"\\\",r(r.s=0)}([function(e,t){onmessage=function(e){if(performance.mark(\\\"laslaz-start\\\"),!e.data||!e.data.buffer)return;let t=e.data.buffer,r=e.data.numPoints,n=e.data.pointSize,a=e.data.pointFormatID,i=e.data.scale,o=e.data.offset,u=(new Uint8Array(t),new DataView(t)),f={min:[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY],max:[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY]},l=[0,0,0],m=new ArrayBuffer(3*r*4),c=new ArrayBuffer(4*r),s=new ArrayBuffer(4*r),I=new ArrayBuffer(r),d=new ArrayBuffer(r),p=new ArrayBuffer(r),b=new ArrayBuffer(2*r),g=new Float32Array(m),N=new Uint8Array(c),w=new Float32Array(s),A=new Uint8Array(I),U=new Uint8Array(d),T=new Uint8Array(p),M=new Uint16Array(b),O=2==a||3==a,_=2==a?20:28,S=!1;if(O){let e,t,a,i;for(let o=0;o<r&&!S;++o)i=o*n,e=u.getUint16(i+_,!0),t=u.getUint16(i+_+2,!0),a=u.getUint16(i+_+4,!0),(e>255||t>255||a>255)&&(S=!0)}for(let t=0;t<r;t++){let a=u.getInt32(t*n+0,!0),m=u.getInt32(t*n+4,!0),c=u.getInt32(t*n+8,!0);x=a*i[0]+o[0]-e.data.mins[0],y=m*i[1]+o[1]-e.data.mins[1],z=c*i[2]+o[2]-e.data.mins[2],g[3*t+0]=x,g[3*t+1]=y,g[3*t+2]=z,l[0]+=x/r,l[1]+=y/r,l[2]+=z/r,f.min[0]=Math.min(f.min[0],x),f.min[1]=Math.min(f.min[1],y),f.min[2]=Math.min(f.min[2],z),f.max[0]=Math.max(f.max[0],x),f.max[1]=Math.max(f.max[1],y),f.max[2]=Math.max(f.max[2],z);let s=u.getUint16(t*n+12,!0);w[t]=s;let I=u.getUint8(t*n+14,!0),d=7&I,p=(56&I)>>3;U[t]=d,T[t]=p;let b=u.getUint8(t*n+15,!0);A[t]=b;let B=u.getUint16(t*n+18,!0);if(M[t]=B,O){let e=u.getUint16(t*n+_,!0),r=u.getUint16(t*n+_+2,!0),a=u.getUint16(t*n+_+4,!0);S&&(e/=256,r/=256,a/=256),N[4*t+0]=e,N[4*t+1]=r,N[4*t+2]=a,N[4*t+3]=255}}let B=new ArrayBuffer(4*r),E=new Uint32Array(B);for(let e=0;e<r;e++)E[e]=e;performance.mark(\\\"laslaz-end\\\"),performance.clearMarks(),performance.clearMeasures();let F={mean:l,position:m,color:c,intensity:s,classification:I,returnNumber:d,numberOfReturns:p,pointSourceID:b,tightBoundingBox:f,indices:B};postMessage(F,[F.position,F.color,F.intensity,F.classification,F.returnNumber,F.numberOfReturns,F.pointSourceID,F.indices])}}]);\\n//# sourceMappingURL=main.map\", null);\n};","module.exports = function() {\n  return require(\"!!/home/haakon/Documents/potree-core/node_modules/worker-loader/dist/workers/InlineWorker.js\")(\"!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){\\\"undefined\\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\\\"Module\\\"}),Object.defineProperty(e,\\\"__esModule\\\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\\\"object\\\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\\\"default\\\",{enumerable:!0,value:e}),2&t&&\\\"string\\\"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\\\"a\\\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\\\"\\\",r(r.s=0)}([function(e,t){Potree={},onmessage=function(e){if(!e.data||!e.data.buffer)return;let t,r,n,i,a,u,o,f,s,c,l,m,d,y,b,A,g,w,p,x,M,U=e.data.buffer,h=new DataView(U),N=e.data.schema,B=e.data.scale,O=e.data.offset,_=e.data.mins,I=N.reduce((e,t)=>(e[t.name]=t,e),{}),v=e=>{let t=(e=>{let t=0;for(var r=0;r<N.length;++r){if(N[r].name==e)return t;t+=N[r].size}})(e),r=I[e].type,n=I[e].size;if(\\\"signed\\\"==r)switch(n){case 1:return e=>h.getInt8(e+t);case 2:return e=>h.getInt16(e+t,!0);case 4:return e=>h.getInt32(e+t,!0);case 8:return e=>h.getInt64(e+t,!0)}if(\\\"unsigned\\\"==r)switch(n){case 1:return e=>h.getUint8(e+t);case 2:return e=>h.getUint16(e+t,!0);case 4:return e=>h.getUint32(e+t,!0);case 8:return e=>h.getUint64(e+t,!0)}if(\\\"float\\\"==r)switch(n){case 4:return e=>h.getFloat32(e+t,!0);case 8:return e=>h.getFloat64(e+t,!0)}let i=JSON.stringify(I[e]);throw new Error(`Invalid dimension specification for ${e}: ${i}`)},S=N.reduce((e,t)=>e+t.size,0),P=U.byteLength/S,R=!1;if(I.X&&I.Y&&I.Z&&(t=new ArrayBuffer(4*P*3),f=new Float32Array(t),b=[v(\\\"X\\\"),v(\\\"Y\\\"),v(\\\"Z\\\")]),I.Red&&I.Green&&I.Blue){let e,t,n,i;r=new ArrayBuffer(4*P),s=new Uint8Array(r),A=[v(\\\"Red\\\"),v(\\\"Green\\\"),v(\\\"Blue\\\")];for(let r=0;r<P&&!R;++r)i=r*S,e=A[0](i),t=A[1](i),n=A[2](i),(e>255||t>255||n>255)&&(R=!0)}I.Intensity&&(n=new ArrayBuffer(4*P),c=new Float32Array(n),g=v(\\\"Intensity\\\")),I.Classification&&(i=new ArrayBuffer(P),l=new Uint8Array(i),w=v(\\\"Classification\\\")),I.ReturnNumber&&(a=new ArrayBuffer(P),m=new Uint8Array(a),p=v(\\\"ReturnNumber\\\")),I.NumberOfReturns&&(u=new ArrayBuffer(P),d=new Uint8Array(u),x=v(\\\"NumberOfReturns\\\")),I.PointSourceId&&(o=new ArrayBuffer(2*P),y=new Uint16Array(o),M=v(\\\"PointSourceId\\\"));let X,j,E,L,V,z,F=[0,0,0],C={min:[Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE],max:[-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE]};for(let e=0;e<P;++e){let t=e*S;f&&(X=b[0](t)*B.x+O.x-_[0],j=b[1](t)*B.y+O.y-_[1],E=b[2](t)*B.z+O.z-_[2],F[0]+=X/P,F[1]+=j/P,F[2]+=E/P,C.min[0]=Math.min(C.min[0],X),C.min[1]=Math.min(C.min[1],j),C.min[2]=Math.min(C.min[2],E),C.max[0]=Math.max(C.max[0],X),C.max[1]=Math.max(C.max[1],j),C.max[2]=Math.max(C.max[2],E),f[3*e+0]=X,f[3*e+1]=j,f[3*e+2]=E),s&&(L=A[0](t),V=A[1](t),z=A[2](t),R&&(L/=256,V/=256,z/=256),s[4*e+0]=L,s[4*e+1]=V,s[4*e+2]=z),c&&(c[e]=g(t)),l&&(l[e]=w(t)),m&&(m[e]=p(t)),d&&(d[e]=x(t)),y&&(y[e]=M(t))}let G=new ArrayBuffer(4*P),T=new Uint32Array(G);for(let e=0;e<P;++e)T[e]=e;let Y={numPoints:P,tightBoundingBox:C,mean:F,position:t,color:r,intensity:n,classification:i,returnNumber:a,numberOfReturns:u,pointSourceId:o,indices:G},Z=[Y.position,Y.color,Y.intensity,Y.classification,Y.returnNumber,Y.numberOfReturns,Y.pointSourceId,Y.indices].filter(e=>e);postMessage(Y,Z)}}]);\\n//# sourceMappingURL=main.map\", null);\n};","\"use strict\";\n\nimport {Global} from \"../Global.js\";\n\nclass LRUItem\n{\n\tconstructor(node)\n\t{\n\t\tthis.previous = null;\n\t\tthis.next = null;\n\t\tthis.node = node;\n\t}\n}\n\n/**\n * @class A doubly-linked-list of the least recently used elements.\n */\nclass LRU\n{\n\tconstructor()\n\t{\n\t\t// the least recently used item\n\t\tthis.first = null;\n\t\t// the most recently used item\n\t\tthis.last = null;\n\t\t// a list of all items in the lru list\n\t\tthis.items = {};\n\t\tthis.elements = 0;\n\t\tthis.numPoints = 0;\n\t}\n\n\tsize()\n\t{\n\t\treturn this.elements;\n\t}\n\n\tcontains(node)\n\t{\n\t\treturn this.items[node.id] == null;\n\t}\n\n\ttouch(node)\n\t{\n\t\tif(!node.loaded)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar item;\n\n\t\tif(this.items[node.id] == null)\n\t\t{\n\t\t\t// add to list\n\t\t\titem = new LRUItem(node);\n\t\t\titem.previous = this.last;\n\t\t\tthis.last = item;\n\t\t\tif(item.previous !== null)\n\t\t\t{\n\t\t\t\titem.previous.next = item;\n\t\t\t}\n\n\t\t\tthis.items[node.id] = item;\n\t\t\tthis.elements++;\n\n\t\t\tif(this.first === null)\n\t\t\t{\n\t\t\t\tthis.first = item;\n\t\t\t}\n\t\t\tthis.numPoints += node.numPoints;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// update in list\n\t\t\titem = this.items[node.id];\n\n\t\t\tif(item.previous === null)\n\t\t\t{\n\t\t\t\t// handle touch on first element\n\t\t\t\tif(item.next !== null)\n\t\t\t\t{\n\t\t\t\t\tthis.first = item.next;\n\t\t\t\t\tthis.first.previous = null;\n\t\t\t\t\titem.previous = this.last;\n\t\t\t\t\titem.next = null;\n\t\t\t\t\tthis.last = item;\n\t\t\t\t\titem.previous.next = item;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(item.next !== null)\n\t\t\t{\n\t\t\t\t// handle touch on any other element\n\t\t\t\titem.previous.next = item.next;\n\t\t\t\titem.next.previous = item.previous;\n\t\t\t\titem.previous = this.last;\n\t\t\t\titem.next = null;\n\t\t\t\tthis.last = item;\n\t\t\t\titem.previous.next = item;\n\t\t\t}\n\t\t}\n\t}\n\n\tremove(node)\n\t{\n\t\tvar lruItem = this.items[node.id];\n\t\tif(lruItem)\n\t\t{\n\t\t\tif(this.elements === 1)\n\t\t\t{\n\t\t\t\tthis.first = null;\n\t\t\t\tthis.last = null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(!lruItem.previous)\n\t\t\t\t{\n\t\t\t\t\tthis.first = lruItem.next;\n\t\t\t\t\tthis.first.previous = null;\n\t\t\t\t}\n\t\t\t\tif(!lruItem.next)\n\t\t\t\t{\n\t\t\t\t\tthis.last = lruItem.previous;\n\t\t\t\t\tthis.last.next = null;\n\t\t\t\t}\n\t\t\t\tif(lruItem.previous && lruItem.next)\n\t\t\t\t{\n\t\t\t\t\tlruItem.previous.next = lruItem.next;\n\t\t\t\t\tlruItem.next.previous = lruItem.previous;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this.items[node.id];\n\t\t\tthis.elements--;\n\t\t\tthis.numPoints -= node.numPoints;\n\t\t}\n\t}\n\n\tgetLRUItem()\n\t{\n\t\tif(this.first === null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\tvar lru = this.first;\n\n\t\treturn lru.node;\n\t}\n\n\ttoString()\n\t{\n\t\tvar string = \"{ \";\n\t\tvar curr = this.first;\n\n\t\twhile (curr !== null)\n\t\t{\n\t\t\tstring += curr.node.id;\n\t\t\tif(curr.next !== null)\n\t\t\t{\n\t\t\t\tstring += \", \";\n\t\t\t}\n\t\t\tcurr = curr.next;\n\t\t}\n\n\t\tstring += \"}\";\n\t\tstring += \"(\" + this.size() + \")\";\n\t\treturn string;\n\t}\n\n\tfreeMemory()\n\t{\n\t\tif(this.elements <= 1)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\twhile(this.numPoints > Global.pointLoadLimit)\n\t\t{\n\t\t\tvar element = this.first;\n\t\t\tvar node = element.node;\n\t\t\tthis.disposeDescendants(node);\n\t\t}\n\t}\n\n\tdisposeDescendants(node)\n\t{\n\t\tvar stack = [];\n\t\tstack.push(node);\n\n\t\twhile (stack.length > 0)\n\t\t{\n\t\t\tvar current = stack.pop();\n\n\t\t\tcurrent.dispose();\n\t\t\tthis.remove(current);\n\n\t\t\tfor(var key in current.children)\n\t\t\t{\n\t\t\t\tif(current.children.hasOwnProperty(key))\n\t\t\t\t{\n\t\t\t\t\tvar child = current.children[key];\n\t\t\t\t\tif(child.loaded)\n\t\t\t\t\t{\n\t\t\t\t\t\tstack.push(current.children[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport {LRU, LRUItem};\n","\"use strict\";\n\n// Force workers to be included\nimport BinaryDecoderWorker from \"../workers/BinaryDecoderWorker\";\n//import LASLAZWorker from \"../workers/LASLAZWorker\";\nimport LASDecoderWorker from \"../workers/LASDecoderWorker\";\n//import GreyhoundBinaryDecoderWorker from \"../workers/GreyhoundBinaryDecoderWorker\";\nimport DEMWorker from \"../workers/DEMWorker\";\nimport EptLaszipDecoderWorker from \"../workers/EptLaszipDecoderWorker\";\nimport EptBinaryDecoderWorker from \"../workers/EptBinaryDecoderWorker\";\n\n/**\n * The worker manager is responsible for creating and managing worker instances.\n */\nclass WorkerManager {\n  constructor() {\n    this.workers = [];\n\n    for (var i = 0; i < 7; i++) {\n      this.workers.push([]);\n    }\n  }\n\n  /**\n   * Get a worker from the pool, if none available one will be created.\n   */\n  getWorker(type) {\n    if (this.workers[type].length > 0) {\n      return this.workers[type].pop();\n    }\n\n    switch (type) {\n      case 0:\n        return new BinaryDecoderWorker();\n      case 1:\n        throw \"LASLAZWorker not implemented\";\n      case 2:\n        return new LASDecoderWorker();\n      case 3:\n        throw \"GreyhoundBinaryDecoderWorker not implemented\";\n      case 4:\n        return new DEMWorker();\n      case 5:\n        return new EptLaszipDecoderWorker();\n      case 6:\n        return new EptBinaryDecoderWorker();\n      default:\n        throw \"Unknown worker requested\";\n    }\n  }\n\n  /**\n   * Return (reinsert) the worker into the pool.\n   */\n  returnWorker(type, worker) {\n    this.workers[type].push(worker);\n  }\n\n  /**\n   * Run a task immediatly.\n   */\n  runTask(type, onMessage, message, transfer) {\n    var self = this;\n\n    var worker = this.getWorker(type);\n    worker.onmessage = function (event) {\n      onMessage(event);\n      self.returnWorker(type, worker);\n    };\n\n    if (transfer !== undefined) {\n      worker.postMessage(message, transfer);\n    } else {\n      worker.postMessage(message);\n    }\n  }\n}\n\nWorkerManager.BINARY_DECODER = 0;\nWorkerManager.LAS_LAZ = 1;\nWorkerManager.LAS_DECODER = 2;\nWorkerManager.GREYHOUND = 3;\nWorkerManager.DEM = 4;\nWorkerManager.EPT_LAS_ZIP_DECODER = 5;\nWorkerManager.EPT_BINARY_DECODER = 6;\n\nexport { WorkerManager };\n","\"use strict\";\n\nimport {LRU} from \"./utils/LRU.js\";\nimport {WorkerManager} from \"./utils/WorkerManager.js\";\n\nfunction getCurrentScript() {\n\tif (document && document.currentScript) {\n\t\treturn document.currentScript;\n\t}\n\tconst scripts = document.getElementsByTagName('script');\n\tif (scripts && scripts.length) {\n\t\treturn scripts[scripts.length - 1].getAttribute('src');\n\t}\n\treturn null;\n}\n\nfunction getBasePath()\n{\n\tvar currentScript = getCurrentScript();\n\tif(currentScript && currentScript.src)\n\t{\n\t\tvar scriptPath = new URL(currentScript.src + \"/..\").href;\n\n\t\tif(scriptPath.slice(-1) === \"/\")\n\t\t{\n\t\t\tscriptPath = scriptPath.slice(0, -1);\n\t\t}\n\n\t\treturn scriptPath;\n\t}\n\telse\n\t{\n\t\tconsole.error(\"Potree: Was unable to find its script path using document.currentScript.\");\n\t}\n\n\treturn \"\";\n}\n\nvar Global = \n{\n\tdebug: {},\n\tworkerPath: getBasePath(),\n\tmaxNodesLoadGPUFrame: 20,\n\tmaxDEMLevel: 0,\n\tmaxNodesLoading: navigator.hardwareConcurrency !== undefined ? navigator.hardwareConcurrency : 4,\n\tpointLoadLimit: 1e10,\n\tnumNodesLoading: 0,\n\tmeasureTimings: false,\n\tworkerPool: new WorkerManager(),\n\tlru: new LRU(),\n\tpointcloudTransformVersion: undefined\n};\n\nexport {Global};","\"use strict\";\n\nvar PointAttributeNames =\n{\n\tPOSITION_CARTESIAN: 0, //float x, y, z,\n\tCOLOR_PACKED: 1, //byte r, g, b, a, I: [0,1]\n\tCOLOR_FLOATS_1: 2, //float r, g, b, I: [0,1]\n\tCOLOR_FLOATS_255: 3, //float r, g, b, I: [0,255]\n\tNORMAL_FLOATS: 4, //float x, y, z,\n\tFILLER: 5,\n\tINTENSITY: 6,\n\tCLASSIFICATION: 7,\n\tNORMAL_SPHEREMAPPED: 8,\n\tNORMAL_OCT16: 9,\n\tNORMAL: 10,\n\tRETURN_NUMBER: 11,\n\tNUMBER_OF_RETURNS: 12,\n\tSOURCE_ID: 13,\n\tINDICES: 14,\n\tSPACING: 15\n};\n\n/**\n * Some types of possible point attribute data formats\n *\n * @class\n */\nvar PointAttributeTypes =\n{\n\tDATA_TYPE_DOUBLE:\n\t{\n\t\tordinal: 0,\n\t\tsize: 8\n\t},\n\tDATA_TYPE_FLOAT:\n\t{\n\t\tordinal: 1,\n\t\tsize: 4\n\t},\n\tDATA_TYPE_INT8:\n\t{\n\t\tordinal: 2,\n\t\tsize: 1\n\t},\n\tDATA_TYPE_UINT8:\n\t{\n\t\tordinal: 3,\n\t\tsize: 1\n\t},\n\tDATA_TYPE_INT16:\n\t{\n\t\tordinal: 4,\n\t\tsize: 2\n\t},\n\tDATA_TYPE_UINT16:\n\t{\n\t\tordinal: 5,\n\t\tsize: 2\n\t},\n\tDATA_TYPE_INT32:\n\t{\n\t\tordinal: 6,\n\t\tsize: 4\n\t},\n\tDATA_TYPE_UINT32:\n\t{\n\t\tordinal: 7,\n\t\tsize: 4\n\t},\n\tDATA_TYPE_INT64:\n\t{\n\t\tordinal: 8,\n\t\tsize: 8\n\t},\n\tDATA_TYPE_UINT64:\n\t{\n\t\tordinal: 9,\n\t\tsize: 8\n\t}\n};\n\nvar i = 0;\nfor(var obj in PointAttributeTypes)\n{\n\tPointAttributeTypes[i] = PointAttributeTypes[obj];\n\ti++;\n}\n\n/**\n * A single point attribute such as color/normal/.. and its data format/number of elements/...\n */\nfunction PointAttribute(name, type, numElements)\n{\n\tthis.name = name;\n\tthis.type = type;\n\tthis.numElements = numElements;\n\tthis.byteSize = this.numElements * this.type.size;\n};\n\nPointAttribute.POSITION_CARTESIAN = new PointAttribute(PointAttributeNames.POSITION_CARTESIAN, PointAttributeTypes.DATA_TYPE_FLOAT, 3);\nPointAttribute.RGBA_PACKED = new PointAttribute(PointAttributeNames.COLOR_PACKED, PointAttributeTypes.DATA_TYPE_INT8, 4);\nPointAttribute.COLOR_PACKED = PointAttribute.RGBA_PACKED;\nPointAttribute.RGB_PACKED = new PointAttribute(PointAttributeNames.COLOR_PACKED, PointAttributeTypes.DATA_TYPE_INT8, 3);\nPointAttribute.NORMAL_FLOATS = new PointAttribute(PointAttributeNames.NORMAL_FLOATS, PointAttributeTypes.DATA_TYPE_FLOAT, 3);\nPointAttribute.FILLER_1B = new PointAttribute(PointAttributeNames.FILLER, PointAttributeTypes.DATA_TYPE_UINT8, 1);\nPointAttribute.INTENSITY = new PointAttribute(PointAttributeNames.INTENSITY, PointAttributeTypes.DATA_TYPE_UINT16, 1);\nPointAttribute.CLASSIFICATION = new PointAttribute(PointAttributeNames.CLASSIFICATION, PointAttributeTypes.DATA_TYPE_UINT8, 1);\nPointAttribute.NORMAL_SPHEREMAPPED = new PointAttribute(PointAttributeNames.NORMAL_SPHEREMAPPED, PointAttributeTypes.DATA_TYPE_UINT8, 2);\nPointAttribute.NORMAL_OCT16 = new PointAttribute(PointAttributeNames.NORMAL_OCT16, PointAttributeTypes.DATA_TYPE_UINT8, 2);\nPointAttribute.NORMAL = new PointAttribute(PointAttributeNames.NORMAL, PointAttributeTypes.DATA_TYPE_FLOAT, 3);\nPointAttribute.RETURN_NUMBER = new PointAttribute(PointAttributeNames.RETURN_NUMBER, PointAttributeTypes.DATA_TYPE_UINT8, 1);\nPointAttribute.NUMBER_OF_RETURNS = new PointAttribute(PointAttributeNames.NUMBER_OF_RETURNS, PointAttributeTypes.DATA_TYPE_UINT8, 1);\nPointAttribute.SOURCE_ID = new PointAttribute(PointAttributeNames.SOURCE_ID, PointAttributeTypes.DATA_TYPE_UINT8, 1);\nPointAttribute.INDICES = new PointAttribute(PointAttributeNames.INDICES, PointAttributeTypes.DATA_TYPE_UINT32, 1);\nPointAttribute.SPACING = new PointAttribute(PointAttributeNames.SPACING, PointAttributeTypes.DATA_TYPE_FLOAT, 1);\n\n/**\n * Ordered list of PointAttributes used to identify how points are aligned in a buffer.\n */\nfunction PointAttributes(pointAttributes)\n{\n\tthis.attributes = [];\n\tthis.byteSize = 0;\n\tthis.size = 0;\n\n\tif(pointAttributes != null)\n\t{\n\t\tfor(var i = 0; i < pointAttributes.length; i++)\n\t\t{\n\t\t\tvar pointAttributeName = pointAttributes[i];\n\t\t\tvar pointAttribute = PointAttribute[pointAttributeName];\n\t\t\tthis.attributes.push(pointAttribute);\n\t\t\tthis.byteSize += pointAttribute.byteSize;\n\t\t\tthis.size++;\n\t\t}\n\t}\n};\n\nPointAttributes.prototype.add = function(pointAttribute)\n{\n\tthis.attributes.push(pointAttribute);\n\tthis.byteSize += pointAttribute.byteSize;\n\tthis.size++;\n};\n\nPointAttributes.prototype.hasColors = function()\n{\n\tfor(var name in this.attributes)\n\t{\n\t\tvar pointAttribute = this.attributes[name];\n\t\tif(pointAttribute.name === PointAttributeNames.COLOR_PACKED)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nPointAttributes.prototype.hasNormals = function()\n{\n\tfor(var name in this.attributes)\n\t{\n\t\tvar pointAttribute = this.attributes[name];\n\t\tif(pointAttribute === PointAttribute.NORMAL_SPHEREMAPPED || pointAttribute === PointAttribute.NORMAL_FLOATS || pointAttribute === PointAttribute.NORMAL || pointAttribute === PointAttribute.NORMAL_OCT16)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nexport {PointAttribute, PointAttributes, PointAttributeNames, PointAttributeTypes};","\"use strict\";\n\nimport * as THREE from 'three';\n\n//\n//index is in order xyzxyzxyz\nclass DEMNode\n{\n\tconstructor(name, box, tileSize)\n\t{\n\t\tthis.name = name;\n\t\tthis.box = box;\n\t\tthis.tileSize = tileSize;\n\t\tthis.level = this.name.length - 1;\n\t\tthis.data = new Float32Array(tileSize * tileSize);\n\t\tthis.data.fill(-Infinity);\n\t\tthis.children = [];\n\n\t\tthis.mipMap = [this.data];\n\t\tthis.mipMapNeedsUpdate = true;\n\t}\n\n\tcreateMipMap()\n\t{\n\t\tthis.mipMap = [this.data];\n\n\t\tvar sourceSize = this.tileSize;\n\t\tvar mipSize = parseInt(sourceSize / 2);\n\t\tvar mipSource = this.data;\n\t\twhile(mipSize > 1)\n\t\t{\n\t\t\tvar mipData = new Float32Array(mipSize * mipSize);\n\n\t\t\tfor(var i = 0; i < mipSize; i++)\n\t\t\t{\n\t\t\t\tfor(var j = 0; j < mipSize; j++)\n\t\t\t\t{\n\t\t\t\t\tvar h00 = mipSource[2 * i + 0 + 2 * j * sourceSize];\n\t\t\t\t\tvar h01 = mipSource[2 * i + 0 + 2 * j * sourceSize + sourceSize];\n\t\t\t\t\tvar h10 = mipSource[2 * i + 1 + 2 * j * sourceSize];\n\t\t\t\t\tvar h11 = mipSource[2 * i + 1 + 2 * j * sourceSize + sourceSize];\n\n\t\t\t\t\tvar [height, weight] = [0, 0];\n\n\t\t\t\t\tif(isFinite(h00))\n\t\t\t\t\t{\n\t\t\t\t\t\theight += h00;\n\t\t\t\t\t\tweight += 1;\n\t\t\t\t\t};\n\t\t\t\t\tif(isFinite(h01))\n\t\t\t\t\t{\n\t\t\t\t\t\theight += h01;\n\t\t\t\t\t\tweight += 1;\n\t\t\t\t\t};\n\t\t\t\t\tif(isFinite(h10))\n\t\t\t\t\t{\n\t\t\t\t\t\theight += h10;\n\t\t\t\t\t\tweight += 1;\n\t\t\t\t\t};\n\t\t\t\t\tif(isFinite(h11))\n\t\t\t\t\t{\n\t\t\t\t\t\theight += h11;\n\t\t\t\t\t\tweight += 1;\n\t\t\t\t\t};\n\n\t\t\t\t\theight = height / weight;\n\n\t\t\t\t\t//var hs = [h00, h01, h10, h11].filter(h => isFinite(h));\n\t\t\t\t\t//var height = hs.reduce((a, v, i) => a + v, 0) / hs.length;\n\n\t\t\t\t\tmipData[i + j * mipSize] = height;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.mipMap.push(mipData);\n\n\t\t\tmipSource = mipData;\n\t\t\tsourceSize = mipSize;\n\t\t\tmipSize = parseInt(mipSize / 2);\n\t\t}\n\n\t\tthis.mipMapNeedsUpdate = false;\n\t}\n\n\tuv(position)\n\t{\n\t\tvar boxSize = this.box.getSize(new THREE.Vector3());\n\n\t\tvar u = (position.x - this.box.min.x) / boxSize.x;\n\t\tvar v = (position.y - this.box.min.y) / boxSize.y;\n\n\t\treturn [u, v];\n\t}\n\n\theightAtMipMapLevel(position, mipMapLevel)\n\t{\n\t\tvar uv = this.uv(position);\n\n\t\tvar tileSize = parseInt(this.tileSize / parseInt(2 ** mipMapLevel));\n\t\tvar data = this.mipMap[mipMapLevel];\n\n\t\tvar i = Math.min(uv[0] * tileSize, tileSize - 1);\n\t\tvar j = Math.min(uv[1] * tileSize, tileSize - 1);\n\n\t\tvar a = i % 1;\n\t\tvar b = j % 1;\n\n\t\tvar [i0, i1] = [Math.floor(i), Math.ceil(i)];\n\t\tvar [j0, j1] = [Math.floor(j), Math.ceil(j)];\n\n\t\tvar h00 = data[i0 + tileSize * j0];\n\t\tvar h01 = data[i0 + tileSize * j1];\n\t\tvar h10 = data[i1 + tileSize * j0];\n\t\tvar h11 = data[i1 + tileSize * j1];\n\n\t\tvar wh00 = isFinite(h00) ? (1 - a) * (1 - b) : 0;\n\t\tvar wh01 = isFinite(h01) ? (1 - a) * b : 0;\n\t\tvar wh10 = isFinite(h10) ? a * (1 - b) : 0;\n\t\tvar wh11 = isFinite(h11) ? a * b : 0;\n\n\t\tvar wsum = wh00 + wh01 + wh10 + wh11;\n\t\twh00 = wh00 / wsum;\n\t\twh01 = wh01 / wsum;\n\t\twh10 = wh10 / wsum;\n\t\twh11 = wh11 / wsum;\n\n\t\tif(wsum === 0)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tvar h = 0;\n\n\t\tif(isFinite(h00)) h += h00 * wh00;\n\t\tif(isFinite(h01)) h += h01 * wh01;\n\t\tif(isFinite(h10)) h += h10 * wh10;\n\t\tif(isFinite(h11)) h += h11 * wh11;\n\n\t\treturn h;\n\t}\n\n\theight(position)\n\t{\n\t\tvar h = null;\n\n\t\tfor(var i = 0; i < this.mipMap.length; i++)\n\t\t{\n\t\t\th = this.heightAtMipMapLevel(position, i);\n\n\t\t\tif(h !== null)\n\t\t\t{\n\t\t\t\treturn h;\n\t\t\t}\n\t\t}\n\n\t\treturn h;\n\t}\n\n\ttraverse(handler, level = 0)\n\t{\n\t\thandler(this, level);\n\n\t\tfor(var child of this.children.filter(c => c !== undefined))\n\t\t{\n\t\t\tchild.traverse(handler, level + 1);\n\t\t}\n\t}\n};\n\nexport {DEMNode}","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {WorkerManager} from \"../utils/WorkerManager.js\";\nimport {Global} from \"../Global.js\";\nimport {DEMNode} from \"./DEMNode.js\";\n\nclass DEM\n{\n\tconstructor(pointcloud)\n\t{\n\t\tthis.pointcloud = pointcloud;\n\t\tthis.matrix = null;\n\t\tthis.boundingBox = null;\n\t\tthis.tileSize = 64;\n\t\tthis.root = null;\n\t\tthis.version = 0;\n\t}\n\n\t//expands the tree to all nodes that intersect <box> at <level> returns the intersecting nodes at <level>\n\texpandAndFindByBox(box, level)\n\t{\n\t\tif(level === 0)\n\t\t{\n\t\t\treturn [this.root];\n\t\t}\n\n\t\tvar result = [];\n\t\tvar stack = [this.root];\n\n\t\twhile(stack.length > 0)\n\t\t{\n\t\t\tvar node = stack.pop();\n\t\t\tvar nodeBoxSize = node.box.getSize(new THREE.Vector3());\n\n\t\t\t//check which children intersect by transforming min/max to quadrants\n\t\t\tvar min = {\n\t\t\t\tx: (box.min.x - node.box.min.x) / nodeBoxSize.x,\n\t\t\t\ty: (box.min.y - node.box.min.y) / nodeBoxSize.y\n\t\t\t};\n\t\t\tvar max = {\n\t\t\t\tx: (box.max.x - node.box.max.x) / nodeBoxSize.x,\n\t\t\t\ty: (box.max.y - node.box.max.y) / nodeBoxSize.y\n\t\t\t};\n\n\t\t\tmin.x = min.x < 0.5 ? 0 : 1;\n\t\t\tmin.y = min.y < 0.5 ? 0 : 1;\n\t\t\tmax.x = max.x < 0.5 ? 0 : 1;\n\t\t\tmax.y = max.y < 0.5 ? 0 : 1;\n\n\t\t\tvar childIndices;\n\t\t\tif(min.x === 0 && min.y === 0 && max.x === 1 && max.y === 1)\n\t\t\t{\n\t\t\t\tchildIndices = [0, 1, 2, 3];\n\t\t\t}\n\t\t\telse if(min.x === max.x && min.y === max.y)\n\t\t\t{\n\t\t\t\tchildIndices = [(min.x << 1) | min.y];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tchildIndices = [(min.x << 1) | min.y, (max.x << 1) | max.y];\n\t\t\t}\n\n\t\t\tfor(var index of childIndices)\n\t\t\t{\n\t\t\t\tif(node.children[index] === undefined)\n\t\t\t\t{\n\t\t\t\t\tvar childBox = node.box.clone();\n\n\t\t\t\t\tif((index & 2) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tchildBox.min.x += nodeBoxSize.x / 2.0;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tchildBox.max.x -= nodeBoxSize.x / 2.0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif((index & 1) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tchildBox.min.y += nodeBoxSize.y / 2.0;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tchildBox.max.y -= nodeBoxSize.y / 2.0;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar child = new DEMNode(node.name + index, childBox, this.tileSize);\n\t\t\t\t\tnode.children[index] = child;\n\t\t\t\t}\n\n\t\t\t\tvar child = node.children[index];\n\n\t\t\t\tif(child.level < level)\n\t\t\t\t{\n\t\t\t\t\tstack.push(child);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tresult.push(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tchildIndex(uv)\n\t{\n\t\tvar [x, y] = uv.map(n => n < 0.5 ? 0 : 1);\n\n\t\tvar index = (x << 1) | y;\n\n\t\treturn index;\n\t}\n\n\theight(position)\n\t{\n\t\tif(!this.root)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar height = null;\n\t\tvar list = [this.root];\n\t\twhile(true)\n\t\t{\n\t\t\tvar node = list[list.length - 1];\n\n\t\t\tvar currentHeight = node.height(position);\n\n\t\t\tif(currentHeight !== null)\n\t\t\t{\n\t\t\t\theight = currentHeight;\n\t\t\t}\n\n\t\t\tvar uv = node.uv(position);\n\t\t\tvar childIndex = this.childIndex(uv);\n\n\t\t\tif(node.children[childIndex])\n\t\t\t{\n\t\t\t\tlist.push(node.children[childIndex]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn height + this.pointcloud.position.z;\n\t}\n\n\tupdate(visibleNodes)\n\t{\n\t\t//check if point cloud transformation changed\n\t\tif(this.matrix === null || !this.matrix.equals(this.pointcloud.matrixWorld))\n\t\t{\n\t\t\tthis.matrix = this.pointcloud.matrixWorld.clone();\n\t\t\tthis.boundingBox = this.pointcloud.boundingBox.clone().applyMatrix4(this.matrix);\n\t\t\tthis.root = new DEMNode(\"r\", this.boundingBox, this.tileSize);\n\t\t\tthis.version++;\n\t\t}\n\n\t\t//find node to update\n\t\tvar node = null;\n\t\tfor(var vn of visibleNodes)\n\t\t{\n\t\t\tif(vn.demVersion === undefined || vn.demVersion < this.version)\n\t\t\t{\n\t\t\t\tnode = vn;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(node === null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t//update node\n\t\tvar projectedBox = node.getBoundingBox().clone().applyMatrix4(this.matrix);\n\t\tvar projectedBoxSize = projectedBox.getSize(new THREE.Vector3());\n\n\t\tvar targetNodes = this.expandAndFindByBox(projectedBox, node.getLevel());\n\t\tnode.demVersion = this.version;\n\n\t\tvar position = node.geometryNode.geometry.attributes.position.array;\n\t\tvar message =\n\t\t{\n\t\t\tboundingBox:\n\t\t\t{\n\t\t\t\tmin: node.getBoundingBox().min.toArray(),\n\t\t\t\tmax: node.getBoundingBox().max.toArray()\n\t\t\t},\n\t\t\tposition: new Float32Array(position).buffer\n\t\t};\n\t\tvar transferables = [message.position];\n\n\t\tvar self = this;\n\n\t\tGlobal.workerPool.runTask(WorkerManager.DEM, function(e)\n\t\t{\n\t\t\tvar data = new Float32Array(e.data.dem.data);\n\n\t\t\tfor(var demNode of targetNodes)\n\t\t\t{\n\t\t\t\tvar boxSize = demNode.box.getSize(new THREE.Vector3());\n\n\t\t\t\tfor(var i = 0; i < self.tileSize; i++)\n\t\t\t\t{\n\t\t\t\t\tfor(var j = 0; j < self.tileSize; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar u = (i / (self.tileSize - 1));\n\t\t\t\t\t\tvar v = (j / (self.tileSize - 1));\n\n\t\t\t\t\t\tvar x = demNode.box.min.x + u * boxSize.x;\n\t\t\t\t\t\tvar y = demNode.box.min.y + v * boxSize.y;\n\n\t\t\t\t\t\tvar ix = self.tileSize * (x - projectedBox.min.x) / projectedBoxSize.x;\n\t\t\t\t\t\tvar iy = self.tileSize * (y - projectedBox.min.y) / projectedBoxSize.y;\n\n\t\t\t\t\t\tif(ix < 0 || ix > self.tileSize)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(iy < 0 || iy > self.tileSize)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tix = Math.min(Math.floor(ix), self.tileSize - 1);\n\t\t\t\t\t\tiy = Math.min(Math.floor(iy), self.tileSize - 1);\n\n\t\t\t\t\t\tdemNode.data[i + self.tileSize * j] = data[ix + self.tileSize * iy];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdemNode.createMipMap();\n\t\t\t\tdemNode.mipMapNeedsUpdate = true;\n\t\t\t}\n\t\t}, message, transferables);\n\t}\n};\n\nexport {DEM};","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {DEM} from \"./DEM.js\";\n\nclass PointCloudTreeNode\n{\n\tconstructor()\n\t{\n\t\tthis.needsTransformUpdate = true;\n\t}\n\n\tgetChildren(){}\n\n\tgetBoundingBox(){}\n\n\tisLoaded(){}\n\n\tisGeometryNode(){}\n\n\tisTreeNode(){}\n\n\tgetLevel(){}\n\n\tgetBoundingSphere(){}\n};\n\nclass PointCloudTree extends THREE.Object3D\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis.dem = new DEM(this);\n\t}\n\n\tinitialized()\n\t{\n\t\treturn this.root !== null;\n\t}\n};\n\nexport {PointCloudTree, PointCloudTreeNode};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {GreyhoundLoader} from \"../../loaders/GreyhoundLoader.js\";\nimport {Global} from \"../../Global.js\";\nimport {PointCloudTree, PointCloudTreeNode} from \"../PointCloudTree.js\";\n\nclass PointCloudGreyhoundGeometry\n{\n\tconstructor()\n\t{\n\t\tthis.spacing = 0;\n\t\tthis.boundingBox = null;\n\t\tthis.root = null;\n\t\tthis.nodes = null;\n\t\tthis.pointAttributes = {};\n\t\tthis.hierarchyStepSize = -1;\n\t\tthis.loader = null;\n\t\tthis.schema = null;\n\n\t\tthis.baseDepth = null;\n\t\tthis.offset = null;\n\t\tthis.projection = null;\n\n\t\tthis.boundingSphere = null;\n\n\t\t// the serverURL will contain the base URL of the greyhound server. f.e. http://dev.greyhound.io/resource/autzen/\n\t\tthis.serverURL = null;\n\t\tthis.normalize = {color: false, intensity: false};\n\t}\n}\n\nfunction PointCloudGreyhoundGeometryNode(name, pcoGeometry, boundingBox, scale, offset)\n{\n\tthis.id = PointCloudGreyhoundGeometryNode.IDCount++;\n\tthis.name = name;\n\tthis.index = parseInt(name.charAt(name.length - 1));\n\tthis.pcoGeometry = pcoGeometry;\n\tthis.geometry = null;\n\tthis.boundingBox = boundingBox;\n\tthis.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\tthis.scale = scale;\n\tthis.offset = offset;\n\tthis.children = {};\n\tthis.numPoints = 0;\n\tthis.level = null;\n\tthis.loaded = false;\n\tthis.oneTimeDisposeHandlers = [];\n\tthis.baseLoaded = false;\n\n\tvar center = new THREE.Vector3();\n\n\tvar bounds = this.boundingBox.clone();\n\tbounds.min.sub(this.pcoGeometry.boundingBox.getCenter(center));\n\tbounds.max.sub(this.pcoGeometry.boundingBox.getCenter(center));\n\n\tif(this.scale)\n\t{\n\t\tbounds.min.multiplyScalar(1 / this.scale);\n\t\tbounds.max.multiplyScalar(1 / this.scale);\n\t}\n\n\t//This represents the bounds for this node in the reference frame of the\n\t//global bounds from `info`, centered around the origin, and then scaled\n\t//by our selected scale.\n\tthis.greyhoundBounds = bounds;\n\n\t//This represents the offset between the coordinate system described above\n\t//and our pcoGeometry bounds.\n\tthis.greyhoundOffset = this.pcoGeometry.offset.clone().add(this.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).multiplyScalar(0.5));\n};\n\nPointCloudGreyhoundGeometryNode.IDCount = 0;\n\nPointCloudGreyhoundGeometryNode.prototype = Object.create(PointCloudTreeNode.prototype);\n\nPointCloudGreyhoundGeometryNode.prototype.isGeometryNode = function()\n{\n\treturn true;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.isTreeNode = function()\n{\n\treturn false;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.isLoaded = function()\n{\n\treturn this.loaded;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.getBoundingSphere = function()\n{\n\treturn this.boundingSphere;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.getBoundingBox = function()\n{\n\treturn this.boundingBox;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.getLevel = function()\n{\n\treturn this.level;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.getChildren = function()\n{\n\tvar children = [];\n\n\tfor(var i = 0; i < 8; ++i)\n\t{\n\t\tif(this.children[i])\n\t\t{\n\t\t\tchildren.push(this.children[i]);\n\t\t}\n\t}\n\n\treturn children;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.getURL = function()\n{\n\tvar schema = this.pcoGeometry.schema;\n\tvar bounds = this.greyhoundBounds;\n\n\tvar boundsString = bounds.min.x + \",\" + bounds.min.y + \",\" + bounds.min.z + \",\" + bounds.max.x + \",\" + bounds.max.y + \",\" + bounds.max.z;\n\n\tvar url = \"\" + this.pcoGeometry.serverURL +\n\t\t\"read?depthBegin=\" +\n\t\t(this.baseLoaded ? (this.level + this.pcoGeometry.baseDepth) : 0) +\n\t\t\"&depthEnd=\" + (this.level + this.pcoGeometry.baseDepth + 1) +\n\t\t\"&bounds=[\" + boundsString + \"]\" +\n\t\t\"&schema=\" + JSON.stringify(schema) +\n\t\t\"&compress=true\";\n\n\tif(this.scale)\n\t{\n\t\turl += \"&scale=\" + this.scale;\n\t}\n\n\tif(this.greyhoundOffset)\n\t{\n\t\tvar offset = this.greyhoundOffset;\n\t\turl += \"&offset=[\" + offset.x + \",\" + offset.y + \",\" + offset.z + \"]\";\n\t}\n\n\tif(!this.baseLoaded) this.baseLoaded = true;\n\n\treturn url;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.addChild = function(child)\n{\n\tthis.children[child.index] = child;\n\tchild.parent = this;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.load = function()\n{\n\tif(this.loading === true || this.loaded === true || Global.numNodesLoading >= Global.maxNodesLoading)\n\t{\n\t\treturn;\n\t}\n\n\tthis.loading = true;\n\tGlobal.numNodesLoading++;\n\n\tif(this.level % this.pcoGeometry.hierarchyStepSize === 0 && this.hasChildren)\n\t{\n\t\tthis.loadHierarchyThenPoints();\n\t}\n\telse\n\t{\n\t\tthis.loadPoints();\n\t}\n};\n\nPointCloudGreyhoundGeometryNode.prototype.loadPoints = function()\n{\n\tthis.pcoGeometry.loader.load(this);\n};\n\nPointCloudGreyhoundGeometryNode.prototype.loadHierarchyThenPoints = function()\n{\n\t//From Greyhound (Cartesian) ordering for the octree to Potree-default\n\tvar transform = [0, 2, 1, 3, 4, 6, 5, 7];\n\n\tvar makeBitMask = function(node)\n\t{\n\t\tvar mask = 0;\n\t\tObject.keys(node).forEach(function(key)\n\t\t{\n\t\t\tif(key === \"swd\") mask += 1 << transform[0];\n\t\t\telse if(key === \"nwd\") mask += 1 << transform[1];\n\t\t\telse if(key === \"swu\") mask += 1 << transform[2];\n\t\t\telse if(key === \"nwu\") mask += 1 << transform[3];\n\t\t\telse if(key === \"sed\") mask += 1 << transform[4];\n\t\t\telse if(key === \"ned\") mask += 1 << transform[5];\n\t\t\telse if(key === \"seu\") mask += 1 << transform[6];\n\t\t\telse if(key === \"neu\") mask += 1 << transform[7];\n\t\t});\n\t\treturn mask;\n\t};\n\n\tvar parseChildrenCounts = function(base, parentName, stack)\n\t{\n\t\tvar keys = Object.keys(base);\n\t\tvar child;\n\t\tvar childName;\n\n\t\tkeys.forEach(function(key)\n\t\t{\n\t\t\tif(key === \"n\") return;\n\t\t\tswitch(key)\n\t\t\t{\n\t\t\t\tcase \"swd\":\n\t\t\t\t\tchild = base.swd;\n\t\t\t\t\tchildName = parentName + transform[0];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"nwd\":\n\t\t\t\t\tchild = base.nwd;\n\t\t\t\t\tchildName = parentName + transform[1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"swu\":\n\t\t\t\t\tchild = base.swu;\n\t\t\t\t\tchildName = parentName + transform[2];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"nwu\":\n\t\t\t\t\tchild = base.nwu;\n\t\t\t\t\tchildName = parentName + transform[3];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sed\":\n\t\t\t\t\tchild = base.sed;\n\t\t\t\t\tchildName = parentName + transform[4];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ned\":\n\t\t\t\t\tchild = base.ned;\n\t\t\t\t\tchildName = parentName + transform[5];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"seu\":\n\t\t\t\t\tchild = base.seu;\n\t\t\t\t\tchildName = parentName + transform[6];\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"neu\":\n\t\t\t\t\tchild = base.neu;\n\t\t\t\t\tchildName = parentName + transform[7];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstack.push(\n\t\t\t{\n\t\t\t\tchildren: makeBitMask(child),\n\t\t\t\tnumPoints: child.n,\n\t\t\t\tname: childName\n\t\t\t});\n\n\t\t\tparseChildrenCounts(child, childName, stack);\n\t\t});\n\t};\n\n\t//Load hierarchy.\n\tvar callback = function(node, greyhoundHierarchy)\n\t{\n\t\tvar decoded = [];\n\t\tnode.numPoints = greyhoundHierarchy.n;\n\t\tparseChildrenCounts(greyhoundHierarchy, node.name, decoded);\n\n\t\tvar nodes = {};\n\t\tnodes[node.name] = node;\n\t\tvar pgg = node.pcoGeometry;\n\n\t\tfor(var i = 0; i < decoded.length; i++)\n\t\t{\n\t\t\tvar name = decoded[i].name;\n\t\t\tvar numPoints = decoded[i].numPoints;\n\t\t\tvar index = parseInt(name.charAt(name.length - 1));\n\t\t\tvar parentName = name.substring(0, name.length - 1);\n\t\t\tvar parentNode = nodes[parentName];\n\t\t\tvar level = name.length - 1;\n\t\t\tvar boundingBox = GreyhoundLoader.createChildAABB(parentNode.boundingBox, index);\n\n\t\t\tvar currentNode = new PointCloudGreyhoundGeometryNode(name, pgg, boundingBox, node.scale, node.offset);\n\t\t\tcurrentNode.level = level;\n\t\t\tcurrentNode.numPoints = numPoints;\n\t\t\tcurrentNode.hasChildren = decoded[i].children > 0;\n\t\t\tcurrentNode.spacing = pgg.spacing / Math.pow(2, level);\n\n\t\t\tparentNode.addChild(currentNode);\n\t\t\tnodes[name] = currentNode;\n\t\t}\n\n\t\tnode.loadPoints();\n\t};\n\n\tif(this.level % this.pcoGeometry.hierarchyStepSize === 0)\n\t{\n\t\tvar depthBegin = this.level + this.pcoGeometry.baseDepth;\n\t\tvar depthEnd = depthBegin + this.pcoGeometry.hierarchyStepSize + 2;\n\n\t\tvar bounds = this.greyhoundBounds;\n\n\t\tvar boundsString = bounds.min.x + \",\" + bounds.min.y + \",\" + bounds.min.z + \",\" + bounds.max.x + \",\" + bounds.max.y + \",\" + bounds.max.z;\n\n\t\tvar hurl = \"\" + this.pcoGeometry.serverURL +\n\t\t\t\"hierarchy?bounds=[\" + boundsString + \"]\" +\n\t\t\t\"&depthBegin=\" + depthBegin +\n\t\t\t\"&depthEnd=\" + depthEnd;\n\n\t\tif(this.scale)\n\t\t{\n\t\t\thurl += \"&scale=\" + this.scale;\n\t\t}\n\n\t\tif(this.greyhoundOffset)\n\t\t{\n\t\t\tvar offset = this.greyhoundOffset;\n\t\t\thurl += \"&offset=[\" + offset.x + \",\" + offset.y + \",\" + offset.z + \"]\";\n\t\t}\n\n\t\tvar self = this;\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", hurl, true);\n\t\txhr.onload = function(event)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tcallback(self, JSON.parse(xhr.responseText) || {});\n\t\t\t}\n\t\t\tcatch(e)\n\t\t\t{\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t\tconsole.error(\"Potree: Exception thrown parsing points.\", e);\n\t\t\t}\n\t\t};\n\t\txhr.onerror = function(event)\n\t\t{\n\t\t\tconsole.log(\"Potree: Failed to load file! HTTP status \" + xhr.status + \", file:\" + hurl, event);\n\t\t}\n\t\txhr.send(null);\n\t}\n};\n\nPointCloudGreyhoundGeometryNode.prototype.getNumPoints = function()\n{\n\treturn this.numPoints;\n};\n\nPointCloudGreyhoundGeometryNode.prototype.dispose = function()\n{\n\tif(this.geometry && this.parent != null)\n\t{\n\t\tthis.geometry.dispose();\n\t\tthis.geometry = null;\n\t\tthis.loaded = false;\n\n\t\tfor(var i = 0; i < this.oneTimeDisposeHandlers.length; i++)\n\t\t{\n\t\t\tvar handler = this.oneTimeDisposeHandlers[i];\n\t\t\thandler();\n\t\t}\n\t\t\n\t\tthis.oneTimeDisposeHandlers = [];\n\t}\n};\n\nObject.assign(PointCloudGreyhoundGeometryNode.prototype, THREE.EventDispatcher.prototype);\n\nexport {PointCloudGreyhoundGeometry, PointCloudGreyhoundGeometryNode};","\"use strict\";\n\nfunction VersionUtils(version)\n{\n\tthis.version = version;\n\tvar vmLength = (version.indexOf(\".\") === -1) ? version.length : version.indexOf(\".\");\n\tthis.versionMajor = parseInt(version.substr(0, vmLength));\n\tthis.versionMinor = parseInt(version.substr(vmLength + 1));\n\t\n\tif(this.versionMinor.length === 0)\n\t{\n\t\tthis.versionMinor = 0;\n\t}\n};\n\nVersionUtils.prototype.newerThan = function(version)\n{\n\tvar v = new VersionUtils(version);\n\n\tif((this.versionMajor > v.versionMajor) || (this.versionMajor === v.versionMajor && this.versionMinor > v.versionMinor))\n\t{\n\t\treturn true;\n\t}\n\t\n\treturn false;\n};\n\nVersionUtils.prototype.equalOrHigher = function(version)\n{\n\tvar v = new VersionUtils(version);\n\n\tif((this.versionMajor > v.versionMajor) || (this.versionMajor === v.versionMajor && this.versionMinor >= v.versionMinor))\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nVersionUtils.prototype.upTo = function(version)\n{\n\treturn !this.newerThan(version);\n};\n\nexport {VersionUtils};\n","'use strict';\n\n/**\n * Migrated from Potree (https://github.com/potree/potree/blob/develop/src/XHRFactory.js)\n * by Lars Moastuen <@larsmoa>.\n */\n\nconst XHRFactory = {\n\tconfig: {\n\t\twithCredentials: false,\n\t\tcustomHeaders: [\n\t\t\t{ header: null, value: null }\n\t\t]\n\t},\n\n\tcreateXMLHttpRequest: function () {\n\t\tlet xhr = new XMLHttpRequest();\n\n\t\tif (this.config.customHeaders &&\n\t\t\tArray.isArray(this.config.customHeaders) &&\n\t\t\tthis.config.customHeaders.length > 0) {\n\t\t\tlet baseOpen = xhr.open;\n\t\t\tlet customHeaders = this.config.customHeaders;\n\t\t\txhr.open = function () {\n\t\t\t\tbaseOpen.apply(this, [].slice.call(arguments));\n\t\t\t\tcustomHeaders.forEach(function (customHeader) {\n\t\t\t\t\tif (!!customHeader.header && !!customHeader.value) {\n\t\t\t\t\t\txhr.setRequestHeader(customHeader.header, customHeader.value);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\treturn xhr;\n\t},\n\n\tfetch: async function(resource) {\n\t\tconst headers = new Headers();\n\t\tif (this.config.customHeaders) {\n\t\t\tthis.config.customHeaders.forEach(function (customHeader) {\n\t\t\t\tif (!!customHeader.header && !!customHeader.value) {\n\t\t\t\t\theaders.append(customHeader.header, customHeader.value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tconst options = {\n\t\t\theaders,\n\t\t\tcredentials: XHRFactory.config.withCredentials ? 'include' : 'same-origin'\n\t\t};\n\t\treturn fetch(resource, options);\n\t}\n};\n\nexport {XHRFactory};","\"use strict\";\n\nimport {PointAttributeNames} from \"../PointAttributes.js\";\nimport {VersionUtils} from \"../utils/VersionUtils.js\";\nimport {WorkerManager} from \"../utils/WorkerManager.js\";\nimport {Global} from \"../Global.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\n\nclass GreyhoundBinaryLoader\n{\n\tconstructor(version, boundingBox, scale)\n\t{\n\t\tif(typeof(version) === \"string\")\n\t\t{\n\t\t\tthis.version = new VersionUtils(version);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.version = version;\n\t\t}\n\n\t\tthis.boundingBox = boundingBox;\n\t\tthis.scale = scale;\n\t}\n\n\tload(node)\n\t{\n\t\tif(node.loaded) return;\n\n\t\tvar self = this;\n\t\tvar url = node.getURL();\n\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n\t\txhr.onload = function()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tself.parse(node, xhr.response);\n\t\t\t}\n\t\t\tcatch(e)\n\t\t\t{\n\t\t\t\tconsole.error(\"Potree: Exception thrown parsing points.\", e);\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t}\n\t\t};\n\t\txhr.onerror = function(event)\n\t\t{\n\t\t\tGlobal.numNodesLoading--;\n\t\t\tconsole.error(\"Potree: Failed to load file.\", xhr, url);\n\t\t};\n\t\txhr.send(null);\n\t}\n\n\tparse(node, buffer)\n\t{\n\t\tvar NUM_POINTS_BYTES = 4;\n\t\tvar view = new DataView(buffer, buffer.byteLength - NUM_POINTS_BYTES, NUM_POINTS_BYTES);\n\t\tvar numPoints = view.getUint32(0, true);\n\t\tvar pointAttributes = node.pcoGeometry.pointAttributes;\n\n\t\tnode.numPoints = numPoints;\n\n\t\tvar bb = node.boundingBox;\n\t\tvar center = new THREE.Vector3();\n\t\tvar nodeOffset = node.pcoGeometry.boundingBox.getCenter(center).sub(node.boundingBox.min);\n\n\t\tvar message =\n\t\t{\n\t\t\tbuffer: buffer,\n\t\t\tpointAttributes: pointAttributes,\n\t\t\tversion: this.version.version,\n\t\t\tschema: node.pcoGeometry.schema,\n\t\t\tmin: [bb.min.x, bb.min.y, bb.min.z],\n\t\t\tmax: [bb.max.x, bb.max.y, bb.max.z],\n\t\t\toffset: nodeOffset.toArray(),\n\t\t\tscale: this.scale,\n\t\t\tnormalize: node.pcoGeometry.normalize\n\t\t};\n\n\t\tGlobal.workerPool.runTask(WorkerManager.GREYHOUND, function(e)\n\t\t{\n\t\t\tvar data = e.data;\n\t\t\tvar buffers = data.attributeBuffers;\n\t\t\t\n\t\t\tvar tightBoundingBox = new THREE.Box3\n\t\t\t(\n\t\t\t\tnew THREE.Vector3().fromArray(data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tvar geometry = new THREE.BufferGeometry();\n\n\t\t\tfor(var property in buffers)\n\t\t\t{\n\t\t\t\tvar buffer = buffers[property].buffer;\n\n\t\t\t\tif(parseInt(property) === PointAttributeNames.POSITION_CARTESIAN)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"position\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.COLOR_PACKED)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"color\", new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.INTENSITY)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"intensity\", new THREE.BufferAttribute(new Float32Array(buffer), 1));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.CLASSIFICATION)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"classification\", new THREE.BufferAttribute(new Uint8Array(buffer), 1));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.NORMAL_SPHEREMAPPED)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.NORMAL_OCT16)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.NORMAL)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.INDICES)\n\t\t\t\t{\n\t\t\t\t\tvar bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4);\n\t\t\t\t\tbufferAttribute.normalized = true;\n\t\t\t\t\tgeometry.setAttribute(\"indices\", bufferAttribute);\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.SPACING)\n\t\t\t\t{\n\t\t\t\t\tvar bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\t\t\t\t\tgeometry.setAttribute(\"spacing\", bufferAttribute);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttightBoundingBox.max.sub(tightBoundingBox.min);\n\t\t\ttightBoundingBox.min.set(0, 0, 0);\n\n\t\t\tnode.numPoints = data.numPoints;\n\t\t\tnode.geometry = geometry;\n\t\t\tnode.mean = new THREE.Vector3(...data.mean);\n\t\t\tnode.tightBoundingBox = tightBoundingBox;\n\t\t\tnode.loaded = true;\n\t\t\tnode.loading = false;\n\t\t\tGlobal.numNodesLoading--;\n\t\t}, message, [message.buffer]);\n\t}\n}\n\nexport {GreyhoundBinaryLoader};","\"use strict\";\n\nimport {XHRFactory} from \"../XHRFactory.js\";\n\n/**\n * @class Loads greyhound metadata and returns a PointcloudOctree\n *\n * @author Maarten van Meersbergen\n * @author Oscar Martinez Rubi\n * @author Connor Manning\n */\nclass GreyhoundUtils\n{\n\tstatic getQueryParam(name)\n\t{\n\t\tname = name.replace(/[[\\]]/g, \"\\\\$&\");\n\t\tvar regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\");\n\t\tvar results = regex.exec(window.location.href);\n\t\tif(!results) return null;\n\t\tif(!results[2]) return \"\";\n\t\treturn decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n\t}\n\n\tstatic createSchema(attributes)\n\t{\n\t\tvar schema = [\n\t\t\t{\n\t\t\t\t\"name\": \"X\",\n\t\t\t\t\"size\": 4,\n\t\t\t\t\"type\": \"signed\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Y\",\n\t\t\t\t\"size\": 4,\n\t\t\t\t\"type\": \"signed\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Z\",\n\t\t\t\t\"size\": 4,\n\t\t\t\t\"type\": \"signed\"\n\t\t\t}\n\t\t];\n\n\t\t//Once we include options in the UI to load a dynamic list of available\n\t\t//attributes for visualization (f.e. Classification, Intensity etc.)\n\t\t//we will be able to ask for that specific attribute from the server,\n\t\t//where we are now requesting all attributes for all points all the time.\n\t\t//If we do that though, we also need to tell Potree to redraw the points\n\t\t//that are already loaded (with different attributes).\n\t\t//This is not default behaviour.\n\t\tattributes.forEach(function(item)\n\t\t{\n\t\t\tif(item === \"COLOR_PACKED\")\n\t\t\t{\n\t\t\t\tschema.push(\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Red\",\n\t\t\t\t\t\"size\": 2,\n\t\t\t\t\t\"type\": \"unsigned\"\n\t\t\t\t});\n\t\t\t\tschema.push(\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Green\",\n\t\t\t\t\t\"size\": 2,\n\t\t\t\t\t\"type\": \"unsigned\"\n\t\t\t\t});\n\t\t\t\tschema.push(\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Blue\",\n\t\t\t\t\t\"size\": 2,\n\t\t\t\t\t\"type\": \"unsigned\"\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if(item === \"INTENSITY\")\n\t\t\t{\n\t\t\t\tschema.push(\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Intensity\",\n\t\t\t\t\t\"size\": 2,\n\t\t\t\t\t\"type\": \"unsigned\"\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if(item === \"CLASSIFICATION\")\n\t\t\t{\n\t\t\t\tschema.push(\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Classification\",\n\t\t\t\t\t\"size\": 1,\n\t\t\t\t\t\"type\": \"unsigned\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn schema;\n\t}\n\n\tstatic fetch(url, cb)\n\t{\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.onreadystatechange = function()\n\t\t{\n\t\t\tif(xhr.readyState === 4)\n\t\t\t{\n\t\t\t\tif(xhr.status === 200 || xhr.status === 0)\n\t\t\t\t{\n\t\t\t\t\tcb(null, xhr.responseText);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcb(xhr.responseText);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.send(null);\n\t};\n\n\tstatic fetchBinary(url, cb)\n\t{\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.onreadystatechange = function()\n\t\t{\n\t\t\tif(xhr.readyState === 4)\n\t\t\t{\n\t\t\t\tif(xhr.status === 200 || xhr.status === 0)\n\t\t\t\t{\n\t\t\t\t\tcb(null, xhr.response);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcb(xhr.responseText);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.send(null);\n\t};\n\n\tstatic pointSizeFrom(schema)\n\t{\n\t\treturn schema.reduce((p, c) => p + c.size, 0);\n\t};\n\n\tstatic getNormalization(serverURL, baseDepth, cb)\n\t{\n\t\tvar s = [\n\t\t\t{\n\t\t\t\t\"name\": \"X\",\n\t\t\t\t\"size\": 4,\n\t\t\t\t\"type\": \"floating\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Y\",\n\t\t\t\t\"size\": 4,\n\t\t\t\t\"type\": \"floating\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Z\",\n\t\t\t\t\"size\": 4,\n\t\t\t\t\"type\": \"floating\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Red\",\n\t\t\t\t\"size\": 2,\n\t\t\t\t\"type\": \"unsigned\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Green\",\n\t\t\t\t\"size\": 2,\n\t\t\t\t\"type\": \"unsigned\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Blue\",\n\t\t\t\t\"size\": 2,\n\t\t\t\t\"type\": \"unsigned\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Intensity\",\n\t\t\t\t\"size\": 2,\n\t\t\t\t\"type\": \"unsigned\"\n\t\t\t}\n\t\t];\n\n\t\tvar url = serverURL + \"read?depth=\" + baseDepth + \"&schema=\" + JSON.stringify(s);\n\n\t\tGreyhoundUtils.fetchBinary(url, function(err, buffer)\n\t\t{\n\t\t\tif(err) throw new Error(err);\n\n\t\t\tvar view = new DataView(buffer);\n\t\t\tvar numBytes = buffer.byteLength - 4;\n\t\t\tvar pointSize = GreyhoundUtils.pointSizeFrom(s);\n\n\t\t\tvar colorNorm = false;\n\t\t\tvar intensityNorm = false;\n\n\t\t\tfor(var offset = 0; offset < numBytes; offset += pointSize)\n\t\t\t{\n\t\t\t\tif(view.getUint16(offset + 12, true) > 255 ||\n\t\t\t\t\tview.getUint16(offset + 14, true) > 255 ||\n\t\t\t\t\tview.getUint16(offset + 16, true) > 255)\n\t\t\t\t{\n\t\t\t\t\tcolorNorm = true;\n\t\t\t\t}\n\n\t\t\t\tif(view.getUint16(offset + 18, true) > 255)\n\t\t\t\t{\n\t\t\t\t\tintensityNorm = true;\n\t\t\t\t}\n\n\t\t\t\tif(colorNorm && intensityNorm) break;\n\t\t\t}\n\n\t\t\tcb(null,\n\t\t\t{\n\t\t\t\tcolor: colorNorm,\n\t\t\t\tintensity: intensityNorm\n\t\t\t});\n\t\t});\n\t};\n};\n\nexport {GreyhoundUtils};\n","\"use strict\";\n\nimport {PointAttributes, PointAttribute} from \"../PointAttributes.js\";\nimport {PointCloudGreyhoundGeometry, PointCloudGreyhoundGeometryNode} from \"../pointcloud/geometries/PointCloudGreyhoundGeometry.js\";\nimport {GreyhoundBinaryLoader} from \"./GreyhoundBinaryLoader.js\";\nimport {VersionUtils} from \"../utils/VersionUtils.js\";\nimport {GreyhoundUtils} from \"./GreyhoundUtils.js\";\n\nfunction GreyhoundLoader(){}\n\nGreyhoundLoader.loadInfoJSON = function(url, callback){};\n\n/**\n * @return a point cloud octree with the root node data loaded.\n * loading of descendants happens asynchronously when they\"re needed\n *\n * @param url\n * @param loadingFinishedListener executed after loading the binary has been\n * finished\n */\nGreyhoundLoader.load = function(url, callback)\n{\n\tvar HIERARCHY_STEP_SIZE = 5;\n\n\ttry\n\t{\n\t\t//We assume everything ater the string \"greyhound://\" is the server url\n\t\tvar serverURL = url.split(\"greyhound://\")[1];\n\t\tif(serverURL.split(\"http://\").length === 1 && serverURL.split(\"https://\").length === 1)\n\t\t{\n\t\t\tserverURL = \"http://\" + serverURL;\n\t\t}\n\n\t\tGreyhoundUtils.fetch(serverURL + \"info\", function(err, data)\n\t\t{\n\t\t\tif(err) throw new Error(err);\n\n\t\t\t/* We parse the result of the info query, which should be a JSON datastructure somewhat like:\n\t\t\t{\n\t\t\t  \"bounds\": [635577, 848882, -1000, 639004, 853538, 2000],\n\t\t\t  \"numPoints\": 10653336,\n\t\t\t  \"schema\": [\n\t\t\t      { \"name\": \"X\", \"size\": 8, \"type\": \"floating\" },\n\t\t\t      { \"name\": \"Y\", \"size\": 8, \"type\": \"floating\" },\n\t\t\t      { \"name\": \"Z\", \"size\": 8, \"type\": \"floating\" },\n\t\t\t      { \"name\": \"Intensity\", \"size\": 2, \"type\": \"unsigned\" },\n\t\t\t      { \"name\": \"OriginId\", \"size\": 4, \"type\": \"unsigned\" },\n\t\t\t      { \"name\": \"Red\", \"size\": 2, \"type\": \"unsigned\" },\n\t\t\t      { \"name\": \"Green\", \"size\": 2, \"type\": \"unsigned\" },\n\t\t\t      { \"name\": \"Blue\", \"size\": 2, \"type\": \"unsigned\" }\n\t\t\t  ],\n\t\t\t  \"srs\": \"<omitted for brevity>\",\n\t\t\t  \"type\": \"octree\"\n\t\t\t}\n\t\t\t*/\n\t\t\tvar greyhoundInfo = JSON.parse(data);\n\t\t\tvar version = new VersionUtils(\"1.4\");\n\n\t\t\tvar bounds = greyhoundInfo.bounds;\n\n\t\t\t//TODO Unused: var boundsConforming = greyhoundInfo.boundsConforming;\n\t\t\t//TODO Unused: var width = bounds[3] - bounds[0];\n\t\t\t//TODO Unused: var depth = bounds[4] - bounds[1];\n\t\t\t//TODO Unused: var height = bounds[5] - bounds[2];\n\t\t\t//TODO Unused: var radius = width / 2;\n\t\t\t\n\t\t\tvar scale = greyhoundInfo.scale || 0.01;\n\t\t\tif(Array.isArray(scale))\n\t\t\t{\n\t\t\t\tscale = Math.min(scale[0], scale[1], scale[2]);\n\t\t\t}\n\n\t\t\tif(GreyhoundUtils.getQueryParam(\"scale\"))\n\t\t\t{\n\t\t\t\tscale = parseFloat(GreyhoundUtils.getQueryParam(\"scale\"));\n\t\t\t}\n\n\t\t\tvar baseDepth = Math.max(8, greyhoundInfo.baseDepth);\n\n\t\t\t//Ideally we want to change this bit completely, since\n\t\t\t//greyhound\"s options are wider than the default options for\n\t\t\t//visualizing pointclouds. If someone ever has time to build a\n\t\t\t//custom ui element for greyhound, the schema options from\n\t\t\t//this info request should be given to the UI, so the user can\n\t\t\t//choose between them. The selected option can then be\n\t\t\t//directly requested from the server in the\n\t\t\t//PointCloudGreyhoundGeometryNode without asking for\n\t\t\t//attributes that we are not currently visualizing.  We assume\n\t\t\t//XYZ are always available.\n\t\t\tvar attributes = [\"POSITION_CARTESIAN\"];\n\n\t\t\t//To be careful, we only add COLOR_PACKED as an option if all\n\t\t\t//colors are actually found.\n\t\t\tvar red = false;\n\t\t\tvar green = false;\n\t\t\tvar blue = false;\n\n\t\t\tgreyhoundInfo.schema.forEach(function(entry)\n\t\t\t{\n\t\t\t\t//Intensity and Classification are optional.\n\t\t\t\tif(entry.name === \"Intensity\")\n\t\t\t\t{\n\t\t\t\t\tattributes.push(\"INTENSITY\");\n\t\t\t\t}\n\t\t\t\tif(entry.name === \"Classification\")\n\t\t\t\t{\n\t\t\t\t\tattributes.push(\"CLASSIFICATION\");\n\t\t\t\t}\n\n\t\t\t\tif(entry.name === \"Red\") red = true;\n\t\t\t\telse if(entry.name === \"Green\") green = true;\n\t\t\t\telse if(entry.name === \"Blue\") blue = true;\n\t\t\t});\n\n\t\t\tif(red && green && blue) attributes.push(\"COLOR_PACKED\");\n\n\t\t\t//Fill in geometry fields.\n\t\t\tvar pgg = new PointCloudGreyhoundGeometry();\n\t\t\tpgg.serverURL = serverURL;\n\t\t\tpgg.spacing = (bounds[3] - bounds[0]) / Math.pow(2, baseDepth);\n\t\t\tpgg.baseDepth = baseDepth;\n\t\t\tpgg.hierarchyStepSize = HIERARCHY_STEP_SIZE;\n\n\t\t\tpgg.schema = GreyhoundUtils.createSchema(attributes);\n\t\t\tvar pointSize = GreyhoundUtils.pointSizeFrom(pgg.schema);\n\n\t\t\tpgg.pointAttributes = new PointAttributes(attributes);\n\t\t\tpgg.pointAttributes.byteSize = pointSize;\n\n\t\t\tvar boundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(bounds, 0),\n\t\t\t\tnew THREE.Vector3().fromArray(bounds, 3)\n\t\t\t);\n\n\t\t\tvar offset = boundingBox.min.clone();\n\n\t\t\tboundingBox.max.sub(boundingBox.min);\n\t\t\tboundingBox.min.set(0, 0, 0);\n\n\t\t\tpgg.projection = greyhoundInfo.srs;\n\t\t\tpgg.boundingBox = boundingBox;\n\t\t\tpgg.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\n\t\t\tpgg.scale = scale;\n\t\t\tpgg.offset = offset;\n\t\t\tpgg.loader = new GreyhoundBinaryLoader(version, boundingBox, pgg.scale);\n\n\t\t\tvar nodes = {};\n\n\t\t\t//load root\n\t\t\tvar name = \"r\";\n\n\t\t\tvar root = new PointCloudGreyhoundGeometryNode(name, pgg, boundingBox, scale, offset);\n\t\t\troot.level = 0;\n\t\t\troot.hasChildren = true;\n\t\t\troot.numPoints = greyhoundInfo.numPoints;\n\t\t\troot.spacing = pgg.spacing;\n\t\t\tpgg.root = root;\n\t\t\tpgg.root.load();\n\t\t\tnodes[name] = root;\n\t\n\t\t\tpgg.nodes = nodes;\n\n\t\t\tGreyhoundUtils.getNormalization(serverURL, greyhoundInfo.baseDepth,\n\t\t\t\tfunction(_, normalize)\n\t\t\t\t{\n\t\t\t\t\tif(normalize.color) pgg.normalize.color = true;\n\t\t\t\t\tif(normalize.intensity) pgg.normalize.intensity = true;\n\n\t\t\t\t\tcallback(pgg);\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\tcatch(e)\n\t{\n\t\tconsole.log(\"Potree: Loading failed.\", url, e);\n\t\tcallback();\n\t}\n};\n\nGreyhoundLoader.loadPointAttributes = function(mno)\n{\n\tvar fpa = mno.pointAttributes;\n\tvar pa = new PointAttributes();\n\n\tfor(var i = 0; i < fpa.length; i++)\n\t{\n\t\tvar pointAttribute = PointAttribute[fpa[i]];\n\t\tpa.add(pointAttribute);\n\t}\n\n\treturn pa;\n};\n\nGreyhoundLoader.createChildAABB = function(aabb, childIndex)\n{\n\tvar min = aabb.min;\n\tvar max = aabb.max;\n\tvar dHalfLength = new THREE.Vector3().copy(max).sub(min).multiplyScalar(0.5);\n\tvar xHalfLength = new THREE.Vector3(dHalfLength.x, 0, 0);\n\tvar yHalfLength = new THREE.Vector3(0, dHalfLength.y, 0);\n\tvar zHalfLength = new THREE.Vector3(0, 0, dHalfLength.z);\n\n\tvar cmin = min;\n\tvar cmax = new THREE.Vector3().add(min).add(dHalfLength);\n\n\tif(childIndex === 1)\n\t{\n\t\tmin = new THREE.Vector3().copy(cmin).add(zHalfLength);\n\t\tmax = new THREE.Vector3().copy(cmax).add(zHalfLength);\n\t}\n\telse if(childIndex === 3)\n\t{\n\t\tmin = new THREE.Vector3().copy(cmin).add(zHalfLength).add(yHalfLength);\n\t\tmax = new THREE.Vector3().copy(cmax).add(zHalfLength).add(yHalfLength);\n\t}\n\telse if(childIndex === 0)\n\t{\n\t\tmin = cmin;\n\t\tmax = cmax;\n\t}\n\telse if(childIndex === 2)\n\t{\n\t\tmin = new THREE.Vector3().copy(cmin).add(yHalfLength);\n\t\tmax = new THREE.Vector3().copy(cmax).add(yHalfLength);\n\t}\n\telse if(childIndex === 5)\n\t{\n\t\tmin = new THREE.Vector3().copy(cmin).add(zHalfLength).add(xHalfLength);\n\t\tmax = new THREE.Vector3().copy(cmax).add(zHalfLength).add(xHalfLength);\n\t}\n\telse if(childIndex === 7)\n\t{\n\t\tmin = new THREE.Vector3().copy(cmin).add(dHalfLength);\n\t\tmax = new THREE.Vector3().copy(cmax).add(dHalfLength);\n\t}\n\telse if(childIndex === 4)\n\t{\n\t\tmin = new THREE.Vector3().copy(cmin).add(xHalfLength);\n\t\tmax = new THREE.Vector3().copy(cmax).add(xHalfLength);\n\t}\n\telse if(childIndex === 6)\n\t{\n\t\tmin = new THREE.Vector3().copy(cmin).add(xHalfLength).add(yHalfLength);\n\t\tmax = new THREE.Vector3().copy(cmax).add(xHalfLength).add(yHalfLength);\n\t}\n\n\treturn new THREE.Box3(min, max);\n};\n\nexport {GreyhoundLoader};","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {PointAttributeNames} from \"../PointAttributes.js\";\nimport {VersionUtils} from \"../utils/VersionUtils.js\";\nimport {WorkerManager} from \"../utils/WorkerManager.js\";\nimport {Global} from \"../Global.js\";\nimport { XHRFactory } from '../XHRFactory.js';\n\nclass BinaryLoader\n{\n\tconstructor(version, boundingBox, scale)\n\t{\n\t\tif(typeof(version) === \"string\")\n\t\t{\n\t\t\tthis.version = new VersionUtils(version);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.version = version;\n\t\t}\n\n\t\tthis.boundingBox = boundingBox;\n\t\tthis.scale = scale;\n\t}\n\n\tload(node)\n\t{\n\t\tif(node.loaded)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar url = node.getURL();\n\n\t\tif(this.version.equalOrHigher(\"1.4\"))\n\t\t{\n\t\t\turl += \".bin\";\n\t\t}\n\t\t\n\t\tvar self = this;\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n\t\txhr.onload = function()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tself.parse(node, xhr.response);\n\t\t\t}\n\t\t\tcatch(e)\n\t\t\t{\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t\tconsole.error(\"Potree: Exception thrown parsing points.\", e);\n\t\t\t}\n\t\t};\n\t\txhr.onerror = function(event)\n\t\t{\n\t\t\tGlobal.numNodesLoading--;\n\t\t\tconsole.error(\"Potree: Failed to load file.\", xhr, url);\n\t\t};\n\n\t\txhr.send(null);\n\t};\n\n\tparse(node, buffer)\n\t{\n\t\tvar pointAttributes = node.pcoGeometry.pointAttributes;\n\t\tvar numPoints = buffer.byteLength / node.pcoGeometry.pointAttributes.byteSize;\n\n\t\tif(this.version.upTo(\"1.5\"))\n\t\t{\n\t\t\tnode.numPoints = numPoints;\n\t\t}\n\n\t\tvar message =\n\t\t{\n\t\t\tbuffer: buffer,\n\t\t\tpointAttributes: pointAttributes,\n\t\t\tversion: this.version.version,\n\t\t\tmin: [node.boundingBox.min.x, node.boundingBox.min.y, node.boundingBox.min.z],\n\t\t\toffset: [node.pcoGeometry.offset.x, node.pcoGeometry.offset.y, node.pcoGeometry.offset.z],\n\t\t\tscale: this.scale,\n\t\t\tspacing: node.spacing,\n\t\t\thasChildren: node.hasChildren,\n\t\t\tname: node.name\n\t\t};\n\n\t\tGlobal.workerPool.runTask(WorkerManager.BINARY_DECODER, function(e)\n\t\t{\n\t\t\tvar data = e.data;\n\n\t\t\tif(data.error !== undefined)\n\t\t\t{\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t\tconsole.error(\"Potree: Binary worker error.\", data);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar buffers = data.attributeBuffers;\n\t\t\tvar tightBoundingBox = new THREE.Box3(new THREE.Vector3().fromArray(data.tightBoundingBox.min), new THREE.Vector3().fromArray(data.tightBoundingBox.max));\n\t\t\tvar geometry = new THREE.BufferGeometry();\n\n\t\t\tfor(var property in buffers)\n\t\t\t{\n\t\t\t\tvar buffer = buffers[property].buffer;\n\n\t\t\t\tif(parseInt(property) === PointAttributeNames.POSITION_CARTESIAN)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"position\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.COLOR_PACKED)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"color\", new THREE.BufferAttribute(new Uint8Array(buffer), 4, true));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.INTENSITY)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"intensity\", new THREE.BufferAttribute(new Float32Array(buffer), 1));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.CLASSIFICATION)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"classification\", new THREE.BufferAttribute(new Uint8Array(buffer), 1));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.NORMAL_SPHEREMAPPED)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.NORMAL_OCT16)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.NORMAL)\n\t\t\t\t{\n\t\t\t\t\tgeometry.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(buffer), 3));\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.INDICES)\n\t\t\t\t{\n\t\t\t\t\tvar bufferAttribute = new THREE.BufferAttribute(new Uint8Array(buffer), 4);\n\t\t\t\t\tbufferAttribute.normalized = true;\n\t\t\t\t\tgeometry.setAttribute(\"indices\", bufferAttribute);\n\t\t\t\t}\n\t\t\t\telse if(parseInt(property) === PointAttributeNames.SPACING)\n\t\t\t\t{\n\t\t\t\t\tvar bufferAttribute = new THREE.BufferAttribute(new Float32Array(buffer), 1);\n\t\t\t\t\tgeometry.setAttribute(\"spacing\", bufferAttribute);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttightBoundingBox.max.sub(tightBoundingBox.min);\n\t\t\ttightBoundingBox.min.set(0, 0, 0);\n\n\t\t\tvar numPoints = e.data.buffer.byteLength / pointAttributes.byteSize;\n\n\t\t\tnode.numPoints = numPoints;\n\t\t\tnode.geometry = geometry;\n\t\t\tnode.mean = new THREE.Vector3(...data.mean);\n\t\t\tnode.tightBoundingBox = tightBoundingBox;\n\t\t\tnode.loaded = true;\n\t\t\tnode.loading = false;\n\t\t\tnode.estimatedSpacing = data.estimatedSpacing;\n\t\t\tGlobal.numNodesLoading--;\n\t\t}, message, [message.buffer]);\n\t};\n};\n\nexport {BinaryLoader};\n","\"use strict\";\n\nimport {WorkerManager} from \"../utils/WorkerManager.js\";\nimport {Global} from \"../Global.js\";\n\nvar pointFormatReaders =\n[\n\tfunction(dv)\n\t{\n\t\treturn {\n\t\t\t\"position\": [ dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n\t\t\t\"intensity\": dv.getUint16(12, true),\n\t\t\t\"classification\": dv.getUint8(16, true)\n\t\t};\n\t},\n\tfunction(dv)\n\t{\n\t\treturn {\n\t\t\t\"position\": [ dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n\t\t\t\"intensity\": dv.getUint16(12, true),\n\t\t\t\"classification\": dv.getUint8(16, true)\n\t\t};\n\t},\n\tfunction(dv)\n\t{\n\t\treturn {\n\t\t\t\"position\": [ dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n\t\t\t\"intensity\": dv.getUint16(12, true),\n\t\t\t\"classification\": dv.getUint8(16, true),\n\t\t\t\"color\": [dv.getUint16(20, true), dv.getUint16(22, true), dv.getUint16(24, true)]\n\t\t};\n\t},\n\tfunction(dv)\n\t{\n\t\treturn {\n\t\t\t\"position\": [ dv.getInt32(0, true), dv.getInt32(4, true), dv.getInt32(8, true)],\n\t\t\t\"intensity\": dv.getUint16(12, true),\n\t\t\t\"classification\": dv.getUint8(16, true),\n\t\t\t\"color\": [dv.getUint16(28, true), dv.getUint16(30, true), dv.getUint16(32, true)]\n\t\t};\n\t}\n];\n\nfunction readAs(buf, Type, offset, count)\n{\n\tcount = (count === undefined || count === 0 ? 1 : count);\n\tvar sub = buf.slice(offset, offset + Type.BYTES_PER_ELEMENT * count);\n\n\tvar r = new Type(sub);\n\tif(count === undefined || count === 1)\n\t{\n\t\treturn r[0];\n\t}\n\n\tvar ret = [];\n\tfor(var i = 0 ; i < count ; i ++)\n\t{\n\t\tret.push(r[i]);\n\t}\n\n\treturn ret;\n}\n\nfunction parseLASHeader(arraybuffer)\n{\n\tvar data = {};\n\n\tdata.pointsOffset = readAs(arraybuffer, Uint32Array, 32*3);\n\tdata.pointsFormatId = readAs(arraybuffer, Uint8Array, 32*3+8);\n\tdata.pointsStructSize = readAs(arraybuffer, Uint16Array, 32*3+8+1);\n\tdata.pointsCount = readAs(arraybuffer, Uint32Array, 32*3 + 11);\n\n\tvar start = 32*3 + 35;\n\tdata.scale = readAs(arraybuffer, Float64Array, start, 3); start += 24; // 8*3\n\tdata.offset = readAs(arraybuffer, Float64Array, start, 3); start += 24;\n\n\tvar bounds = readAs(arraybuffer, Float64Array, start, 6); start += 48; // 8*6;\n\tdata.maxs = [bounds[0], bounds[2], bounds[4]];\n\tdata.mins = [bounds[1], bounds[3], bounds[5]];\n\n\treturn data;\n}\n\n// LAS Loader\n// Loads uncompressed files\n//\nfunction LASLoader(arraybuffer)\n{\n\tthis.arraybuffer = arraybuffer;\n};\n\nLASLoader.prototype.open = function()\n{\n\t// nothing needs to be done to open this file\n\t//\n\tthis.readOffset = 0;\n\treturn new Promise(function(res, rej)\n\t{\n\t\tsetTimeout(res, 0);\n\t});\n};\n\nLASLoader.prototype.getHeader = function()\n{\n\tvar self = this;\n\n\treturn new Promise(function(res, rej)\n\t{\n\t\tsetTimeout(function()\n\t\t{\n\t\t\tself.header = parseLASHeader(self.arraybuffer);\n\t\t\tres(self.header);\n\t\t}, 0);\n\t});\n};\n\nLASLoader.prototype.readData = function(count, offset, skip)\n{\n\tvar self = this;\n\n\treturn new Promise(function(res, rej)\n\t{\n\t\tsetTimeout(function()\n\t\t{\n\t\t\tif(!self.header)\n\t\t\t\treturn rej(new Error(\"Cannot start reading data till a header request is issued\"));\n\n\t\t\tvar start;\n\t\t\tif(skip <= 1)\n\t\t\t{\n\t\t\t\tcount = Math.min(count, self.header.pointsCount - self.readOffset);\n\t\t\t\tstart = self.header.pointsOffset + self.readOffset * self.header.pointsStructSize;\n\t\t\t\tvar end = start + count * self.header.pointsStructSize;\n\t\t\t\tres(\n\t\t\t\t{\n\t\t\t\t\tbuffer: self.arraybuffer.slice(start, end),\n\t\t\t\t\tcount: count,\n\t\t\t\t\thasMoreData: self.readOffset + count < self.header.pointsCount\n\t\t\t\t});\n\t\t\t\tself.readOffset += count;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar pointsToRead = Math.min(count * skip, self.header.pointsCount - self.readOffset);\n\t\t\t\tvar bufferSize = Math.ceil(pointsToRead / skip);\n\t\t\t\tvar pointsRead = 0;\n\n\t\t\t\tvar buf = new Uint8Array(bufferSize * self.header.pointsStructSize);\n\n\t\t\t\tfor(var i = 0 ; i < pointsToRead ; i++)\n\t\t\t\t{\n\t\t\t\t\tif(i % skip === 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tstart = self.header.pointsOffset + self.readOffset * self.header.pointsStructSize;\n\t\t\t\t\t\tvar src = new Uint8Array(self.arraybuffer, start, self.header.pointsStructSize);\n\n\t\t\t\t\t\tbuf.set(src, pointsRead * self.header.pointsStructSize);\n\t\t\t\t\t\tpointsRead ++;\n\t\t\t\t\t}\n\n\t\t\t\t\tself.readOffset ++;\n\t\t\t\t}\n\n\t\t\t\tres(\n\t\t\t\t{\n\t\t\t\t\tbuffer: buf.buffer,\n\t\t\t\t\tcount: pointsRead,\n\t\t\t\t\thasMoreData: self.readOffset < self.header.pointsCount\n\t\t\t\t});\n\t\t\t}\n\t\t}, 0);\n\t});\n};\n\nLASLoader.prototype.close = function()\n{\n\tvar self = this;\n\treturn new Promise(function(res, rej)\n\t{\n\t\tself.arraybuffer = null;\n\t\tsetTimeout(res, 0);\n\t});\n};\n\n// LAZ Loader\n// Uses NaCL module to load LAZ files\n//\nfunction LAZLoader(arraybuffer)\n{\n\tvar self = this;\n\n\tthis.arraybuffer = arraybuffer;\n\tthis.nextCB = null;\n\n\tthis.dorr = function(req, cb)\n\t{\n\t\tself.nextCB = cb;\n\t\t\n\t\tGlobal.workerPool.runTask(WorkerManager.LAS_LAZ, function(e)\n\t\t{\n\t\t\tif(self.nextCB !== null)\n\t\t\t{\n\t\t\t\tself.nextCB(e.data);\n\t\t\t\tself.nextCB = null;\n\t\t\t}\n\t\t}, req);\n\t};\n};\n\nLAZLoader.prototype.open = function()\n{\n\t// nothing needs to be done to open this file\n\tvar self = this;\n\treturn new Promise(function(res, rej)\n\t{\n\t\tself.dorr({type:\"open\", arraybuffer: self.arraybuffer}, function(r)\n\t\t{\n\t\t\tif(r.status !== 1)\n\t\t\t{\n\t\t\t\treturn rej(new Error(\"Failed to open file\"));\n\t\t\t}\n\n\t\t\tres(true);\n\t\t});\n\t});\n};\n\nLAZLoader.prototype.getHeader = function()\n{\n\tvar self = this;\n\n\treturn new Promise(function(res, rej)\n\t{\n\t\tself.dorr({type:'header'}, function(r)\n\t\t{\n\t\t\tif(r.status !== 1)\n\t\t\t{\n\t\t\t\treturn rej(new Error(\"Failed to get header\"));\n\t\t\t}\n\n\t\t\tres(r.header);\n\t\t});\n\t});\n};\n\nLAZLoader.prototype.readData = function(count, offset, skip)\n{\n\tvar self = this;\n\n\treturn new Promise(function(res, rej)\n\t{\n\t\tself.dorr({type:'read', count: count, offset: offset, skip: skip}, function(r)\n\t\t{\n\t\t\tif(r.status !== 1)\n\t\t\t\treturn rej(new Error(\"Failed to read data\"));\n\t\t\tres({\n\t\t\t\tbuffer: r.buffer,\n\t\t\t\tcount: r.count,\n\t\t\t\thasMoreData: r.hasMoreData\n\t\t\t});\n\t\t});\n\t});\n};\n\nLAZLoader.prototype.close = function()\n{\n\tvar self = this;\n\n\treturn new Promise(function(res, rej)\n\t{\n\t\tself.dorr({type:'close'}, function(r)\n\t\t{\n\t\t\tif(r.status !== 1)\n\t\t\t{\n\t\t\t\treturn rej(new Error(\"Failed to close file\"));\n\t\t\t}\n\n\t\t\tres(true);\n\t\t});\n\t});\n};\n\n// A single consistent interface for loading LAS/LAZ files\nfunction LASFile(arraybuffer)\n{\n\tthis.arraybuffer = arraybuffer;\n\n\tthis.determineVersion();\n\tif(this.version > 12)\n\t{\n\t\tthrow new Error(\"Only file versions <= 1.2 are supported at this time\");\n\t}\n\n\tthis.determineFormat();\n\tif(pointFormatReaders[this.formatId] === undefined)\n\t{\n\t\tthrow new Error(\"The point format ID is not supported\");\n\t}\n\n\tthis.loader = this.isCompressed ? new LAZLoader(this.arraybuffer) : new LASLoader(this.arraybuffer);\n};\n\nLASFile.prototype.determineFormat = function()\n{\n\tvar formatId = readAs(this.arraybuffer, Uint8Array, 32*3+8);\n\tvar bit_7 = (formatId & 0x80) >> 7;\n\tvar bit_6 = (formatId & 0x40) >> 6;\n\n\tif(bit_7 === 1 && bit_6 === 1)\n\t{\n\t\tthrow new Error(\"Old style compression not supported\");\n\t}\n\n\tthis.formatId = formatId & 0x3f;\n\tthis.isCompressed = (bit_7 === 1 || bit_6 === 1);\n};\n\nLASFile.prototype.determineVersion = function()\n{\n\tvar ver = new Int8Array(this.arraybuffer, 24, 2);\n\tthis.version = ver[0] * 10 + ver[1];\n\tthis.versionAsString = ver[0] + \".\" + ver[1];\n};\n\nLASFile.prototype.open = function()\n{\n\treturn this.loader.open();\n};\n\nLASFile.prototype.getHeader = function()\n{\n\treturn this.loader.getHeader();\n};\n\nLASFile.prototype.readData = function(count, start, skip)\n{\n\treturn this.loader.readData(count, start, skip);\n};\n\nLASFile.prototype.close = function()\n{\n\treturn this.loader.close();\n};\n\n// Decodes LAS records into points\nfunction LASDecoder(buffer, pointFormatID, pointSize, pointsCount, scale, offset, mins, maxs)\n{\n\tthis.arrayb = buffer;\n\tthis.decoder = pointFormatReaders[pointFormatID];\n\tthis.pointsCount = pointsCount;\n\tthis.pointSize = pointSize;\n\tthis.scale = scale;\n\tthis.offset = offset;\n\tthis.mins = mins;\n\tthis.maxs = maxs;\n};\n\nLASDecoder.prototype.getPoint = function(index)\n{\n\tif(index < 0 || index >= this.pointsCount)\n\t{\n\t\tthrow new Error(\"Point index out of range\");\n\t}\n\n\treturn this.decoder(new DataView(this.arrayb, index * this.pointSize, this.pointSize));\n};\n\nexport {LASLoader, LAZLoader, LASFile, LASDecoder};","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {VersionUtils} from \"../utils/VersionUtils.js\";\nimport {WorkerManager} from \"../utils/WorkerManager.js\";\nimport {LASLoader, LAZLoader, LASFile, LASDecoder} from \"./LASLoader.js\";\nimport {Global} from \"../Global.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\n\n/**\n * laslaz code taken and adapted from plas.io js-laslaz\n *\thttp://plas.io/\n *  https://github.com/verma/plasio\n *\n * Thanks to Uday Verma and Howard Butler\n */\nclass LASLAZLoader\n{\n\tconstructor(version)\n\t{\n\t\tif(typeof(version) === \"string\")\n\t\t{\n\t\t\tthis.version = new VersionUtils(version);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.version = version;\n\t\t}\n\t}\n\n\tload(node)\n\t{\n\t\tif(node.loaded)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar pointAttributes = node.pcoGeometry.pointAttributes;\n\t\tvar url = node.getURL();\n\n\t\tif(this.version.equalOrHigher(\"1.4\"))\n\t\t{\n\t\t\turl += \".\" + pointAttributes.toLowerCase();\n\t\t}\n\n\t\tvar self = this;\n\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n\t\txhr.onload = function()\n\t\t{\n\t\t\tif(xhr.response instanceof ArrayBuffer)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tself.parse(node, xhr.response);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(\"Potree: Exception thrown parsing points.\", e);\n\t\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t\tconsole.log(\"Potree: LASLAZLoader xhr response is not a ArrayBuffer.\");\n\t\t\t}\n\t\t};\n\t\txhr.onerror = function()\n\t\t{\n\t\t\tGlobal.numNodesLoading--;\n\t\t\tconsole.log(\"Potree: LASLAZLoader failed to load file, \" + xhr.status + \", file: \" + url);\n\t\t};\n\t\txhr.send(null);\n\t}\n\n\tparse(node, buffer)\n\t{\n\t\tvar lf = new LASFile(buffer);\n\t\tvar handler = new LASLAZBatcher(node);\n\n\t\tlf.open() .then(msg =>\n\t\t{\n\t\t\tlf.isOpen = true;\n\t\t\treturn lf;\n\t\t}).catch(msg =>\n\t\t{\n\t\t\tconsole.log(\"Potree: Failed to open file.\");\n\t\t}).then(lf =>\n\t\t{\n\t\t\treturn lf.getHeader().then(function(h)\n\t\t\t{\n\t\t\t\treturn [lf, h];\n\t\t\t});\n\t\t}).then(v =>\n\t\t{\n\t\t\tlet lf = v[0];\n\t\t\tlet header = v[1];\n\t\t\tlet skip = 1;\n\t\t\tlet totalRead = 0;\n\t\t\tlet totalToRead = (skip <= 1 ? header.pointsCount : header.pointsCount / skip);\n\n\t\t\tvar reader = function()\n\t\t\t{\n\t\t\t\tlet p = lf.readData(1000000, 0, skip);\n\n\t\t\t\treturn p.then(function(data)\n\t\t\t\t{\n\t\t\t\t\thandler.push(new LASDecoder(data.buffer,\n\t\t\t\t\t\theader.pointsFormatId,\n\t\t\t\t\t\theader.pointsStructSize,\n\t\t\t\t\t\tdata.count,\n\t\t\t\t\t\theader.scale,\n\t\t\t\t\t\theader.offset,\n\t\t\t\t\t\theader.mins, header.maxs));\n\n\t\t\t\t\ttotalRead += data.count;\n\n\t\t\t\t\tif(data.hasMoreData)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn reader();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\theader.totalRead = totalRead;\n\t\t\t\t\t\theader.versionAsString = lf.versionAsString;\n\t\t\t\t\t\theader.isCompressed = lf.isCompressed;\n\t\t\t\t\t\treturn [lf, header, handler];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\n\t\t\treturn reader();\n\t\t}).then(v =>\n\t\t{\n\t\t\tlet lf = v[0];\n\n\t\t\t//Close it\n\t\t\treturn lf.close().then(function()\n\t\t\t{\n\t\t\t\tlf.isOpen = false;\n\t\t\t\treturn v.slice(1);\n\t\t\t}).catch(e =>\n\t\t\t{\n\t\t\t\t//If there was a cancellation, make sure the file is closed, if the file is open close and then fail\n\t\t\t\tif(lf.isOpen)\n\t\t\t\t{\n\t\t\t\t\treturn lf.close().then(function()\n\t\t\t\t\t{\n\t\t\t\t\t\tlf.isOpen = false;\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t});\n\t\t});\n\t}\n\n\thandle(node, url){}\n};\n\nclass LASLAZBatcher\n{\n\tconstructor(node)\n\t{\n\t\tthis.node = node;\n\t}\n\n\tpush(data)\n\t{\n\t\tvar self = this;\n\n\t\tvar message =\n\t\t{\n\t\t\tbuffer: data.arrayb,\n\t\t\tnumPoints: data.pointsCount,\n\t\t\tpointSize: data.pointSize,\n\t\t\tpointFormatID: 2,\n\t\t\tscale: data.scale,\n\t\t\toffset: data.offset,\n\t\t\tmins: data.mins,\n\t\t\tmaxs: data.maxs\n\t\t};\n\n\t\tvar worker = Global.workerPool.getWorker(WorkerManager.LAS_DECODER);\n\t\tworker.onmessage = function(e)\n\t\t{\n\t\t\tvar geometry = new THREE.BufferGeometry();\n\t\t\tvar numPoints = data.pointsCount;\n\n\t\t\tvar positions = new Float32Array(e.data.position);\n\t\t\tvar colors = new Uint8Array(e.data.color);\n\t\t\tvar intensities = new Float32Array(e.data.intensity);\n\t\t\tvar classifications = new Uint8Array(e.data.classification);\n\t\t\tvar returnNumbers = new Uint8Array(e.data.returnNumber);\n\t\t\tvar numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\tvar pointSourceIDs = new Uint16Array(e.data.pointSourceID);\n\t\t\tvar indices = new Uint8Array(e.data.indices);\n\n\t\t\tgeometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n\t\t\tgeometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 4, true));\n\t\t\tgeometry.setAttribute(\"intensity\", new THREE.BufferAttribute(intensities, 1));\n\t\t\tgeometry.setAttribute(\"classification\", new THREE.BufferAttribute(classifications, 1));\n\t\t\tgeometry.setAttribute(\"returnNumber\", new THREE.BufferAttribute(returnNumbers, 1));\n\t\t\tgeometry.setAttribute(\"numberOfReturns\", new THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\tgeometry.setAttribute(\"pointSourceID\", new THREE.BufferAttribute(pointSourceIDs, 1));\n\t\t\t//geometry.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(numPoints * 3), 3));\n\t\t\tgeometry.setAttribute(\"indices\", new THREE.BufferAttribute(indices, 4));\n\t\t\tgeometry.attributes.indices.normalized = true;\n\n\t\t\tvar tightBoundingBox = new THREE.Box3\n\t\t\t(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tgeometry.boundingBox = self.node.boundingBox;\n\t\t\tself.node.tightBoundingBox = tightBoundingBox;\n\n\t\t\tself.node.geometry = geometry;\n\t\t\tself.node.numPoints = numPoints;\n\t\t\tself.node.loaded = true;\n\t\t\tself.node.loading = false;\n\t\t\tGlobal.numNodesLoading--;\n\t\t\tself.node.mean = new THREE.Vector3(...e.data.mean);\n\n\t\t\tGlobal.workerPool.returnWorker(WorkerManager.LAS_DECODER, worker);\n\t\t};\n\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n};\n\nexport {LASLAZLoader};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {POCLoader} from \"../../loaders/POCLoader.js\";\nimport {Global} from \"../../Global.js\";\nimport {PointCloudTree, PointCloudTreeNode} from \"../PointCloudTree.js\";\nimport {XHRFactory} from \"../../XHRFactory.js\";\n\nclass PointCloudOctreeGeometry\n{\n\tconstructor()\n\t{\n\t\tthis.url = null;\n\t\tthis.octreeDir = null;\n\t\tthis.spacing = 0;\n\t\tthis.boundingBox = null;\n\t\tthis.root = null;\n\t\tthis.nodes = null;\n\t\tthis.pointAttributes = null;\n\t\tthis.hierarchyStepSize = -1;\n\t\tthis.loader = null;\n\t}\n};\n\nclass PointCloudOctreeGeometryNode extends PointCloudTreeNode\n{\n\tconstructor(name, pcoGeometry, boundingBox)\n\t{\n\t\tsuper();\n\n\t\tthis.id = PointCloudOctreeGeometryNode.IDCount++;\n\t\tthis.name = name;\n\t\tthis.index = parseInt(name.charAt(name.length - 1));\n\t\tthis.pcoGeometry = pcoGeometry;\n\t\tthis.geometry = null;\n\t\tthis.boundingBox = boundingBox;\n\t\tthis.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\tthis.children = {};\n\t\tthis.numPoints = 0;\n\t\tthis.level = null;\n\t\tthis.loaded = false;\n\t\tthis.oneTimeDisposeHandlers = [];\n\t}\n\n\tisGeometryNode()\n\t{\n\t\treturn true;\n\t}\n\n\tgetLevel()\n\t{\n\t\treturn this.level;\n\t}\n\n\tisTreeNode()\n\t{\n\t\treturn false;\n\t}\n\n\tisLoaded()\n\t{\n\t\treturn this.loaded;\n\t}\n\n\tgetBoundingSphere()\n\t{\n\t\treturn this.boundingSphere;\n\t}\n\n\tgetBoundingBox()\n\t{\n\t\treturn this.boundingBox;\n\t}\n\n\tgetChildren()\n\t{\n\t\tvar children = [];\n\n\t\tfor(var i = 0; i < 8; i++)\n\t\t{\n\t\t\tif(this.children[i])\n\t\t\t{\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\tgetURL()\n\t{\n\t\tvar url = \"\";\n\t\tvar version = this.pcoGeometry.loader.version;\n\n\t\tif(version.equalOrHigher(\"1.5\"))\n\t\t{\n\t\t\turl = this.pcoGeometry.octreeDir + \"/\" + this.getHierarchyPath() + \"/\" + this.name;\n\t\t}\n\t\telse if(version.equalOrHigher(\"1.4\"))\n\t\t{\n\t\t\turl = this.pcoGeometry.octreeDir + \"/\" + this.name;\n\t\t}\n\t\telse if(version.upTo(\"1.3\"))\n\t\t{\n\t\t\turl = this.pcoGeometry.octreeDir + \"/\" + this.name;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tgetHierarchyPath()\n\t{\n\t\tvar path = \"r/\";\n\t\tvar hierarchyStepSize = this.pcoGeometry.hierarchyStepSize;\n\t\tvar indices = this.name.substr(1);\n\n\t\tvar numParts = Math.floor(indices.length / hierarchyStepSize);\n\t\tfor(var i = 0; i < numParts; i++)\n\t\t{\n\t\t\tpath += indices.substr(i * hierarchyStepSize, hierarchyStepSize) + \"/\";\n\t\t}\n\n\t\tpath = path.slice(0, -1);\n\n\t\treturn path;\n\t}\n\n\taddChild(child)\n\t{\n\t\tthis.children[child.index] = child;\n\t\tchild.parent = this;\n\t}\n\n\tload()\n\t{\n\t\tif(this.loading === true || this.loaded === true || Global.numNodesLoading >= Global.maxNodesLoading)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.loading = true;\n\t\tGlobal.numNodesLoading++;\n\n\t\ttry\n\t\t{\n\t\t\tif(this.pcoGeometry.loader.version.equalOrHigher(\"1.5\"))\n\t\t\t{\n\t\t\t\tif((this.level % this.pcoGeometry.hierarchyStepSize) === 0 && this.hasChildren)\n\t\t\t\t{\n\t\t\t\t\tthis.loadHierachyThenPoints();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.loadPoints();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.loadPoints();\n\t\t\t}\n\t\t}\n\t\tcatch(e)\n\t\t{\n\t\t\tGlobal.numNodesLoading--;\n\t\t\tconsole.error(\"Potree: Exception thrown loading points file.\", e);\n\t\t}\n\n\t}\n\n\tloadPoints()\n\t{\n\t\tthis.pcoGeometry.loader.load(this);\n\t}\n\n\tloadHierachyThenPoints()\n\t{\n\t\tvar node = this;\n\n\t\tvar callback = function(node, hbuffer)\n\t\t{\n\t\t\tvar view = new DataView(hbuffer);\n\n\t\t\tvar stack = [];\n\t\t\tvar children = view.getUint8(0);\n\t\t\tvar numPoints = view.getUint32(1, true);\n\t\t\tnode.numPoints = numPoints;\n\t\t\tstack.push({children: children, numPoints: numPoints, name: node.name});\n\n\t\t\tvar decoded = [];\n\t\t\tvar offset = 5;\n\n\t\t\twhile(stack.length > 0)\n\t\t\t{\n\t\t\t\tvar snode = stack.shift();\n\t\t\t\tvar mask = 1;\n\t\t\t\tfor(var i = 0; i < 8; i++)\n\t\t\t\t{\n\t\t\t\t\tif((snode.children & mask) !== 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar childName = snode.name + i;\n\t\t\t\t\t\tvar childChildren = view.getUint8(offset);\n\t\t\t\t\t\tvar childNumPoints = view.getUint32(offset + 1, true);\n\n\t\t\t\t\t\tstack.push({children: childChildren, numPoints: childNumPoints, name: childName});\n\t\t\t\t\t\tdecoded.push({children: childChildren, numPoints: childNumPoints, name: childName});\n\n\t\t\t\t\t\toffset += 5;\n\t\t\t\t\t}\n\n\t\t\t\t\tmask = mask * 2;\n\t\t\t\t}\n\n\t\t\t\tif(offset === hbuffer.byteLength)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar nodes = {};\n\t\t\tnodes[node.name] = node;\n\t\t\tvar pco = node.pcoGeometry;\n\n\t\t\tfor(var i = 0; i < decoded.length; i++)\n\t\t\t{\n\t\t\t\tvar name = decoded[i].name;\n\t\t\t\tvar decodedNumPoints = decoded[i].numPoints;\n\t\t\t\tvar index = parseInt(name.charAt(name.length - 1));\n\t\t\t\tvar parentName = name.substring(0, name.length - 1);\n\t\t\t\tvar parentNode = nodes[parentName];\n\t\t\t\tvar level = name.length - 1;\n\t\t\t\tvar boundingBox = POCLoader.createChildAABB(parentNode.boundingBox, index);\n\n\t\t\t\tvar currentNode = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\tcurrentNode.level = level;\n\t\t\t\tcurrentNode.numPoints = decodedNumPoints;\n\t\t\t\tcurrentNode.hasChildren = decoded[i].children > 0;\n\t\t\t\tcurrentNode.spacing = pco.spacing / Math.pow(2, level);\n\t\t\t\tparentNode.addChild(currentNode);\n\t\t\t\tnodes[name] = currentNode;\n\t\t\t}\n\n\t\t\tnode.loadPoints();\n\t\t};\n\t\t\n\t\tif((node.level % node.pcoGeometry.hierarchyStepSize) === 0)\n\t\t{\n\t\t\tvar hurl = node.pcoGeometry.octreeDir + \"/\" + node.getHierarchyPath() + \"/\" + node.name + \".hrc\";\n\t\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\t\txhr.open(\"GET\", hurl, true);\n\t\t\txhr.responseType = \"arraybuffer\";\n\t\t\txhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n\t\t\txhr.onload = function(event)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback(node, xhr.response);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t\t\tconsole.error(\"Potree: Exception thrown parsing points.\", e);\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr.onerror = function(event)\n\t\t\t{\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t\tconsole.error(\"Potree: Failed to load file.\", xhr.status, hurl, event);\n\t\t\t}\n\t\t\txhr.send(null);\n\t\t}\n\t}\n\n\tgetNumPoints()\n\t{\n\t\treturn this.numPoints;\n\t}\n\n\tdispose()\n\t{\n\t\tif(this.geometry && this.parent != null)\n\t\t{\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.geometry = null;\n\t\t\tthis.loaded = false;\n\n\t\t\tfor(var i = 0; i < this.oneTimeDisposeHandlers.length; i++)\n\t\t\t{\n\t\t\t\tvar handler = this.oneTimeDisposeHandlers[i];\n\t\t\t\thandler();\n\t\t\t}\n\t\t\tthis.oneTimeDisposeHandlers = [];\n\t\t}\n\t}\n\n}\n\nPointCloudOctreeGeometryNode.IDCount = 0;\n\nObject.assign(PointCloudOctreeGeometryNode.prototype, THREE.EventDispatcher.prototype);\n\nexport {PointCloudOctreeGeometry, PointCloudOctreeGeometryNode};","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {BinaryLoader} from \"./BinaryLoader.js\";\nimport {LASLAZLoader} from \"./LASLAZLoader.js\";\nimport {PointAttributes, PointAttribute} from \"../PointAttributes.js\";\nimport {PointCloudOctreeGeometry, PointCloudOctreeGeometryNode} from \"../pointcloud/geometries/PointCloudOctreeGeometry.js\";\nimport {VersionUtils} from \"../utils/VersionUtils.js\";\nimport {Global} from \"../Global.js\";\nimport {XHRFactory} from \"../XHRFactory.js\";\n\n/**\n * @class Loads mno files and returns a PointcloudOctree\n * for a description of the mno binary file format, read mnoFileFormat.txt\n *\n * @author Markus Schuetz\n */\nclass POCLoader\n{\n\t/**\n\t * @return a point cloud octree with the root node data loaded.\n\t * loading of descendants happens asynchronously when they\"re needed\n\t *\n\t * @param url\n\t * @param loadingFinishedListener executed after loading the binary has been finished\n\t */\n\tstatic load(url, callback)\n\t{\n\t\tvar pco = new PointCloudOctreeGeometry();\n\t\tpco.url = url;\n\t\t\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.onload = function()\n\t\t{\n\t\t\tvar data = JSON.parse(xhr.responseText);\n\t\t\tvar version = new VersionUtils(data.version);\n\n\t\t\t//Assume dir as absolute if it starts with http\n\t\t\tif(data.octreeDir.indexOf(\"http\") === 0)\n\t\t\t{\n\t\t\t\tpco.octreeDir = data.octreeDir;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpco.octreeDir = url + \"/../\" + data.octreeDir;\n\t\t\t}\n\n\t\t\tpco.spacing = data.spacing;\n\t\t\tpco.hierarchyStepSize = data.hierarchyStepSize;\n\t\t\tpco.pointAttributes = data.pointAttributes;\n\n\t\t\tvar min = new THREE.Vector3(data.boundingBox.lx, data.boundingBox.ly, data.boundingBox.lz);\n\t\t\tvar max = new THREE.Vector3(data.boundingBox.ux, data.boundingBox.uy, data.boundingBox.uz);\n\t\t\tvar boundingBox = new THREE.Box3(min, max);\n\t\t\tvar tightBoundingBox = boundingBox.clone();\n\n\t\t\tif(data.tightBoundingBox)\n\t\t\t{\n\t\t\t\ttightBoundingBox.min.copy(new THREE.Vector3(data.tightBoundingBox.lx, data.tightBoundingBox.ly, data.tightBoundingBox.lz));\n\t\t\t\ttightBoundingBox.max.copy(new THREE.Vector3(data.tightBoundingBox.ux, data.tightBoundingBox.uy, data.tightBoundingBox.uz));\n\t\t\t}\n\n\t\t\tvar offset = min.clone();\n\n\t\t\tboundingBox.min.sub(offset);\n\t\t\tboundingBox.max.sub(offset);\n\n\t\t\ttightBoundingBox.min.sub(offset);\n\t\t\ttightBoundingBox.max.sub(offset);\n\n\t\t\tpco.projection = data.projection;\n\t\t\tpco.boundingBox = boundingBox;\n\t\t\tpco.tightBoundingBox = tightBoundingBox;\n\t\t\tpco.boundingSphere = boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\tpco.tightBoundingSphere = tightBoundingBox.getBoundingSphere(new THREE.Sphere());\n\t\t\tpco.offset = offset;\n\n\t\t\t//Select the appropiate loader\n\t\t\tif(data.pointAttributes === \"LAS\" || data.pointAttributes === \"LAZ\")\n\t\t\t{\n\t\t\t\tpco.loader = new LASLAZLoader(data.version);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpco.loader = new BinaryLoader(data.version, boundingBox, data.scale);\n\t\t\t\tpco.pointAttributes = new PointAttributes(pco.pointAttributes);\n\t\t\t}\n\n\t\t\tvar nodes = {};\n\t\t\tvar name = \"r\";\n\n\t\t\tvar root = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\troot.level = 0;\n\t\t\troot.hasChildren = true;\n\t\t\troot.spacing = pco.spacing;\n\t\t\troot.numPoints = version.upTo(\"1.5\") ? data.hierarchy[0][1] : 0;\n\n\t\t\tpco.root = root;\n\t\t\tpco.root.load();\n\t\t\tnodes[name] = root;\n\n\t\t\t//Load remaining hierarchy\n\t\t\tif(version.upTo(\"1.4\"))\n\t\t\t{\n\t\t\t\tfor(var i = 1; i < data.hierarchy.length; i++)\n\t\t\t\t{\n\t\t\t\t\tvar name = data.hierarchy[i][0];\n\t\t\t\t\tvar numPoints = data.hierarchy[i][1];\n\t\t\t\t\tvar index = parseInt(name.charAt(name.length - 1));\n\t\t\t\t\tvar parentName = name.substring(0, name.length - 1);\n\t\t\t\t\tvar parentNode = nodes[parentName];\n\t\t\t\t\tvar level = name.length - 1;\n\t\t\t\t\tvar boundingBox = POCLoader.createChildAABB(parentNode.boundingBox, index);\n\n\t\t\t\t\tvar node = new PointCloudOctreeGeometryNode(name, pco, boundingBox);\n\t\t\t\t\tnode.level = level;\n\t\t\t\t\tnode.numPoints = numPoints;\n\t\t\t\t\tnode.spacing = pco.spacing / Math.pow(2, level);\n\t\t\t\t\tparentNode.addChild(node);\n\t\t\t\t\tnodes[name] = node;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpco.nodes = nodes;\n\n\t\t\tcallback(pco);\n\t\t};\n\n\t\txhr.onerror = function(event)\n\t\t{\n\t\t\tGlobal.numNodesLoading--;\n\t\t\tconsole.log(\"Potree: loading file failed.\", url, event);\n\t\t\tcallback();\n\t\t};\n\n\t\txhr.send(null);\n\t}\n\n\tstatic loadPointAttributes(mno)\n\t{\n\t\tvar fpa = mno.pointAttributes;\n\t\tvar pa = new PointAttributes();\n\n\t\tfor(var i = 0; i < fpa.length; i++)\n\t\t{\n\t\t\tpa.add(PointAttribute[fpa[i]]);\n\t\t}\n\n\t\treturn pa;\n\t}\n\n\tstatic createChildAABB(aabb, index)\n\t{\n\t\tvar min = aabb.min.clone();\n\t\tvar max = aabb.max.clone();\n\t\tvar size = new THREE.Vector3().subVectors(max, min);\n\n\t\tif((index & 0b0001) > 0)\n\t\t{\n\t\t\tmin.z += size.z / 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmax.z -= size.z / 2;\n\t\t}\n\n\t\tif((index & 0b0010) > 0)\n\t\t{\n\t\t\tmin.y += size.y / 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmax.y -= size.y / 2;\n\t\t}\n\n\t\tif((index & 0b0100) > 0)\n\t\t{\n\t\t\tmin.x += size.x / 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmax.x -= size.x / 2;\n\t\t}\n\n\t\treturn new THREE.Box3(min, max);\n\t}\n}\n\nexport {POCLoader};","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {Global} from \"../../Global.js\";\nimport {WorkerManager} from \"../../utils/WorkerManager.js\";\nimport {XHRFactory} from \"../../XHRFactory.js\";\n\nclass EptBinaryLoader\n{\n\tload(node)\n\t{\n\t\tif(node.loaded) return;\n\n\t\tvar url = node.url() + \".bin\";\n\t\t\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n\t\txhr.onreadystatechange = () =>\n\t\t{\n\t\t\tif(xhr.readyState === 4)\n\t\t\t{\n\t\t\t\tif(xhr.status === 200)\n\t\t\t\t{\n\t\t\t\t\tvar buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.log(\"Failed \" + url + \": \" + xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttry\n\t\t{\n\t\t\txhr.send(null);\n\t\t}\n\t\tcatch (e)\n\t\t{\n\t\t\tconsole.log(\"Failed request: \" + e);\n\t\t}\n\t}\n\n\tparse(node, buffer)\n\t{\n\t\tvar worker = Global.workerPool.getWorker(WorkerManager.EPT_BINARY_DECODER);\n\n\t\tworker.onmessage = function(e)\n\t\t{\n\t\t\tvar g = new THREE.BufferGeometry();\n\t\t\tvar numPoints = e.data.numPoints;\n\n\t\t\tvar position = new Float32Array(e.data.position);\n\t\t\tg.setAttribute(\"position\", new THREE.BufferAttribute(position, 3));\n\n\t\t\tvar indices = new Uint8Array(e.data.indices);\n\t\t\tg.setAttribute(\"indices\", new THREE.BufferAttribute(indices, 4));\n\n\t\t\tif(e.data.color)\n\t\t\t{\n\t\t\t\tvar color = new Uint8Array(e.data.color);\n\t\t\t\tg.setAttribute(\"color\", new THREE.BufferAttribute(color, 4, true));\n\t\t\t}\n\t\t\tif(e.data.intensity)\n\t\t\t{\n\t\t\t\tvar intensity = new Float32Array(e.data.intensity);\n\t\t\t\tg.setAttribute(\"intensity\", new THREE.BufferAttribute(intensity, 1));\n\t\t\t}\n\t\t\tif(e.data.classification)\n\t\t\t{\n\t\t\t\tvar classification = new Uint8Array(e.data.classification);\n\t\t\t\tg.setAttribute(\"classification\", new THREE.BufferAttribute(classification, 1));\n\t\t\t}\n\t\t\tif(e.data.returnNumber)\n\t\t\t{\n\t\t\t\tvar returnNumber = new Uint8Array(e.data.returnNumber);\n\t\t\t\tg.setAttribute(\"returnNumber\", new THREE.BufferAttribute(returnNumber, 1));\n\t\t\t}\n\t\t\tif(e.data.numberOfReturns)\n\t\t\t{\n\t\t\t\tvar numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\t\tg.setAttribute(\"numberOfReturns\", new THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\t}\n\t\t\tif(e.data.pointSourceId)\n\t\t\t{\n\t\t\t\tvar pointSourceId = new Uint16Array(e.data.pointSourceId);\n\t\t\t\tg.setAttribute(\"pointSourceID\", new THREE.BufferAttribute(pointSourceId, 1));\n\t\t\t}\n\n\t\t\tg.attributes.indices.normalized = true;\n\n\t\t\tvar tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tnode.doneLoading(g, tightBoundingBox, numPoints, new THREE.Vector3(...e.data.mean));\n\n\t\t\tGlobal.workerPool.returnWorker(WorkerManager.EPT_BINARY_DECODER, worker);\n\t\t};\n\n\t\tvar toArray = (v) => [v.x, v.y, v.z];\n\t\tvar message = {\n\t\t\tbuffer: buffer,\n\t\t\tschema: node.ept.schema,\n\t\t\tscale: node.ept.eptScale,\n\t\t\toffset: node.ept.eptOffset,\n\t\t\tmins: toArray(node.key.b.min)\n\t\t};\n\n\t\tworker.postMessage(message, [message.buffer]);\n\t}\n};\n\nexport {EptBinaryLoader};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {Global} from \"../../Global.js\";\nimport {LASFile, LASDecoder} from \"../LASLoader.js\";\nimport {WorkerManager} from \"../../utils/WorkerManager.js\";\nimport {XHRFactory} from \"../../XHRFactory.js\";\n\n/**\n * laslaz code taken and adapted from plas.io js-laslaz\n *\thttp://plas.io/\n *\thttps://github.com/verma/plasio\n *\n * Thanks to Uday Verma and Howard Butler\n *\n */\nclass EptLaszipLoader\n{\n\tload(node)\n\t{\n\t\tif(node.loaded)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar url = node.url() + \".laz\";\n\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n\t\txhr.onreadystatechange = () =>\n\t\t{\n\t\t\tif(xhr.readyState === 4)\n\t\t\t{\n\t\t\t\tif(xhr.status === 200)\n\t\t\t\t{\n\t\t\t\t\tvar buffer = xhr.response;\n\t\t\t\t\tthis.parse(node, buffer);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.log(\"Failed \" + url + \": \" + xhr.status);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.send(null);\n\t}\n\n\tparse(node, buffer)\n\t{\n\t\tvar lf = new LASFile(buffer);\n\t\tvar handler = new EptLazBatcher(node);\n\n\t\tlf.open()\n\t\t.then(() =>\n\t\t{\n\t\t\tlf.isOpen = true;\n\t\t\treturn lf.getHeader();\n\t\t})\n\t\t.then((header) =>\n\t\t{\n\t\t\tvar i = 0;\n\t\t\tvar np = header.pointsCount;\n\n\t\t\tvar toArray = (v) => [v.x, v.y, v.z];\n\t\t\tvar mins = toArray(node.key.b.min);\n\t\t\tvar maxs = toArray(node.key.b.max);\n\n\t\t\tvar read = () =>\n\t\t\t{\n\t\t\t\tvar p = lf.readData(1000000, 0, 1);\n\t\t\t\treturn p.then(function (data)\n\t\t\t\t{\n\t\t\t\t\tvar d = new LASDecoder(\n\t\t\t\t\t\t\tdata.buffer,\n\t\t\t\t\t\t\theader.pointsFormatId,\n\t\t\t\t\t\t\theader.pointsStructSize,\n\t\t\t\t\t\t\tdata.count,\n\t\t\t\t\t\t\theader.scale,\n\t\t\t\t\t\t\theader.offset,\n\t\t\t\t\t\t\tmins,\n\t\t\t\t\t\t\tmaxs);\n\t\t\t\t\td.extraBytes = header.extraBytes;\n\t\t\t\t\td.pointsFormatId = header.pointsFormatId;\n\t\t\t\t\thandler.push(d);\n\n\t\t\t\t\ti += data.count;\n\n\t\t\t\t\tif(data.hasMoreData)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn read();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\theader.totalRead = i;\n\t\t\t\t\t\theader.versionAsString = lf.versionAsString;\n\t\t\t\t\t\theader.isCompressed = lf.isCompressed;\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\n\t\t\treturn read();\n\t\t})\n\t\t.then(() => lf.close())\n\t\t.then(() => lf.isOpen = false)\n\t\t.catch((err) =>\n\t\t{\n\t\t\tconsole.log(\"Error reading LAZ:\", err);\n\t\t\tif(lf.isOpen)\n\t\t\t{\n\t\t\t\tlf.close().then(() =>\n\t\t\t\t{\n\t\t\t\t\tlf.isOpen = false;\n\t\t\t\t\tthrow err;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse throw err;\n\t\t});\n\t}\n};\n\nclass EptLazBatcher\n{\n\tconstructor(node)\n\t{\n\t\tthis.node = node;\n\t}\n\n\tpush(las)\n\t{\n\t\tvar worker = Global.workerPool.getWorker(WorkerManager.EPT_LAS_ZIP_DECODER);\n\n\t\tworker.onmessage = (e) =>\n\t\t{\n\t\t\tvar g = new THREE.BufferGeometry();\n\t\t\tvar numPoints = las.pointsCount;\n\n\t\t\tvar positions = new Float32Array(e.data.position);\n\t\t\tvar colors = new Uint8Array(e.data.color);\n\n\t\t\tvar intensities = new Float32Array(e.data.intensity);\n\t\t\tvar classifications = new Uint8Array(e.data.classification);\n\t\t\tvar returnNumbers = new Uint8Array(e.data.returnNumber);\n\t\t\tvar numberOfReturns = new Uint8Array(e.data.numberOfReturns);\n\t\t\tvar pointSourceIDs = new Uint16Array(e.data.pointSourceID);\n\t\t\tvar indices = new Uint8Array(e.data.indices);\n\n\t\t\tg.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n\t\t\tg.setAttribute(\"color\", new THREE.BufferAttribute(colors, 4, true));\n\t\t\tg.setAttribute(\"intensity\", new THREE.BufferAttribute(intensities, 1));\n\t\t\tg.setAttribute(\"classification\", new THREE.BufferAttribute(classifications, 1));\n\t\t\tg.setAttribute(\"returnNumber\", new THREE.BufferAttribute(returnNumbers, 1));\n\t\t\tg.setAttribute(\"numberOfReturns\", new THREE.BufferAttribute(numberOfReturns, 1));\n\t\t\tg.setAttribute(\"pointSourceID\", new THREE.BufferAttribute(pointSourceIDs, 1));\n\t\t\tg.setAttribute(\"indices\", new THREE.BufferAttribute(indices, 4));\n\t\t\tg.attributes.indices.normalized = true;\n\n\t\t\tvar tightBoundingBox = new THREE.Box3(\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.min),\n\t\t\t\tnew THREE.Vector3().fromArray(e.data.tightBoundingBox.max)\n\t\t\t);\n\n\t\t\tthis.node.doneLoading(g, tightBoundingBox, numPoints, new THREE.Vector3(...e.data.mean));\n\n\t\t\tGlobal.workerPool.returnWorker(WorkerManager.EPT_LAS_ZIP_DECODER, worker);\n\t\t};\n\n\t\tvar message = {\n\t\t\tbuffer: las.arrayb,\n\t\t\tnumPoints: las.pointsCount,\n\t\t\tpointSize: las.pointSize,\n\t\t\tpointFormatID: las.pointsFormatId,\n\t\t\tscale: las.scale,\n\t\t\toffset: las.offset,\n\t\t\tmins: las.mins,\n\t\t\tmaxs: las.maxs\n\t\t};\n\n\t\tworker.postMessage(message, [message.buffer]);\n\t};\n};\n\nexport {EptLaszipLoader, EptLazBatcher};\n","\nimport * as THREE from 'three';\n\nimport {EptBinaryLoader} from \"../../loaders/ept/EptBinaryLoader\";\nimport {EptLaszipLoader} from \"../../loaders/ept/EptLaszipLoader\";\nimport {VersionUtils} from \"../../utils/VersionUtils.js\";\nimport {PointCloudTreeNode} from \"../PointCloudTree.js\";\nimport {Global} from \"../../Global.js\";\nimport {XHRFactory} from \"../../XHRFactory.js\";\n\nclass Utils\n{\n\tstatic toVector3(v, offset)\n\t{\n\t\treturn new THREE.Vector3().fromArray(v, offset || 0);\n\t}\n\n\tstatic toBox3(b)\n\t{\n\t\treturn new THREE.Box3(Utils.toVector3(b), Utils.toVector3(b, 3));\n\t};\n\n\tstatic findDim(schema, name)\n\t{\n\t\tvar dim = schema.find((dim) => dim.name == name);\n\t\tif(!dim) throw new Error(\"Failed to find \" + name + \" in schema\");\n\t\treturn dim;\n\t}\n\n\tstatic sphereFrom(b)\n\t{\n\t\treturn b.getBoundingSphere(new THREE.Sphere());\n\t}\n};\n\nclass PointCloudEptGeometry\n{\n\tconstructor(url, info)\n\t{\n\t\tlet version = info.version;\n\t\tlet schema = info.schema;\n\t\tlet bounds = info.bounds;\n\t\tlet boundsConforming = info.boundsConforming;\n\n\t\tlet xyz = [\n\t\t\tUtils.findDim(schema, \"X\"),\n\t\t\tUtils.findDim(schema, \"Y\"),\n\t\t\tUtils.findDim(schema, \"Z\")\n\t\t];\n\t\tlet scale = xyz.map((d) => d.scale || 1);\n\t\tlet offset = xyz.map((d) => d.offset || 0);\n\n\t\tthis.eptScale = Utils.toVector3(scale);\n\t\tthis.eptOffset = Utils.toVector3(offset);\n\n\t\tthis.url = url;\n\t\tthis.info = info;\n\t\tthis.type = \"ept\";\n\n\t\tthis.schema = schema;\n\t\tthis.span = info.span || info.ticks;\n\t\tthis.boundingBox = Utils.toBox3(bounds);\n\t\tthis.tightBoundingBox = Utils.toBox3(boundsConforming);\n\t\tthis.offset = Utils.toVector3([0, 0, 0]);\n\t\tthis.boundingSphere = Utils.sphereFrom(this.boundingBox);\n\t\tthis.tightBoundingSphere = Utils.sphereFrom(this.tightBoundingBox);\n\t\tthis.version = new VersionUtils(\"1.6\");\n\n\t\tthis.projection = null;\n\t\tthis.fallbackProjection = null;\n\n\t\tif(info.srs && info.srs.horizontal)\n\t\t{\n\t\t\tthis.projection = info.srs.authority + \":\" + info.srs.horizontal;\n\t\t}\n\n\t\tif(info.srs.wkt)\n\t\t{\n\t\t\tif(!this.projection) this.projection = info.srs.wkt;\n\t\t\telse this.fallbackProjection = info.srs.wkt;\n\t\t}\n\n\t\tthis.pointAttributes = \"LAZ\";\n\t\tthis.spacing =\n\t\t\t(this.boundingBox.max.x - this.boundingBox.min.x) / this.span;\n\n\t\tlet hierarchyType = info.hierarchyType || \"json\";\n\n\t\tlet dataType = info.dataType || \"laszip\";\n\t\tthis.loader = dataType == \"binary\" ? new EptBinaryLoader() : new EptLaszipLoader();\n\t}\n};\n\nclass EptKey\n{\n\tconstructor(ept, b, d, x, y, z)\n\t{\n\t\tthis.ept = ept;\n\t\tthis.b = b;\n\t\tthis.d = d;\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t}\n\n\tname()\n\t{\n\t\treturn this.d + \"-\" + this.x + \"-\" + this.y + \"-\" + this.z;\n\t}\n\n\tstep(a, b, c)\n\t{\n\t\tlet min = this.b.min.clone();\n\t\tlet max = this.b.max.clone();\n\t\tlet dst = new THREE.Vector3().subVectors(max, min);\n\n\t\tif(a) min.x += dst.x / 2;\n\t\telse max.x -= dst.x / 2;\n\n\t\tif(b) min.y += dst.y / 2;\n\t\telse max.y -= dst.y / 2;\n\n\t\tif(c) min.z += dst.z / 2;\n\t\telse max.z -= dst.z / 2;\n\n\t\treturn new EptKey(\n\t\t\t\tthis.ept,\n\t\t\t\tnew THREE.Box3(min, max),\n\t\t\t\tthis.d + 1,\n\t\t\t\tthis.x * 2 + a,\n\t\t\t\tthis.y * 2 + b,\n\t\t\t\tthis.z * 2 + c);\n\t}\n\n\tchildren()\n\t{\n\t\tvar result = [];\n\t\tfor (var a = 0; a < 2; ++a)\n\t\t{\n\t\t\tfor (var b = 0; b < 2; ++b)\n\t\t\t{\n\t\t\t\tfor (var c = 0; c < 2; ++c)\n\t\t\t\t{\n\t\t\t\t\tvar add = this.step(a, b, c).name();\n\t\t\t\t\tif(!result.includes(add)) result = result.concat(add);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\nclass PointCloudEptGeometryNode extends PointCloudTreeNode\n{\n\tconstructor(ept, b, d, x, y, z) {\n\t\tsuper();\n\n\t\tthis.ept = ept;\n\t\tthis.key = new EptKey(\n\t\t\t\tthis.ept,\n\t\t\t\tb || this.ept.boundingBox,\n\t\t\t\td || 0,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tz);\n\n\t\tthis.id = PointCloudEptGeometryNode.IDCount++;\n\t\tthis.geometry = null;\n\t\tthis.boundingBox = this.key.b;\n\t\tthis.tightBoundingBox = this.boundingBox;\n\t\tthis.spacing = this.ept.spacing / Math.pow(2, this.key.d);\n\t\tthis.boundingSphere = Utils.sphereFrom(this.boundingBox);\n\n\t\t// These are set during hierarchy loading.\n\t\tthis.hasChildren = false;\n\t\tthis.children = { };\n\t\tthis.numPoints = -1;\n\n\t\tthis.level = this.key.d;\n\t\tthis.loaded = false;\n\t\tthis.loading = false;\n\t\tthis.oneTimeDisposeHandlers = [];\n\n\t\tlet k = this.key;\n\t\tthis.name = this.toPotreeName(k.d, k.x, k.y, k.z);\n\t\tthis.index = parseInt(this.name.charAt(this.name.length - 1));\n\t}\n\n\tisGeometryNode(){return true;}\n\tgetLevel(){return this.level;}\n\tisTreeNode(){return false;}\n\tisLoaded(){return this.loaded;}\n\tgetBoundingSphere(){return this.boundingSphere;}\n\tgetBoundingBox(){return this.boundingBox;}\n\turl(){return this.ept.url + \"ept-data/\" + this.filename();}\n\tgetNumPoints(){return this.numPoints;}\n\tfilename(){return this.key.name();}\n\n\tgetChildren()\n\t{\n\t\tlet children = [];\n\n\t\tfor (let i = 0; i < 8; i++) {\n\t\t\tif(this.children[i]) {\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\taddChild(child)\n\t{\n\t\tthis.children[child.index] = child;\n\t\tchild.parent = this;\n\t}\n\n\tload()\n\t{\n\t\tif(this.loaded || this.loading || Global.numNodesLoading >= Global.maxNodesLoading)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.loading = true;\n\t\tGlobal.numNodesLoading++;\n\n\t\tif(this.numPoints === -1)\n\t\t{\n\t\t\tthis.loadHierarchy();\n\t\t}\n\t\tthis.loadPoints();\n\t}\n\n\tloadPoints()\n\t{\n\t\tthis.ept.loader.load(this);\n\t}\n\n\tasync loadHierarchy()\n\t{\n\t\tlet nodes = { };\n\t\tnodes[this.filename()] = this;\n\t\tthis.hasChildren = false;\n\n\t\tlet eptHierarchyFile = `${this.ept.url}ept-hierarchy/${this.filename()}.json`;\n\n\t\tlet response = await XHRFactory.fetch(eptHierarchyFile);\n\t\tlet hier = await response.json();\n\n\t\t// Since we want to traverse top-down, and 10 comes\n\t\t// lexicographically before 9 (for example), do a deep sort.\n\t\tvar keys = Object.keys(hier).sort((a, b) => {\n\t\t\tlet [da, xa, ya, za] = a.split(\"-\").map((n) => parseInt(n, 10));\n\t\t\tlet [db, xb, yb, zb] = b.split(\"-\").map((n) => parseInt(n, 10));\n\t\t\tif(da < db) return -1; if(da > db) return 1;\n\t\t\tif(xa < xb) return -1; if(xa > xb) return 1;\n\t\t\tif(ya < yb) return -1; if(ya > yb) return 1;\n\t\t\tif(za < zb) return -1; if(za > zb) return 1;\n\t\t\treturn 0;\n\t\t});\n\n\t\tkeys.forEach((v) => {\n\t\t\tlet [d, x, y, z] = v.split(\"-\").map((n) => parseInt(n, 10));\n\t\t\tlet a = x & 1, b = y & 1, c = z & 1;\n\t\t\tlet parentName =\n\t\t\t\t(d - 1) + \"-\" + (x >> 1) + \"-\" + (y >> 1) + \"-\" + (z >> 1);\n\n\t\t\tlet parentNode = nodes[parentName];\n\t\t\tif(!parentNode) return;\n\t\t\tparentNode.hasChildren = true;\n\n\t\t\tlet key = parentNode.key.step(a, b, c);\n\n\t\t\tlet node = new PointCloudEptGeometryNode(\n\t\t\t\t\tthis.ept,\n\t\t\t\t\tkey.b,\n\t\t\t\t\tkey.d,\n\t\t\t\t\tkey.x,\n\t\t\t\t\tkey.y,\n\t\t\t\t\tkey.z);\n\n\t\t\tnode.level = d;\n\t\t\tnode.numPoints = hier[v];\n\n\t\t\tparentNode.addChild(node);\n\t\t\tnodes[key.name()] = node;\n\t\t});\n\t}\n\n\tdoneLoading(bufferGeometry, tightBoundingBox, np, mean)\n\t{\n\t\tbufferGeometry.boundingBox = this.boundingBox;\n\t\tthis.geometry = bufferGeometry;\n\t\tthis.tightBoundingBox = tightBoundingBox;\n\t\tthis.numPoints = np;\n\t\tthis.mean = mean;\n\t\tthis.loaded = true;\n\t\tthis.loading = false;\n\t\tGlobal.numNodesLoading--;\n\t}\n\n\ttoPotreeName(d, x, y, z)\n\t{\n\t\tvar name = \"r\";\n\n\t\tfor (var i = 0; i < d; ++i)\n\t\t{\n\t\t\tvar shift = d - i - 1;\n\t\t\tvar mask = 1 << shift;\n\t\t\tvar step = 0;\n\n\t\t\tif(x & mask) step += 4;\n\t\t\tif(y & mask) step += 2;\n\t\t\tif(z & mask) step += 1;\n\n\t\t\tname += step;\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tdispose()\n\t{\n\t\tif(this.geometry && this.parent != null)\n\t\t{\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.geometry = null;\n\t\t\tthis.loaded = false;\n\n\t\t\t// this.dispatchEvent( { type: \"dispose\" } );\n\t\t\tfor (let i = 0; i < this.oneTimeDisposeHandlers.length; i++)\n\t\t\t{\n\t\t\t\tlet handler = this.oneTimeDisposeHandlers[i];\n\t\t\t\thandler();\n\t\t\t}\n\t\t\t\n\t\t\tthis.oneTimeDisposeHandlers = [];\n\t\t}\n\t}\n}\n\nPointCloudEptGeometryNode.IDCount = 0;\n\nexport {PointCloudEptGeometry, PointCloudEptGeometryNode, EptKey};\n","\"use strict\";\n\nimport {PointCloudEptGeometry, PointCloudEptGeometryNode} from \"../pointcloud/geometries/PointCloudEptGeometry.js\";\nimport { XHRFactory } from \"../XHRFactory.js\";\n\n/**\n * @author Connor Manning\n */\nclass EptLoader\n{\n\tstatic async load(file, callback)\n\t{\n\t\tvar response = await XHRFactory.fetch(file);\n\t\tvar json = await response.json();\n\t\tvar url = file.substr(0, file.lastIndexOf(\"ept.json\"));\n\n\t\tvar geometry = new PointCloudEptGeometry(url, json);\n\t\tvar root = new PointCloudEptGeometryNode(geometry);\n\t\tgeometry.root = root;\n\t\tgeometry.root.load();\n\n\t\tcallback(geometry);\n\t}\n};\n\nexport {EptLoader};\n","\"use strict\";\n\nimport * as THREE from 'three';\nclass HelperUtils\n{\n\t/**\n\t * Craete a new data texture with a solid color.\n\t */\n\tstatic generateDataTexture(width, height, color)\n\t{\n\t\tvar size = width * height;\n\t\tvar data = new Uint8Array(4 * width * height);\n\n\t\tvar r = Math.floor(color.r * 255);\n\t\tvar g = Math.floor(color.g * 255);\n\t\tvar b = Math.floor(color.b * 255);\n\n\t\tfor(var i = 0; i < size; i++)\n\t\t{\n\t\t\tdata[i * 3] = r;\n\t\t\tdata[i * 3 + 1] = g;\n\t\t\tdata[i * 3 + 2] = b;\n\t\t}\n\n\t\tvar texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat);\n\t\ttexture.needsUpdate = true;\n\t\ttexture.magFilter = THREE.NearestFilter;\n\n\t\treturn texture;\n\t};\n\n\t/**\n\t * Compute a transformed bouding box from an original box and a transform matrix.\n\t */\n\tstatic computeTransformedBoundingBox(box, transform)\n\t{\n\t\tvar vertices = [\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.min.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.max.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.min.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.min.x, box.max.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.max.y, box.min.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.min.y, box.max.z).applyMatrix4(transform),\n\t\t\tnew THREE.Vector3(box.max.x, box.max.y, box.max.z).applyMatrix4(transform)\n\t\t];\n\n\t\tvar boundingBox = new THREE.Box3();\n\t\tboundingBox.setFromPoints(vertices);\n\t\t\n\t\treturn boundingBox;\n\t};\n};\n\nexport {HelperUtils};","\"use strict\";\n\nimport * as THREE from 'three';\n\n//\n//to get a ready to use gradient array from a chroma.js gradient:\n//http://gka.github.io/chroma.js/\n//\n//var stops = [];\n//for(var i = 0; i <= 10; i++){\n//\tvar range = chroma.scale([\"yellow\", \"navy\"]).mode(\"lch\").domain([10,0])(i)._rgb\n//\t\t.slice(0, 3)\n//\t\t.map(v => (v / 255).toFixed(4))\n//\t\t.join(\", \");\n//\n//\tvar line = `[${i / 10}, new THREE.Color(${range})],`;\n//\n//\tstops.push(line);\n//}\n//stops.join(\"\\n\");\n\n//to get a ready to use gradient array from matplotlib:\n//import matplotlib.pyplot as plt\n//import matplotlib.colors as colors\n//\n//norm = colors.Normalize(vmin=0,vmax=1)\n//cmap = plt.cm.viridis\n//\n//for i in range(0,11):\n//   u = i / 10\n//   rgb = cmap(norm(u))[0:3]\n//   rgb = [\"{0:.3f}\".format(v) for v in rgb]\n//   rgb = \"[\" + str(u) + \", new THREE.Color(\" +  \", \".join(rgb) + \")],\"\n//   print(rgb)\n\nvar Gradients = {\n\tRAINBOW: [\n\t\t[0, new THREE.Color(0.278, 0, 0.714)],\n\t\t[1 / 6, new THREE.Color(0, 0, 1)],\n\t\t[2 / 6, new THREE.Color(0, 1, 1)],\n\t\t[3 / 6, new THREE.Color(0, 1, 0)],\n\t\t[4 / 6, new THREE.Color(1, 1, 0)],\n\t\t[5 / 6, new THREE.Color(1, 0.64, 0)],\n\t\t[1, new THREE.Color(1, 0, 0)]\n\t],\n\t//From chroma spectral http://gka.github.io/chroma.js/\n\tSPECTRAL: [\n\t\t[0, new THREE.Color(0.3686, 0.3098, 0.6353)],\n\t\t[0.1, new THREE.Color(0.1961, 0.5333, 0.7412)],\n\t\t[0.2, new THREE.Color(0.4000, 0.7608, 0.6471)],\n\t\t[0.3, new THREE.Color(0.6706, 0.8667, 0.6431)],\n\t\t[0.4, new THREE.Color(0.9020, 0.9608, 0.5961)],\n\t\t[0.5, new THREE.Color(1.0000, 1.0000, 0.7490)],\n\t\t[0.6, new THREE.Color(0.9961, 0.8784, 0.5451)],\n\t\t[0.7, new THREE.Color(0.9922, 0.6824, 0.3804)],\n\t\t[0.8, new THREE.Color(0.9569, 0.4275, 0.2627)],\n\t\t[0.9, new THREE.Color(0.8353, 0.2431, 0.3098)],\n\t\t[1, new THREE.Color(0.6196, 0.0039, 0.2588)]\n\t],\n\tPLASMA: [\n\t\t[0.0, new THREE.Color(0.241, 0.015, 0.610)],\n\t\t[0.1, new THREE.Color(0.387, 0.001, 0.654)],\n\t\t[0.2, new THREE.Color(0.524, 0.025, 0.653)],\n\t\t[0.3, new THREE.Color(0.651, 0.125, 0.596)],\n\t\t[0.4, new THREE.Color(0.752, 0.227, 0.513)],\n\t\t[0.5, new THREE.Color(0.837, 0.329, 0.431)],\n\t\t[0.6, new THREE.Color(0.907, 0.435, 0.353)],\n\t\t[0.7, new THREE.Color(0.963, 0.554, 0.272)],\n\t\t[0.8, new THREE.Color(0.992, 0.681, 0.195)],\n\t\t[0.9, new THREE.Color(0.987, 0.822, 0.144)],\n\t\t[1.0, new THREE.Color(0.940, 0.975, 0.131)]\n\t],\n\tYELLOW_GREEN: [\n\t\t[0, new THREE.Color(0.1647, 0.2824, 0.3451)],\n\t\t[0.1, new THREE.Color(0.1338, 0.3555, 0.4227)],\n\t\t[0.2, new THREE.Color(0.0610, 0.4319, 0.4864)],\n\t\t[0.3, new THREE.Color(0.0000, 0.5099, 0.5319)],\n\t\t[0.4, new THREE.Color(0.0000, 0.5881, 0.5569)],\n\t\t[0.5, new THREE.Color(0.1370, 0.6650, 0.5614)],\n\t\t[0.6, new THREE.Color(0.2906, 0.7395, 0.5477)],\n\t\t[0.7, new THREE.Color(0.4453, 0.8099, 0.5201)],\n\t\t[0.8, new THREE.Color(0.6102, 0.8748, 0.4850)],\n\t\t[0.9, new THREE.Color(0.7883, 0.9323, 0.4514)],\n\t\t[1, new THREE.Color(0.9804, 0.9804, 0.4314)]\n\t],\n\tVIRIDIS: [\n\t\t[0.0, new THREE.Color(0.267, 0.005, 0.329)],\n\t\t[0.1, new THREE.Color(0.283, 0.141, 0.458)],\n\t\t[0.2, new THREE.Color(0.254, 0.265, 0.530)],\n\t\t[0.3, new THREE.Color(0.207, 0.372, 0.553)],\n\t\t[0.4, new THREE.Color(0.164, 0.471, 0.558)],\n\t\t[0.5, new THREE.Color(0.128, 0.567, 0.551)],\n\t\t[0.6, new THREE.Color(0.135, 0.659, 0.518)],\n\t\t[0.7, new THREE.Color(0.267, 0.749, 0.441)],\n\t\t[0.8, new THREE.Color(0.478, 0.821, 0.318)],\n\t\t[0.9, new THREE.Color(0.741, 0.873, 0.150)],\n\t\t[1.0, new THREE.Color(0.993, 0.906, 0.144)]\n\t],\n\tINFERNO: [\n\t\t[0.0, new THREE.Color(0.077, 0.042, 0.206)],\n\t\t[0.1, new THREE.Color(0.225, 0.036, 0.388)],\n\t\t[0.2, new THREE.Color(0.373, 0.074, 0.432)],\n\t\t[0.3, new THREE.Color(0.522, 0.128, 0.420)],\n\t\t[0.4, new THREE.Color(0.665, 0.182, 0.370)],\n\t\t[0.5, new THREE.Color(0.797, 0.255, 0.287)],\n\t\t[0.6, new THREE.Color(0.902, 0.364, 0.184)],\n\t\t[0.7, new THREE.Color(0.969, 0.516, 0.063)],\n\t\t[0.8, new THREE.Color(0.988, 0.683, 0.072)],\n\t\t[0.9, new THREE.Color(0.961, 0.859, 0.298)],\n\t\t[1.0, new THREE.Color(0.988, 0.998, 0.645)]\n\t],\n\tGRAYSCALE: [\n\t\t[0, new THREE.Color(0, 0, 0)],\n\t\t[1, new THREE.Color(1, 1, 1)]\n\t]\n};\n\nexport {Gradients};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nvar Shaders = {};\n\n//pointcloud.vs\nShaders.vertex = `\nprecision highp float;\nprecision highp int;\n\n` + THREE.ShaderChunk.common + `\n` + THREE.ShaderChunk.logdepthbuf_pars_vertex + `\n\n// attribute vec3 position;\n// attribute vec3 color;\nattribute float intensity;\nattribute float classification;\nattribute float returnNumber;\nattribute float numberOfReturns;\nattribute float pointSourceID;\nattribute vec4 indices;\nattribute float spacing;\n\n// uniform mat4 modelMatrix;\n// uniform mat4 modelViewMatrix;\n// uniform mat4 projectionMatrix;\n// uniform mat4 viewMatrix;\nuniform mat4 uViewInv;\n\nuniform float uScreenWidth;\nuniform float uScreenHeight;\n\nuniform float fov;\nuniform float near;\nuniform float far;\n\nuniform bool uDebug;\n\nuniform float size;\nuniform float minSize;\nuniform float maxSize;\n\nuniform float uPCIndex;\nuniform float uOctreeSpacing;\nuniform float uNodeSpacing;\nuniform float uOctreeSize;\nuniform vec3 uBBSize;\nuniform float uLevel;\nuniform float uVNStart;\nuniform bool uIsLeafNode;\n\nuniform vec3 uColor;\nuniform float uOpacity;\n\nuniform vec2 elevationRange;\nuniform vec2 intensityRange;\nuniform float intensityGamma;\nuniform float intensityContrast;\nuniform float intensityBrightness;\nuniform float rgbGamma;\n// uniform float rgbContrast;\nuniform float rgbBrightness;\nuniform float uTransition;\nuniform float wRGB;\nuniform float wIntensity;\nuniform float wElevation;\nuniform float wClassification;\nuniform float wReturnNumber;\nuniform float wSourceID;\n\nuniform sampler2D visibleNodes;\nuniform sampler2D gradient;\nuniform sampler2D classificationLUT;\n\n#if defined(num_clipplanes) && num_clipplanes > 0 \n\nuniform vec4 clipPlanes[num_clipplanes];\n\nbool isClipped(vec3 point) {\n\tbool clipped = false;\n\tfor (int i = 0; i < num_clipplanes; ++i) {\n\t\tvec4 p = clipPlanes[i];\n\t\tclipped = clipped || dot(-point, p.xyz) > p.w;\n\t}\n\treturn clipped;\n}\n\n#else\n\nbool isClipped(vec3 point) {\n\treturn false;\n}\n\n#endif\n\nvarying vec3 vColor;\nvarying float vLogDepth;\nvarying vec3 vViewPosition;\nvarying float vRadius;\nvarying float vPointSize;\n\n// The round() function is not available in WebGL 1.0\nfloat myRound(float number)\n{\n\treturn floor(number + 0.5);\n}\n\n//---------------------\n//OCTREE\n//---------------------\n\n#if (defined(adaptive_point_size) || defined(color_type_lod)) && defined(tree_type_octree)\n\t/**\n\t * number of 1-bits up to inclusive index position\n\t * number is treated as if it were an integer in the range 0-255\n\t */\n\tint numberOfOnes(int number, int index)\n\t{\n\t\tint numOnes = 0;\n\t\tint tmp = 128;\n\n\t\tfor(int i = 7; i >= 0; i--)\n\t\t{\n\t\t\tif(number >= tmp)\n\t\t\t{\n\t\t\t\tnumber = number - tmp;\n\n\t\t\t\tif(i <= index)\n\t\t\t\t{\n\t\t\t\t\tnumOnes++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\ttmp = tmp / 2;\n\t\t}\n\n\t\treturn numOnes;\n\t}\n\n\t/**\n\t * checks whether the bit at index is 1\n\t * number is treated as if it were an integer in the range 0-255\n\t */\n\tbool isBitSet(int number, int index)\n\t{\n\t\t//weird multi else if due to lack of proper array, int and bitwise support in WebGL 1.0\n\t\tint powi = 1;\n\n\t\tif(index == 0)\n\t\t{\n\t\t\tpowi = 1;\n\t\t}\n\t\telse if(index == 1)\n\t\t{\n\t\t\tpowi = 2;\n\t\t}\n\t\telse if(index == 2)\n\t\t{\n\t\t\tpowi = 4;\n\t\t}\n\t\telse if(index == 3)\n\t\t{\n\t\t\tpowi = 8;\n\t\t}\n\t\telse if(index == 4)\n\t\t{\n\t\t\tpowi = 16;\n\t\t}\n\t\telse if(index == 5)\n\t\t{\n\t\t\tpowi = 32;\n\t\t}\n\t\telse if(index == 6)\n\t\t{\n\t\t\tpowi = 64;\n\t\t}\n\t\telse if(index == 7)\n\t\t{\n\t\t\tpowi = 128;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tint ndp = number / powi;\n\n\t\treturn mod(float(ndp), 2.0) != 0.0;\n\t}\n\n\t/**\n\t * find the LOD at the point position\n\t */\n\tfloat getLOD()\n\t{\n\t\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\t\tint iOffset = int(uVNStart);\n\t\tfloat depth = uLevel;\n\n\t\tfor(float i = 0.0; i <= 30.0; i++)\n\t\t{\n\t\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\t\n\t\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\t\tindex3d = floor(index3d + 0.5);\n\t\t\tint index = int(myRound(4.0 * index3d.x + 2.0 * index3d.y + index3d.z));\n\n\t\t\tvec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0));\n\t\t\tint mask = int(myRound(value.r * 255.0));\n\n\t\t\tif(isBitSet(mask, index))\n\t\t\t{\n\t\t\t\t//there are more visible child nodes at this position\n\t\t\t\tint advanceG = int(myRound(value.g * 255.0)) * 256;\n\t\t\t\tint advanceB = int(myRound(value.b * 255.0));\n\t\t\t\tint advanceChild = numberOfOnes(mask, index - 1);\n\t\t\t\tint advance = advanceG + advanceB + advanceChild;\n\n\t\t\t\tiOffset = iOffset + advance;\n\t\t\t\t\n\t\t\t\tdepth++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//no more visible child nodes at this position\n\t\t\t\treturn value.a * 255.0;\n\t\t\t\t//return depth;\n\t\t\t}\n\t\t\t\n\t\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t\t}\n\t\t\t\n\t\treturn depth;\n\t}\n\n\tfloat getSpacing()\n\t{\n\t\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\t\tint iOffset = int(uVNStart);\n\t\tfloat depth = uLevel;\n\t\tfloat spacing = uNodeSpacing;\n\n\t\tfor(float i = 0.0; i <= 30.0; i++)\n\t\t{\n\t\t\tfloat nodeSizeAtLevel = uOctreeSize / pow(2.0, i + uLevel + 0.0);\n\t\t\t\n\t\t\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\n\t\t\tindex3d = floor(index3d + 0.5);\n\t\t\tint index = int(myRound(4.0 * index3d.x + 2.0 * index3d.y + index3d.z));\n\n\t\t\tvec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0));\n\t\t\tint mask = int(myRound(value.r * 255.0));\n\t\t\tfloat spacingFactor = value.a;\n\n\t\t\tif(i > 0.0)\n\t\t\t{\n\t\t\t\tspacing = spacing / (255.0 * spacingFactor);\n\t\t\t}\n\t\t\t\n\t\t\tif(isBitSet(mask, index))\n\t\t\t{\n\t\t\t\t//there are more visible child nodes at this position\n\t\t\t\tint advanceG = int(myRound(value.g * 255.0)) * 256;\n\t\t\t\tint advanceB = int(myRound(value.b * 255.0));\n\t\t\t\tint advanceChild = numberOfOnes(mask, index - 1);\n\t\t\t\tint advance = advanceG + advanceB + advanceChild;\n\n\t\t\t\tiOffset = iOffset + advance;\n\n\t\t\t\tdepth++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//no more visible child nodes at this position\n\t\t\t\treturn spacing;\n\t\t\t}\n\t\t\t\n\t\t\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\n\t\t}\n\t\t\t\n\t\treturn spacing;\n\t}\n\n\tfloat getPointSizeAttenuation()\n\t{\n\t\treturn pow(2.0, getLOD());\n\t}\n#endif\n\n//---------------------\n//KD-TREE\n//---------------------\n#if (defined(adaptive_point_size) || defined(color_type_lod)) && defined(tree_type_kdtree)\n\tfloat getLOD()\n\t{\n\t\tvec3 offset = vec3(0.0, 0.0, 0.0);\n\t\tfloat iOffset = 0.0;\n\t\tfloat depth = 0.0;\n\t\t\t\n\t\tvec3 size = uBBSize;\t\n\t\tvec3 pos = position;\n\t\t\t\n\t\tfor(float i = 0.0; i <= 1000.0; i++)\n\t\t{\n\t\t\tvec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0));\n\t\t\t\n\t\t\tint children = int(value.r * 255.0);\n\t\t\tfloat next = value.g * 255.0;\n\t\t\tint split = int(value.b * 255.0);\n\t\t\t\n\t\t\tif(next == 0.0)\n\t\t\t{\n\t\t\t \treturn depth;\n\t\t\t}\n\t\t\t\n\t\t\tvec3 splitv = vec3(0.0, 0.0, 0.0);\n\t\t\tif(split == 1)\n\t\t\t{\n\t\t\t\tsplitv.x = 1.0;\n\t\t\t}\n\t\t\telse if(split == 2)\n\t\t\t{\n\t\t\t \tsplitv.y = 1.0;\n\t\t\t}\n\t\t\telse if(split == 4)\n\t\t\t{\n\t\t\t \tsplitv.z = 1.0;\n\t\t\t}\n\t\t\t\n\t\t\tiOffset = iOffset + next;\n\t\t\t\n\t\t\tfloat factor = length(pos * splitv / size);\n\n\t\t\t//Left\n\t\t\tif(factor < 0.5)\n\t\t\t{\n\t\t\t\tif(children == 0 || children == 2)\n\t\t\t\t{\n\t\t\t\t\treturn depth;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//Right\n\t\t\telse\n\t\t\t{\n\t\t\t\tpos = pos - size * splitv * 0.5;\n\t\t\t\tif(children == 0 || children == 1)\n\t\t\t\t{\n\t\t\t\t\treturn depth;\n\t\t\t\t}\n\t\t\t\tif(children == 3)\n\t\t\t\t{\n\t\t\t\t\tiOffset = iOffset + 1.0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsize = size * ((1.0 - (splitv + 1.0) / 2.0) + 0.5);\n\t\t\tdepth++;\n\t\t}\n\t\t\t\n\t\treturn depth;\t\n\t}\n\n\tfloat getPointSizeAttenuation()\n\t{\n\t\treturn 0.5 * pow(1.3, getLOD());\n\t}\n#endif\n\n//formula adapted from: http://www.dfstudios.co.uk/articles/programming/image-programming-algorithms/image-processing-algorithms-part-5-contrast-adjustment/\nfloat getContrastFactor(float contrast)\n{\n\treturn (1.0158730158730156 * (contrast + 1.0)) / (1.0158730158730156 - contrast);\n}\n\nvec3 getRGB()\n{\n\tvec3 rgb = color;\n\t\n\trgb = pow(rgb, vec3(rgbGamma));\n\trgb = rgb + rgbBrightness;\n\trgb = clamp(rgb, 0.0, 1.0);\n\t\n\treturn rgb;\n}\n\nfloat getIntensity()\n{\n\tfloat w = (intensity - intensityRange.x) / (intensityRange.y - intensityRange.x);\n\tw = pow(w, intensityGamma);\n\tw = w + intensityBrightness;\n\tw = (w - 0.5) * getContrastFactor(intensityContrast) + 0.5;\n\tw = clamp(w, 0.0, 1.0);\n\n\treturn w;\n}\n\nvec3 getElevation()\n{\n\tvec4 world = modelMatrix * vec4( position, 1.0 );\n\tfloat w = (world.z - elevationRange.x) / (elevationRange.y - elevationRange.x);\n\treturn texture2D(gradient, vec2(w,1.0-w)).rgb;\n}\n\nvec4 getClassification()\n{\n\tvec2 uv = vec2(classification / 255.0, 0.5);\n\treturn texture2D(classificationLUT, uv);\n}\n\nvec3 getReturnNumber()\n{\n\tif(numberOfReturns == 1.0)\n\t{\n\t\treturn vec3(1.0, 1.0, 0.0);\n\t}\n\telse\n\t{\n\t\tif(returnNumber == 1.0)\n\t\t{\n\t\t\treturn vec3(1.0, 0.0, 0.0);\n\t\t}\n\t\telse if(returnNumber == numberOfReturns)\n\t\t{\n\t\t\treturn vec3(0.0, 0.0, 1.0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn vec3(0.0, 1.0, 0.0);\n\t\t}\n\t}\n}\n\nvec3 getSourceID()\n{\n\tfloat w = mod(pointSourceID, 10.0) / 10.0;\n\treturn texture2D(gradient, vec2(w,1.0 - w)).rgb;\n}\n\nvec3 getCompositeColor()\n{\n\tvec3 c;\n\tfloat w;\n\n\tc += wRGB * getRGB();\n\tw += wRGB;\n\t\n\tc += wIntensity * getIntensity() * vec3(1.0, 1.0, 1.0);\n\tw += wIntensity;\n\t\n\tc += wElevation * getElevation();\n\tw += wElevation;\n\t\n\tc += wReturnNumber * getReturnNumber();\n\tw += wReturnNumber;\n\t\n\tc += wSourceID * getSourceID();\n\tw += wSourceID;\n\t\n\tvec4 cl = wClassification * getClassification();\n    c += cl.a * cl.rgb;\n\tw += wClassification * cl.a;\n\n\tc = c / w;\n\t\n\tif(w == 0.0)\n\t{\n\t\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\n\t}\n\t\n\treturn c;\n}\n\nvec3 getColor()\n{\n\tvec3 color;\n\t\n\t#ifdef color_type_rgb\n\t\tcolor = getRGB();\n\t#elif defined color_type_height\n\t\tcolor = getElevation();\n\t#elif defined color_type_rgb_height\n\t\tvec3 cHeight = getElevation();\n\t\tcolor = (1.0 - uTransition) * getRGB() + uTransition * cHeight;\n\t#elif defined color_type_depth\n\t\tfloat linearDepth = gl_Position.w;\n\t\tfloat expDepth = (gl_Position.z / gl_Position.w) * 0.5 + 0.5;\n\t\tcolor = vec3(linearDepth, expDepth, 0.0);\n\t#elif defined color_type_intensity\n\t\tfloat w = getIntensity();\n\t\tcolor = vec3(w, w, w);\n\t#elif defined color_type_intensity_gradient\n\t\tfloat w = getIntensity();\n\t\tcolor = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t#elif defined color_type_color\n\t\tcolor = uColor;\n\t#elif defined color_type_lod\n\t\tfloat depth = getLOD();\n\t\tfloat w = depth / 10.0;\n\t\tcolor = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\t#elif defined color_type_point_index\n\t\tcolor = indices.rgb;\n\t#elif defined color_type_classification\n\t\tvec4 cl = getClassification(); \n\t\tcolor = cl.rgb;\n\t#elif defined color_type_return_number\n\t\tcolor = getReturnNumber();\n\t#elif defined color_type_source\n\t\tcolor = getSourceID();\n\t#elif defined color_type_normal\n\t\tcolor = (modelMatrix * vec4(normal, 0.0)).xyz;\n\t#elif defined color_type_phong\n\t\tcolor = color;\n\t#elif defined color_type_composite\n\t\tcolor = getCompositeColor();\n\t#endif\n\t\n\treturn color;\n}\n\nfloat getPointSize()\n{\n\tfloat pointSize = 1.0;\n\t\n\tfloat slope = tan(fov / 2.0);\n\tfloat projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z);\n\t\n\tfloat r = uOctreeSpacing * 1.7;\n\tvRadius = r;\n\n\t#if defined fixed_point_size\n\t\tpointSize = size;\n\t#elif defined attenuated_point_size\n\t\tpointSize = size * spacing * projFactor;\n\t#elif defined adaptive_point_size\n\t\tif(uIsLeafNode && false)\n\t\t{\n\t\t\tpointSize = size * spacing * projFactor;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();\n\t\t\tpointSize = worldSpaceSize * projFactor;\n\t\t}\n\t#endif\n\n\tpointSize = max(minSize, pointSize);\n\tpointSize = min(maxSize, pointSize);\n\t\n\tvRadius = pointSize / projFactor;\n\n\treturn pointSize;\n}\n\nvoid main()\n{\n\tvec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n\tvViewPosition = mvPosition.xyz;\n\tgl_Position = projectionMatrix * mvPosition;\n\n\tvLogDepth = log2(-mvPosition.z);\n\n\t//POINT SIZE\n\tfloat pointSize = getPointSize();\n\tgl_PointSize = pointSize;\n\tvPointSize = pointSize;\n\t` + THREE.ShaderChunk.logdepthbuf_vertex + `\n\n\t//COLOR\n\tvColor = getColor();\n\n\t#if defined hq_depth_pass\n\t\tfloat originalDepth = gl_Position.w;\n\t\tfloat adjustedDepth = originalDepth + 2.0 * vRadius;\n\t\tfloat adjust = adjustedDepth / originalDepth;\n\n\t\tmvPosition.xyz = mvPosition.xyz * adjust;\n\t\tgl_Position = projectionMatrix * mvPosition;\n\t#endif\n\n\t// CLIPPING\n\tvec4 clipPosition = modelMatrix * vec4( position, 1.0 );\n\tif (isClipped(clipPosition.xyz)) {\n\t\tgl_Position = vec4(100.0, 100.0, 100.0, 1.0); // Outside clip volume\n\t} \n}`;\n\n//\"pointcloud.fs\"\nShaders.fragment = `\n\n#if defined USE_LOGDEPTHBUF_EXT || defined paraboloid_point_shape\n\t#extension GL_EXT_frag_depth : enable\n#endif\n\nprecision highp float;\nprecision highp int;\n\n` + THREE.ShaderChunk.common + `\n` + THREE.ShaderChunk.logdepthbuf_pars_fragment + `\n\n// uniform mat4 viewMatrix;\nuniform mat4 uViewInv;\n// uniform mat4 uProjInv;\n// uniform vec3 cameraPosition;\n\nuniform mat4 projectionMatrix;\nuniform float uOpacity;\n\nuniform float fov;\nuniform float uSpacing;\nuniform float near;\nuniform float far;\nuniform float uPCIndex;\nuniform float uScreenWidth;\nuniform float uScreenHeight;\n\nvarying vec3 vColor;\nvarying float vLogDepth;\nvarying vec3 vViewPosition;\nvarying float vRadius;\nvarying float vPointSize;\nvarying vec3 vPosition;\n\nvoid main()\n{\n\tvec3 color = vColor;\n\tfloat depth = gl_FragCoord.z;\n\n\t#if defined circle_point_shape || defined paraboloid_point_shape\n\t\tfloat u = (2.0 * gl_PointCoord.x) - 1.0;\n\t\tfloat v = (2.0 * gl_PointCoord.y) - 1.0;\n\t#endif\n\t\n\t#if defined circle_point_shape\n\t\tfloat cc = (u*u) + (v*v);\n\t\tif(cc > 1.0)\n\t\t{\n\t\t\tdiscard;\n\t\t}\n\t#endif\n\n\t#if defined color_type_point_index\n\t\tgl_FragColor = vec4(color, uPCIndex / 255.0);\n\t#else\n\t\tgl_FragColor = vec4(color, uOpacity);\n\t#endif\n\n\t#if defined paraboloid_point_shape\n\t\tfloat wi = -( u*u + v*v);\n\t\tvec4 pos = vec4(vViewPosition, 1.0);\n\t\tpos.z += wi * vRadius;\n\t\tfloat linearDepth = -pos.z;\n\t\tpos = projectionMatrix * pos;\n\t\tpos = pos / pos.w;\n\t\tfloat expDepth = pos.z;\n\t\tdepth = (pos.z + 1.0) / 2.0;\n\n\t\tgl_FragDepthEXT = depth;\n\t\t\n\t\t#if defined color_type_depth\n\t\t\tcolor.r = linearDepth;\n\t\t\tcolor.g = expDepth;\n\t\t#endif\n\t#endif\n\t\n\t` + THREE.ShaderChunk.logdepthbuf_fragment +  `\n\n\t#if defined weighted_splats\n\t\tfloat distance = 2.0 * length(gl_PointCoord.xy - 0.5);\n\t\tfloat weight = max(0.0, 1.0 - distance);\n\t\tweight = pow(weight, 1.5);\n\n\t\tgl_FragColor.a = weight;\n\t\tgl_FragColor.xyz = gl_FragColor.xyz * weight;\n\t#endif\n}`;\n\nexport {Shaders};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {HelperUtils} from \"../../utils/HelperUtils.js\";\nimport {Gradients} from \"../../Gradients.js\";\nimport {Shaders} from \"../../Shaders.js\";\nimport {TreeType, PointColorType, PointSizeType, PointShape, Classification} from \"../../Potree.js\";\n\nclass PointCloudMaterial extends THREE.ShaderMaterial\n{\n\tconstructor(parameters = {})\n\t{\n\t\tsuper();\n\n\t\tthis.visibleNodesTexture = HelperUtils.generateDataTexture(2048, 1, new THREE.Color(0xffffff));\n\t\tthis.visibleNodesTexture.minFilter = THREE.NearestFilter;\n\t\tthis.visibleNodesTexture.magFilter = THREE.NearestFilter;\n\n\t\tvar getValid = function(a, b)\n\t\t{\n\t\t\treturn (a !== undefined) ? a : b;\n\t\t};\n\n\t\tvar pointSize = getValid(parameters.size, 1.0);\n\t\tvar minSize = getValid(parameters.minSize, 2.0);\n\t\tvar maxSize = getValid(parameters.maxSize, 50.0);\n\t\tvar treeType = getValid(parameters.treeType, TreeType.OCTREE);\n\n\t\tthis._pointSizeType = PointSizeType.FIXED;\n\t\tthis._shape = PointShape.SQUARE;\n\t\tthis._pointColorType = PointColorType.RGB;\n\t\tthis._weighted = false;\n\t\tthis._gradient = Gradients.SPECTRAL;\n\t\tthis._treeType = treeType;\n\t\tthis._defaultIntensityRangeChanged = false;\n\t\tthis._defaultElevationRangeChanged = false;\n\n\t\tthis.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient);\n\t\tthis.lights = false;\n\t\tthis.fog = false;\n\t\tthis.defines = new Map();\n\n\t\tthis.attributes =\n\t\t{\n\t\t\tposition: {type: 'fv', value: []},\n\t\t\tcolor: {type: 'fv', value: []},\n\t\t\tnormal: {type: 'fv', value: []},\n\t\t\tintensity: {type: 'f', value: []},\n\t\t\tclassification: {type: 'f', value: []},\n\t\t\treturnNumber: {type: 'f', value: []},\n\t\t\tnumberOfReturns: {type: 'f', value: []},\n\t\t\tpointSourceID: {type: 'f', value: []},\n\t\t\tindices: {type: 'fv', value: []}\n\t\t};\n\n\t\tthis.uniforms =\n\t\t{\n\t\t\tprojectionMatrix: { value: new THREE.Matrix4() },\n\t\t\tuViewInv: { value: new THREE.Matrix4() },\n\t\t\tclipPlanes: { value: [] },\n\t\t\tlevel: {type: \"f\", value: 0.0},\n\t\t\tvnStart: {type: \"f\", value: 0.0},\n\t\t\tspacing: {type: \"f\", value: 1.0},\n\t\t\tfov: {type: \"f\", value: 1.0},\n\t\t\tuScreenWidth: {type: \"f\", value: 1.0},\n\t\t\tuScreenHeight: {type: \"f\", value: 1.0},\n\t\t\tuOctreeSpacing: {type: \"f\", value: 0.0 },\n\t\t\tnear: {type: \"f\", value: 0.1},\n\t\t\tfar: {type: \"f\", value: 1.0},\n\t\t\tuColor: {type: \"c\", value: new THREE.Color( 0xffffff )},\n\t\t\tuOpacity: {type: \"f\", value: 1.0},\n\t\t\tsize: {type: \"f\", value: pointSize},\n\t\t\tminSize: {type: \"f\", value: minSize},\n\t\t\tmaxSize: {type: \"f\", value: maxSize},\n\t\t\toctreeSize: {type: \"f\", value: 0},\n\t\t\tbbSize: {type: \"fv\", value: [0, 0, 0]},\n\t\t\televationRange: {type: \"2fv\", value: [0, 0]},\n\t\t\tvisibleNodes: {type: \"t\", value: this.visibleNodesTexture},\n\t\t\tgradient: {type: \"t\", value: this.gradientTexture},\n\t\t\tclassificationLUT: {type: \"t\", value: null },\n\t\t\tdiffuse: {type: \"fv\", value: [1, 1, 1]},\n\t\t\ttransition: {type: \"f\", value: 0.5},\n\t\t\tintensityRange: {type: \"fv\", value: [0, 65000]},\n\t\t\tintensityGamma: {type: \"f\", value: 1},\n\t\t\tintensityContrast: {type: \"f\", value: 0},\n\t\t\tintensityBrightness:{type: \"f\", value: 0},\n\t\t\trgbGamma: {type: \"f\", value: 1},\n\t\t\trgbBrightness: {type: \"f\", value: 0},\n\t\t\tuTransition: {type: \"f\", value: 0},\n\t\t\twRGB: {type: \"f\", value: 1},\n\t\t\twIntensity: {type: \"f\", value: 0},\n\t\t\twElevation: {type: \"f\", value: 0},\n\t\t\twClassification: {type: \"f\", value: 0},\n\t\t\twReturnNumber: {type: \"f\", value: 0},\n\t\t\twSourceID: {type: \"f\", value: 0},\n\t\t\tlogDepthBufFC: {type: \"f\", value: 0},\n\t\t\tuPCIndex: { value: 0.0 }\n\t\t};\n\n\t\tthis.classification = Classification.DEFAULT;\n\t\tthis.defaultAttributeValues.normal = [0, 0, 0];\n\t\tthis.defaultAttributeValues.classification = [0, 0, 0];\n\t\tthis.defaultAttributeValues.indices = [0, 0, 0, 0];\n\n\t\tthis.defines = this.getDefines();\n\t\tthis.vertexColors = THREE.VertexColors;\n\n\t\tthis.vertexShader = Shaders.vertex;\n\t\tthis.fragmentShader = Shaders.fragment;\n\t}\n\n\tsetDefine(key, value)\n\t{\n\t\tif(value !== undefined && value !== null)\n\t\t{\n\t\t\tif(this.defines.get(key) !== value)\n\t\t\t{\n\t\t\t\tthis.defines.set(key, value);\n\t\t\t\tthis.updateMaterial();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.removeDefine(key);\n\t\t}\n\t}\n\n\tremoveDefine(key)\n\t{\n\t\tthis.defines.delete(key);\n\t}\n\n\tupdateMaterial()\n\t{\n\t\tthis.defines = this.getDefines();\n\n\t\tif(this.opacity === 1.0)\n\t\t{\n\t\t\tthis.blending = THREE.NoBlending;\n\t\t\tthis.transparent = false;\n\t\t\tthis.depthTest = true;\n\t\t\tthis.depthWrite = true;\n\t\t\tthis.depthFunc = THREE.LessEqualDepth;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.blending = THREE.AdditiveBlending;\n\t\t\tthis.transparent = true;\n\t\t\tthis.depthTest = false;\n\t\t\tthis.depthWrite = true;\n\t\t\tthis.depthFunc = THREE.AlwaysDepth;\n\t\t}\n\n\t\tif(this.weighted)\n\t\t{\n\t\t\tthis.blending = THREE.AdditiveBlending;\n\t\t\tthis.transparent = true;\n\t\t\tthis.depthTest = true;\n\t\t\tthis.depthWrite = false;\n\t\t}\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tonBeforeCompile(shader, renderer)\n\t{\n\t\tif(renderer.capabilities.logarithmicDepthBuffer)\n\t\t{\n\t\t\tthis.defines = { ...this.defines, USE_LOGDEPTHBUF: true, USE_LOGDEPTHBUF_EXT: true, EPSILON: 1e-6 };\n\t\t}\n\t}\n\n\tgetDefines()\n\t{\n\t\tconst pointSizeTypes = [];\n\t\tpointSizeTypes[PointSizeType.FIXED] = { fixed_point_size: true };\n\t\tpointSizeTypes[PointSizeType.ATTENUATED] = { attenuated_point_size: true };\n\t\tpointSizeTypes[PointSizeType.ADAPTIVE] = { adaptive_point_size: true };\n\n\t\tconst pointShapes = [];\n\t\tpointShapes[PointShape.SQUARE] = { square_point_shape: true };\n\t\tpointShapes[PointShape.CIRCLE] = { circle_point_shape: true };\n\t\tpointShapes[PointShape.PARABOLOID] = { paraboloid_point_shape: true };\n\n\t\tconst pointColorTypes = [];\n\t\tpointColorTypes[PointColorType.RGB] = { color_type_rgb: true }\n\t\tpointColorTypes[PointColorType.COLOR] = { color_type_color: true }\n\t\tpointColorTypes[PointColorType.DEPTH] = { color_type_depth: true }\n\t\tpointColorTypes[PointColorType.COLOR] = { color_type_color: true }\n\t\tpointColorTypes[PointColorType.HEIGHT] = { color_type_height: true }\n\t\tpointColorTypes[PointColorType.INTENSITY] = { color_type_intensity: true }\n\t\tpointColorTypes[PointColorType.INTENSITY_GRADIENT] = { color_type_intensity_gradient: true }\n\t\tpointColorTypes[PointColorType.POINT_INDEX] = { color_type_point_index: true }\n\t\tpointColorTypes[PointColorType.CLASSIFICATION] = { color_type_classification: true }\n\t\tpointColorTypes[PointColorType.RETURN_NUMBER] = { color_type_return_number: true }\n\t\tpointColorTypes[PointColorType.SOURCE] = { color_type_source: true }\n\t\tpointColorTypes[PointColorType.NORMAL] = { color_type_normal: true }\n\t\tpointColorTypes[PointColorType.RGB] = { color_type_rgb: true }\n\t\tpointColorTypes[PointColorType.PHONG] = { color_type_phong: true }\n\t\tpointColorTypes[PointColorType.RGB_HEIGHT] = { color_type_rgb_height: true }\n\t\tpointColorTypes[PointColorType.COMPOSITE] = { color_type_composite: true }\n\n\t\tconst treeTypes = [];\n\t\ttreeTypes[TreeType.OCTREE] = { tree_type_octree: true };\n\t\ttreeTypes[TreeType.KDTREE] = { tree_type_kdtree: true };\n\n\t\tvar defines = {\n\t\t\t...pointSizeTypes[this.pointSizeType], \n\t\t\t...pointShapes[this.shape],\n\t\t\t...pointColorTypes[this._pointColorType],\n\t\t\t...treeTypes[this.treeType],\n\t\t\t...(this.weighted ? { weighted_splats: true } : {})\n\t\t};\n\t\treturn defines;\n\t}\n\n\tget gradient()\n\t{\n\t\treturn this._gradient;\n\t}\n\n\tset gradient(value)\n\t{\n\t\tif(this._gradient !== value)\n\t\t{\n\t\t\tthis._gradient = value;\n\t\t\tthis.gradientTexture = PointCloudMaterial.generateGradientTexture(this._gradient);\n\t\t\tthis.uniforms.gradient.value = this.gradientTexture;\n\t\t}\n\t}\n\n\tget classification()\n\t{\n\t\treturn this._classification;\n\t}\n\n\tset classification(value)\n\t{\n\t\tvar copy = {};\n\t\tfor(var key of Object.keys(value))\n\t\t{\n\t\t\tcopy[key] = value[key].clone();\n\t\t}\n\n\t\tvar isEqual = false;\n\t\tif(this._classification === undefined)\n\t\t{\n\t\t\tisEqual = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tisEqual = Object.keys(copy).length === Object.keys(this._classification).length;\n\t\t\tfor(var key of Object.keys(copy))\n\t\t\t{\n\t\t\t\tisEqual = isEqual && this._classification[key] !== undefined;\n\t\t\t\tisEqual = isEqual && copy[key].equals(this._classification[key]);\n\t\t\t}\n\t\t}\n\n\t\tif(!isEqual)\n\t\t{\n\t\t\tthis._classification = copy;\n\t\t\tthis.recomputeClassification();\n\t\t}\n\t}\n\n\trecomputeClassification()\n\t{\n\t\tthis.classificationTexture = PointCloudMaterial.generateClassificationTexture(this._classification);\n\t\tthis.uniforms.classificationLUT.value = this.classificationTexture;\n\t\tthis.dispatchEvent(\n\t\t{\n\t\t\ttype: \"material_property_changed\",\n\t\t\ttarget: this\n\t\t});\n\t}\n\n\tget spacing()\n\t{\n\t\treturn this.uniforms.spacing.value;\n\t}\n\n\tset spacing(value)\n\t{\n\t\tif(this.uniforms.spacing.value !== value)\n\t\t{\n\t\t\tthis.uniforms.spacing.value = value;\n\t\t}\n\t}\n\n\tget weighted()\n\t{\n\t\treturn this._weighted;\n\t}\n\n\tset weighted(value)\n\t{\n\t\tif(this._weighted !== value)\n\t\t{\n\t\t\tthis._weighted = value;\n\t\t\tthis.updateMaterial();\n\t\t}\n\t}\n\n\tget fov()\n\t{\n\t\treturn this.uniforms.fov.value;\n\t}\n\n\tset fov(value)\n\t{\n\t\tif(this.uniforms.fov.value !== value)\n\t\t{\n\t\t\tthis.uniforms.fov.value = value;\n\t\t\tthis.updateMaterial();\n\t\t}\n\t}\n\n\tget screenWidth()\n\t{\n\t\treturn this.uniforms.screenWidth.value;\n\t}\n\n\tset screenWidth(value)\n\t{\n\t\tif(this.uniforms.screenWidth.value !== value)\n\t\t{\n\t\t\tthis.uniforms.screenWidth.value = value;\n\t\t\tthis.updateMaterial();\n\t\t}\n\t}\n\n\tget screenHeight()\n\t{\n\t\treturn this.uniforms.screenHeight.value;\n\t}\n\n\tset screenHeight(value)\n\t{\n\t\tif(this.uniforms.screenHeight.value !== value)\n\t\t{\n\t\t\tthis.uniforms.screenHeight.value = value;\n\t\t\tthis.updateMaterial();\n\t\t}\n\t}\n\n\tget near()\n\t{\n\t\treturn this.uniforms.near.value;\n\t}\n\n\tset near(value)\n\t{\n\t\tif(this.uniforms.near.value !== value)\n\t\t{\n\t\t\tthis.uniforms.near.value = value;\n\t\t}\n\t}\n\n\tget far()\n\t{\n\t\treturn this.uniforms.far.value;\n\t}\n\n\tset far(value)\n\t{\n\t\tif(this.uniforms.far.value !== value)\n\t\t{\n\t\t\tthis.uniforms.far.value = value;\n\t\t}\n\t}\n\n\tget opacity()\n\t{\n\t\treturn this.uniforms.uOpacity.value;\n\t}\n\n\tset opacity(value)\n\t{\n\t\tif(this.uniforms && this.uniforms.uOpacity)\n\t\t{\n\t\t\tif(this.uniforms.uOpacity.value !== value)\n\t\t\t{\n\t\t\t\tthis.uniforms.uOpacity.value = value;\n\t\t\t\tthis.updateMaterial();\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t{\n\t\t\t\t\ttype: \"opacity_changed\",\n\t\t\t\t\ttarget: this\n\t\t\t\t});\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t{\n\t\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\t\ttarget: this\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tget pointColorType()\n\t{\n\t\treturn this._pointColorType;\n\t}\n\n\tset pointColorType(value)\n\t{\n\t\tif(this._pointColorType !== value)\n\t\t{\n\t\t\tthis._pointColorType = value;\n\t\t\tthis.updateMaterial();\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"point_color_type_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget pointSizeType()\n\t{\n\t\treturn this._pointSizeType;\n\t}\n\n\tset pointSizeType(value)\n\t{\n\t\tif(this._pointSizeType !== value)\n\t\t{\n\t\t\tthis._pointSizeType = value;\n\t\t\tthis.updateMaterial();\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"point_size_type_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget color()\n\t{\n\t\treturn this.uniforms.uColor.value;\n\t}\n\n\tset color(value)\n\t{\n\t\tif(!this.uniforms.uColor.value.equals(value))\n\t\t{\n\t\t\tthis.uniforms.uColor.value.copy(value);\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"color_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget shape()\n\t{\n\t\treturn this._shape;\n\t}\n\n\tset shape(value)\n\t{\n\t\tif(this._shape !== value)\n\t\t{\n\t\t\tthis._shape = value;\n\t\t\tthis.updateMaterial();\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"point_shape_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget treeType()\n\t{\n\t\treturn this._treeType;\n\t}\n\n\tset treeType(value)\n\t{\n\t\tif(this._treeType !== value)\n\t\t{\n\t\t\tthis._treeType = value;\n\t\t\tthis.updateMaterial();\n\t\t}\n\t}\n\n\tget bbSize()\n\t{\n\t\treturn this.uniforms.bbSize.value;\n\t}\n\n\tset bbSize(value)\n\t{\n\t\tthis.uniforms.bbSize.value = value;\n\t}\n\n\tget size()\n\t{\n\t\treturn this.uniforms.size.value;\n\t}\n\n\tset size(value)\n\t{\n\t\tif(this.uniforms.size.value !== value)\n\t\t{\n\t\t\tthis.uniforms.size.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"point_size_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget elevationRange()\n\t{\n\t\treturn this.uniforms.elevationRange.value;\n\t}\n\n\tset elevationRange(value)\n\t{\n\t\tvar changed = this.uniforms.elevationRange.value[0] !== value[0] ||\n\t\t\tthis.uniforms.elevationRange.value[1] !== value[1];\n\t\tif(changed)\n\t\t{\n\t\t\tthis.uniforms.elevationRange.value = value;\n\t\t\tthis._defaultElevationRangeChanged = true;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget heightMin()\n\t{\n\t\treturn this.uniforms.elevationRange.value[0];\n\t}\n\n\tset heightMin(value)\n\t{\n\t\tthis.elevationRange = [value, this.elevationRange[1]];\n\t}\n\n\tget heightMax()\n\t{\n\t\treturn this.uniforms.elevationRange.value[1];\n\t}\n\n\tset heightMax(value)\n\t{\n\t\tthis.elevationRange = [this.elevationRange[0], value];\n\t}\n\n\tget transition()\n\t{\n\t\treturn this.uniforms.transition.value;\n\t}\n\n\tset transition(value)\n\t{\n\t\tthis.uniforms.transition.value = value;\n\t}\n\n\tget intensityRange()\n\t{\n\t\treturn this.uniforms.intensityRange.value;\n\t}\n\n\tset intensityRange(value)\n\t{\n\t\tif(!(value instanceof Array && value.length === 2))\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif(value[0] === this.uniforms.intensityRange.value[0] && value[1] === this.uniforms.intensityRange.value[1])\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.uniforms.intensityRange.value = value;\n\t\tthis._defaultIntensityRangeChanged = true;\n\n\t\tthis.dispatchEvent(\n\t\t{\n\t\t\ttype: \"material_property_changed\",\n\t\t\ttarget: this\n\t\t});\n\t}\n\n\tget intensityGamma()\n\t{\n\t\treturn this.uniforms.intensityGamma.value;\n\t}\n\n\tset intensityGamma(value)\n\t{\n\t\tif(this.uniforms.intensityGamma.value !== value)\n\t\t{\n\t\t\tthis.uniforms.intensityGamma.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget intensityContrast()\n\t{\n\t\treturn this.uniforms.intensityContrast.value;\n\t}\n\n\tset intensityContrast(value)\n\t{\n\t\tif(this.uniforms.intensityContrast.value !== value)\n\t\t{\n\t\t\tthis.uniforms.intensityContrast.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget intensityBrightness()\n\t{\n\t\treturn this.uniforms.intensityBrightness.value;\n\t}\n\n\tset intensityBrightness(value)\n\t{\n\t\tif(this.uniforms.intensityBrightness.value !== value)\n\t\t{\n\t\t\tthis.uniforms.intensityBrightness.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget rgbGamma()\n\t{\n\t\treturn this.uniforms.rgbGamma.value;\n\t}\n\n\tset rgbGamma(value)\n\t{\n\t\tif(this.uniforms.rgbGamma.value !== value)\n\t\t{\n\t\t\tthis.uniforms.rgbGamma.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\t// get rgbContrast()\n\t// {\n\t// \treturn this.uniforms.rgbContrast.value;\n\t// }\n\n\t// set rgbContrast(value)\n\t// {\n\t// \tif(this.uniforms.rgbContrast.value !== value)\n\t// \t{\n\t// \t\tthis.uniforms.rgbContrast.value = value;\n\t// \t\tthis.dispatchEvent(\n\t// \t\t{\n\t// \t\t\ttype: \"material_property_changed\",\n\t// \t\t\ttarget: this\n\t// \t\t});\n\t// \t}\n\t// }\n\n\tget rgbBrightness()\n\t{\n\t\treturn this.uniforms.rgbBrightness.value;\n\t}\n\n\tset rgbBrightness(value)\n\t{\n\t\tif(this.uniforms.rgbBrightness.value !== value)\n\t\t{\n\t\t\tthis.uniforms.rgbBrightness.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightRGB()\n\t{\n\t\treturn this.uniforms.wRGB.value;\n\t}\n\n\tset weightRGB(value)\n\t{\n\t\tif(this.uniforms.wRGB.value !== value)\n\t\t{\n\t\t\tthis.uniforms.wRGB.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightIntensity()\n\t{\n\t\treturn this.uniforms.wIntensity.value;\n\t}\n\n\tset weightIntensity(value)\n\t{\n\t\tif(this.uniforms.wIntensity.value !== value)\n\t\t{\n\t\t\tthis.uniforms.wIntensity.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightElevation()\n\t{\n\t\treturn this.uniforms.wElevation.value;\n\t}\n\n\tset weightElevation(value)\n\t{\n\t\tif(this.uniforms.wElevation.value !== value)\n\t\t{\n\t\t\tthis.uniforms.wElevation.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightClassification()\n\t{\n\t\treturn this.uniforms.wClassification.value;\n\t}\n\n\tset weightClassification(value)\n\t{\n\t\tif(this.uniforms.wClassification.value !== value)\n\t\t{\n\t\t\tthis.uniforms.wClassification.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightReturnNumber()\n\t{\n\t\treturn this.uniforms.wReturnNumber.value;\n\t}\n\n\tset weightReturnNumber(value)\n\t{\n\t\tif(this.uniforms.wReturnNumber.value !== value)\n\t\t{\n\t\t\tthis.uniforms.wReturnNumber.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tget weightSourceID()\n\t{\n\t\treturn this.uniforms.wSourceID.value;\n\t}\n\n\tset weightSourceID(value)\n\t{\n\t\tif(this.uniforms.wSourceID.value !== value)\n\t\t{\n\t\t\tthis.uniforms.wSourceID.value = value;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"material_property_changed\",\n\t\t\t\ttarget: this\n\t\t\t});\n\t\t}\n\t}\n\n\tstatic generateGradientTexture(gradient)\n\t{\n\t\tvar size = 64;\n\n\t\t//Create canvas\n\t\tvar canvas = document.createElement(\"canvas\");\n\t\tcanvas.width = size;\n\t\tcanvas.height = size;\n\n\t\t//Get context\n\t\tvar context = canvas.getContext(\"2d\");\n\n\t\t//Draw gradient\n\t\tcontext.rect(0, 0, size, size);\n\t\tvar ctxGradient = context.createLinearGradient(0, 0, size, size);\n\t\tfor(var i = 0; i < gradient.length; i++)\n\t\t{\n\t\t\tvar step = gradient[i];\n\t\t\tctxGradient.addColorStop(step[0], \"#\" + step[1].getHexString());\n\t\t}\n\t\tcontext.fillStyle = ctxGradient;\n\t\tcontext.fill();\n\n\t\tvar texture = new THREE.CanvasTexture(canvas);\n\t\ttexture.needsUpdate = true;\n\t\ttexture.minFilter = THREE.LinearFilter;\n\n\t\treturn texture;\n\t}\n\n\tstatic generateClassificationTexture(classification)\n\t{\n\t\tvar width = 256;\n\t\tvar height = 256;\n\t\tvar size = width * height;\n\t\tvar data = new Uint8Array(4 * size);\n\t\tfor(var x = 0; x < width; x++)\n\t\t{\n\t\t\tfor(var y = 0; y < height; y++)\n\t\t\t{\n\t\t\t\tvar i = x + width * y;\n\t\t\t\tvar color;\n\t\t\t\tif(classification[x])\n\t\t\t\t{\n\t\t\t\t\tcolor = classification[x];\n\t\t\t\t}\n\t\t\t\telse if(classification[x % 32])\n\t\t\t\t{\n\t\t\t\t\tcolor = classification[x % 32];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcolor = classification.DEFAULT;\n\t\t\t\t}\n\t\t\t\tdata[4 * i + 0] = 255 * color.x;\n\t\t\t\tdata[4 * i + 1] = 255 * color.y;\n\t\t\t\tdata[4 * i + 2] = 255 * color.z;\n\t\t\t\tdata[4 * i + 3] = 255 * color.w;\n\t\t\t}\n\t\t}\n\t\tvar texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat);\n\t\ttexture.magFilter = THREE.NearestFilter;\n\t\ttexture.wrapS = texture.wrapT = THREE.ClampToEdgeWrapping;\n\t\ttexture.needsUpdate = true;\n\t\treturn texture;\n\t}\n\n\tdisableEvents()\n\t{\n\t\tif(this._hiddenListeners === undefined)\n\t\t{\n\t\t\tthis._hiddenListeners = this._listeners;\n\t\t\tthis._listeners = {};\n\t\t}\n\t}\n\n\tenableEvents()\n\t{\n\t\tthis._listeners = this._hiddenListeners;\n\t\tthis._hiddenListeners = undefined;\n\t}\n\n\tcopyFrom(from)\n\t{\n\t\tfor(var name of this.uniforms)\n\t\t{\n\t\t\tthis.uniforms[name].value = from.uniforms[name].value;\n\t\t}\n\t}\n};\n\nexport {PointCloudMaterial};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {PointCloudOctreeGeometryNode} from \"./geometries/PointCloudOctreeGeometry.js\";\nimport {HelperUtils} from \"../utils/HelperUtils.js\";\nimport {PointCloudTree, PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {PointCloudMaterial} from \"./materials/PointCloudMaterial.js\";\nimport {PointColorType } from \"../Potree.js\";\nimport {Global} from \"../Global.js\";\n\nclass PointCloudOctreeNode extends PointCloudTreeNode\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis.children = {};\n\t\tthis.sceneNode = null;\n\t\tthis.octree = null;\n\t}\n\n\tgetNumPoints()\n\t{\n\t\treturn this.geometryNode.numPoints;\n\t}\n\n\tisLoaded()\n\t{\n\t\treturn true;\n\t}\n\n\tisTreeNode()\n\t{\n\t\treturn true;\n\t}\n\n\tisGeometryNode()\n\t{\n\t\treturn false;\n\t}\n\n\tgetLevel()\n\t{\n\t\treturn this.geometryNode.level;\n\t}\n\n\tgetBoundingSphere()\n\t{\n\t\treturn this.geometryNode.boundingSphere;\n\t}\n\n\tgetBoundingBox()\n\t{\n\t\treturn this.geometryNode.boundingBox;\n\t}\n\n\tgetChildren()\n\t{\n\t\tvar children = [];\n\n\t\tfor(var i = 0; i < 8; i++)\n\t\t{\n\t\t\tif(this.children[i])\n\t\t\t{\n\t\t\t\tchildren.push(this.children[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn children;\n\t}\n\n\tgetPointsInBox(boxNode)\n\t{\n\n\t\tif(!this.sceneNode)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tvar buffer = this.geometryNode.buffer;\n\n\t\tvar posOffset = buffer.offset(\"position\");\n\t\tvar stride = buffer.stride;\n\t\tvar view = new DataView(buffer.data);\n\n\t\tvar worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld);\n\t\tvar objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, this.sceneNode.matrixWorld);\n\n\t\tvar inBox = [];\n\n\t\tvar pos = new THREE.Vector4();\n\t\tfor(var i = 0; i < buffer.numElements; i++)\n\t\t{\n\t\t\tvar x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\tvar y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\tvar z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\tpos.set(x, y, z, 1);\n\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\tif(-0.5 < pos.x && pos.x < 0.5)\n\t\t\t{\n\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5)\n\t\t\t\t{\n\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5)\n\t\t\t\t\t{\n\t\t\t\t\t\tpos.set(x, y, z, 1).applyMatrix4(this.sceneNode.matrixWorld);\n\t\t\t\t\t\tinBox.push(new THREE.Vector3(pos.x, pos.y, pos.z));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn inBox;\n\t}\n\n\tget name()\n\t{\n\t\treturn this.geometryNode.name;\n\t}\n};\n\nclass PointCloudOctree extends PointCloudTree\n{\n\tconstructor(geometry, material)\n\t{\n\t\tsuper();\n\n\t\tthis.pointBudget = Infinity;\n\t\tthis.pcoGeometry = geometry;\n\t\tthis.boundingBox = this.pcoGeometry.boundingBox;\n\t\tthis.boundingSphere = this.boundingBox.getBoundingSphere(new THREE.Sphere());\n\t\tthis.material = material || new PointCloudMaterial();\n\t\tthis.visiblePointsTarget = 2 * 1000 * 1000;\n\t\tthis.minimumNodePixelSize = 150;\n\t\tthis.level = 0;\n\t\tthis.position.copy(geometry.offset);\n\t\tthis.updateMatrix();\n\n\t\tthis.showBoundingBox = false;\n\t\tthis.boundingBoxNodes = [];\n\t\tthis.loadQueue = [];\n\t\tthis.visibleBounds = new THREE.Box3();\n\t\tthis.visibleNodes = [];\n\t\tthis.visibleGeometry = [];\n\t\tthis.generateDEM = false;\n\t\tthis.profileRequests = [];\n\t\tthis.name = \"\";\n\n\t\tthis.tempVector3 = new THREE.Vector3();\n\n\t\tvar box = [this.pcoGeometry.tightBoundingBox, this.getBoundingBoxWorld()].find(v => v !== undefined);\n\n\t\tthis.updateMatrixWorld(true);\n\t\tbox = HelperUtils.computeTransformedBoundingBox(box, this.matrixWorld);\n\n\t\tvar bMin = box.min.z;\n\t\tvar bMax = box.max.z;\n\t\tthis.material.heightMin = bMin;\n\t\tthis.material.heightMax = bMax;\n\n\t\t//TODO <read projection from file instead>\n\t\tthis.projection = geometry.projection;\n\n\t\tthis.root = this.pcoGeometry.root;\n\t}\n\n\tsetName(name)\n\t{\n\t\tif(this.name !== name)\n\t\t{\n\t\t\tthis.name = name;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"name_changed\",\n\t\t\t\tname: name,\n\t\t\t\tpointcloud: this\n\t\t\t});\n\t\t}\n\t}\n\n\tgetName()\n\t{\n\t\treturn this.name;\n\t}\n\n\ttoTreeNode(geometryNode, parent)\n\t{\n\t\tvar node = new PointCloudOctreeNode();\n\t\tvar sceneNode = new THREE.Points(geometryNode.geometry, this.material);\n\t\tsceneNode.name = geometryNode.name;\n\t\tsceneNode.position.copy(geometryNode.boundingBox.min);\n\t\tsceneNode.frustumCulled = true;\n\t\tsceneNode.onBeforeRender = (renderer, scene, camera, geometry, material, group) =>\n\t\t{\n\t\t\tvar vnStart = null;\n\t\t\tif(this.visibleNodeTextureOffsets)\n\t\t\t{\n\t\t\t\tvnStart = this.visibleNodeTextureOffsets.get(node);\n\t\t\t}\n\n\t\t\tvar pcIndex = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node);\n\t\t\tvar level = geometryNode.getLevel();\n\t\n\t\t\tmaterial.uniforms.level.value = level;\n\t\t\tmaterial.uniforms.vnStart.value = vnStart;\n\t\t\tmaterial.uniforms.uPCIndex.value = pcIndex;\n\t\t\tthis.updateMaterial(material, camera, renderer);\n\t\t};\n\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.pointcloud = this;\n\t\tnode.children = {};\n\t\tfor(var key in geometryNode.children)\n\t\t{\n\t\t\tnode.children[key] = geometryNode.children[key];\n\t\t}\n\n\t\tif(!parent)\n\t\t{\n\t\t\tthis.root = node;\n\t\t\tthis.add(sceneNode);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]);\n\t\t\tparent.sceneNode.add(sceneNode);\n\t\t\tparent.children[childIndex] = node;\n\t\t}\n\n\t\tvar disposeListener = function()\n\t\t{\n\t\t\tvar childIndex = parseInt(geometryNode.name[geometryNode.name.length - 1]);\n\t\t\tparent.sceneNode.remove(node.sceneNode);\n\t\t\tparent.children[childIndex] = geometryNode;\n\t\t};\n\t\tgeometryNode.oneTimeDisposeHandlers.push(disposeListener);\n\n\n\t\treturn node;\n\t}\n\n\tupdateVisibleBounds()\n\t{\n\t\tvar leafNodes = [];\n\t\tfor(var i = 0; i < this.visibleNodes.length; i++)\n\t\t{\n\t\t\tvar node = this.visibleNodes[i];\n\t\t\tvar isLeaf = true;\n\n\t\t\tfor(var j = 0; j < node.children.length; j++)\n\t\t\t{\n\t\t\t\tvar child = node.children[j];\n\t\t\t\tif(child instanceof PointCloudOctreeNode)\n\t\t\t\t{\n\t\t\t\t\tisLeaf = isLeaf && !child.sceneNode.visible;\n\t\t\t\t}\n\t\t\t\telse if(child instanceof PointCloudOctreeGeometryNode)\n\t\t\t\t{\n\t\t\t\t\tisLeaf = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(isLeaf)\n\t\t\t{\n\t\t\t\tleafNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\tthis.visibleBounds.min = new THREE.Vector3(Infinity, Infinity, Infinity);\n\t\tthis.visibleBounds.max = new THREE.Vector3(-Infinity, -Infinity, -Infinity);\n\n\t\tfor(var i = 0; i < leafNodes.length; i++)\n\t\t{\n\t\t\tvar node = leafNodes[i];\n\t\t\tthis.visibleBounds.expandByPoint(node.getBoundingBox().min);\n\t\t\tthis.visibleBounds.expandByPoint(node.getBoundingBox().max);\n\t\t}\n\t}\n\n\tupdateMaterial(material, camera, renderer)\n\t{\n\t\tvar octtreeSpacing = this.pcoGeometry.spacing * Math.max(this.scale.x, this.scale.y, this.scale.z);\n\t\tvar octreeSize = this.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;\n\n\t\tmaterial.uniforms.fov.value = camera.fov * (Math.PI / 180);\n\t\tmaterial.uniforms.uScreenWidth.value = renderer.domElement.clientWidth;\n\t\tmaterial.uniforms.uScreenHeight.value = renderer.domElement.clientHeight;\n\t\tmaterial.uniforms.uOctreeSpacing.value = octtreeSpacing;\n\t\tmaterial.uniforms.near.value = camera.near;\n\t\tmaterial.uniforms.far.value = camera.far;\n\t\tmaterial.uniforms.octreeSize.value = octreeSize;\n\n\t\tmaterial.uniformsNeedUpdate  = true;\n\t}\n\n\tcomputeVisibilityTextureData(nodes, camera)\n\t{\n\t\tif(Global.measureTimings)\n\t\t{\n\t\t\tperformance.mark(\"computeVisibilityTextureData-start\");\n\t\t}\n\n\t\tvar data = new Uint8Array(nodes.length * 4);\n\t\tvar visibleNodeTextureOffsets = new Map();\n\n\t\t//copy array\n\t\tnodes = nodes.slice();\n\n\t\t//sort by level and index, e.g. r, r0, r3, r4, r01, r07, r30, ...\n\t\tvar sort = function(a, b)\n\t\t{\n\t\t\tvar na = a.geometryNode.name;\n\t\t\tvar nb = b.geometryNode.name;\n\t\t\tif(na.length !== nb.length) return na.length - nb.length;\n\t\t\tif(na < nb) return -1;\n\t\t\tif(na > nb) return 1;\n\t\t\treturn 0;\n\t\t};\n\t\tnodes.sort(sort);\n\n\t\t//code sample taken from three.js src/math/Ray.js\n\t\tvar v1 = new THREE.Vector3();\n\t\tvar intersectSphereBack = (ray, sphere) =>\n\t\t{\n\t\t\tv1.subVectors(sphere.center, ray.origin);\n\t\t\tvar tca = v1.dot(ray.direction);\n\t\t\tvar d2 = v1.dot(v1) - tca * tca;\n\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\tif(d2 > radius2)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tvar thc = Math.sqrt(radius2 - d2);\n\n\t\t\t//t1 = second intersect point - exit point on back of sphere\n\t\t\tvar t1 = tca + thc;\n\n\t\t\tif(t1 < 0)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn t1;\n\t\t};\n\n\t\tvar lodRanges = new Map();\n\t\tvar leafNodeLodRanges = new Map();\n\n\t\tfor(var i = 0; i < nodes.length; i++)\n\t\t{\n\t\t\tvar node = nodes[i];\n\n\t\t\tvisibleNodeTextureOffsets.set(node, i);\n\n\t\t\tvar children = [];\n\t\t\tfor(var j = 0; j < 8; j++)\n\t\t\t{\n\t\t\t\tvar child = node.children[j];\n\n\t\t\t\tif(child && child.constructor === PointCloudOctreeNode && nodes.includes(child, i))\n\t\t\t\t{\n\t\t\t\t\tchildren.push(child);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdata[i * 4 + 0] = 0;\n\t\t\tdata[i * 4 + 1] = 0;\n\t\t\tdata[i * 4 + 2] = 0;\n\t\t\tdata[i * 4 + 3] = node.getLevel();\n\t\t\tfor(var j = 0; j < children.length; j++)\n\t\t\t{\n\t\t\t\tvar child = children[j];\n\t\t\t\tvar index = parseInt(child.geometryNode.name.substr(-1));\n\t\t\t\tdata[i * 4 + 0] += Math.pow(2, index);\n\n\t\t\t\tif(j === 0)\n\t\t\t\t{\n\t\t\t\t\tvar vArrayIndex = nodes.indexOf(child, i);\n\n\t\t\t\t\tdata[i * 4 + 1] = (vArrayIndex - i) >> 8;\n\t\t\t\t\tdata[i * 4 + 2] = (vArrayIndex - i) % 256;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//TODO performance optimization\n\t\t\t//for some reason, this part can be extremely slow in chrome during a debugging session, but not during profiling\n\t\t\tvar bBox = node.getBoundingBox().clone();\n\t\t\t//bBox.applyMatrix4(node.sceneNode.matrixWorld);\n\t\t\t//bBox.applyMatrix4(camera.matrixWorldInverse);\n\t\t\tvar bSphere = bBox.getBoundingSphere(new THREE.Sphere());\n\t\t\tbSphere.applyMatrix4(node.sceneNode.matrixWorld);\n\t\t\tbSphere.applyMatrix4(camera.matrixWorldInverse);\n\n\t\t\tvar ray = new THREE.Ray(camera.position, camera.getWorldDirection(this.tempVector3));\n\t\t\tvar distance = intersectSphereBack(ray, bSphere);\n\t\t\tvar distance2 = bSphere.center.distanceTo(camera.position) + bSphere.radius;\n\t\t\tif(distance === null)\n\t\t\t{\n\t\t\t\tdistance = distance2;\n\t\t\t}\n\t\t\tdistance = Math.max(distance, distance2);\n\n\t\t\tif(!lodRanges.has(node.getLevel()))\n\t\t\t{\n\t\t\t\tlodRanges.set(node.getLevel(), distance);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar prevDistance = lodRanges.get(node.getLevel());\n\t\t\t\tvar newDistance = Math.max(prevDistance, distance);\n\t\t\t\tlodRanges.set(node.getLevel(), newDistance);\n\t\t\t}\n\n\t\t\tif(!node.geometryNode.hasChildren)\n\t\t\t{\n\t\t\t\tvar value = {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\ti: i\n\t\t\t\t};\n\t\t\t\tleafNodeLodRanges.set(node, value);\n\t\t\t}\n\t\t}\n\n\t\tfor(var [node, value] of leafNodeLodRanges)\n\t\t{\n\t\t\tvar level = node.getLevel();\n\t\t\tvar distance = value.distance;\n\t\t\tvar i = value.i;\n\n\t\t\tif(level < 4)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor(var [lod, range] of lodRanges)\n\t\t\t{\n\t\t\t\tif(distance < range * 1.2)\n\t\t\t\t{\n\t\t\t\t\tdata[i * 4 + 3] = lod;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(Global.measureTimings)\n\t\t{\n\t\t\tperformance.mark(\"computeVisibilityTextureData-end\");\n\t\t\tperformance.measure(\"render.computeVisibilityTextureData\", \"computeVisibilityTextureData-start\", \"computeVisibilityTextureData-end\");\n\t\t}\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: visibleNodeTextureOffsets\n\t\t};\n\t}\n\n\tnodeIntersectsProfile(node, profile)\n\t{\n\t\tvar bbWorld = node.boundingBox.clone().applyMatrix4(this.matrixWorld);\n\t\tvar bsWorld = bbWorld.getBoundingSphere(new THREE.Sphere());\n\n\t\tvar intersects = false;\n\n\t\tfor(var i = 0; i < profile.points.length - 1; i++)\n\t\t{\n\n\t\t\tvar start = new THREE.Vector3(profile.points[i + 0].x, profile.points[i + 0].y, bsWorld.center.z);\n\t\t\tvar end = new THREE.Vector3(profile.points[i + 1].x, profile.points[i + 1].y, bsWorld.center.z);\n\n\t\t\tvar closest = new THREE.Line3(start, end).closestPointToPoint(bsWorld.center, true);\n\t\t\tvar distance = closest.distanceTo(bsWorld.center);\n\n\t\t\tintersects = intersects || (distance < (bsWorld.radius + profile.width));\n\t\t}\n\n\t\treturn intersects;\n\t}\n\n\tnodesOnRay(nodes, ray)\n\t{\n\t\tvar nodesOnRay = [];\n\n\t\tvar _ray = ray.clone();\n\t\tfor(var i = 0; i < nodes.length; i++)\n\t\t{\n\t\t\tvar node = nodes[i];\n\t\t\t//var inverseWorld = new THREE.Matrix4().getInverse(node.matrixWorld);\n\t\t\t//var sphere = node.getBoundingSphere(new THREE.Sphere()).clone().applyMatrix4(node.sceneNode.matrixWorld);\n\t\t\tvar sphere = node.getBoundingSphere(new THREE.Sphere()).clone().applyMatrix4(this.matrixWorld);\n\n\t\t\tif(_ray.intersectsSphere(sphere))\n\t\t\t{\n\t\t\t\tnodesOnRay.push(node);\n\t\t\t}\n\t\t}\n\n\t\treturn nodesOnRay;\n\t}\n\n\tupdateMatrixWorld(force)\n\t{\n\t\tif(this.matrixAutoUpdate === true) this.updateMatrix();\n\n\t\tif(this.matrixWorldNeedsUpdate === true || force === true)\n\t\t{\n\t\t\tif(!this.parent)\n\t\t\t{\n\t\t\t\tthis.matrixWorld.copy(this.matrix);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\t\t}\n\t}\n\n\thideDescendants(object)\n\t{\n\t\tvar stack = [];\n\t\tfor(var i = 0; i < object.children.length; i++)\n\t\t{\n\t\t\tvar child = object.children[i];\n\t\t\tif(child.visible)\n\t\t\t{\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile(stack.length > 0)\n\t\t{\n\t\t\tvar object = stack.shift();\n\n\t\t\tobject.visible = false;\n\n\t\t\tfor(var i = 0; i < object.children.length; i++)\n\t\t\t{\n\t\t\t\tvar child = object.children[i];\n\t\t\t\tif(child.visible)\n\t\t\t\t{\n\t\t\t\t\tstack.push(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tmoveToOrigin()\n\t{\n\t\tthis.position.set(0, 0, 0);\n\t\tthis.updateMatrixWorld(true);\n\t\tvar box = this.boundingBox;\n\t\tvar transform = this.matrixWorld;\n\t\tvar tBox = HelperUtils.computeTransformedBoundingBox(box, transform);\n\n\t\tthis.position.set(0, 0, 0).sub(tBox.getCenter(new THREE.Vector3()));\n\t};\n\n\tmoveToGroundPlane()\n\t{\n\t\tthis.updateMatrixWorld(true);\n\t\tvar box = this.boundingBox;\n\t\tvar transform = this.matrixWorld;\n\t\tvar tBox = HelperUtils.computeTransformedBoundingBox(box, transform);\n\t\tthis.position.y += -tBox.min.y;\n\t};\n\n\tgetBoundingBoxWorld()\n\t{\n\t\tthis.updateMatrixWorld(true);\n\t\tvar box = this.boundingBox;\n\t\tvar transform = this.matrixWorld;\n\t\tvar tBox = HelperUtils.computeTransformedBoundingBox(box, transform);\n\n\t\treturn tBox;\n\t};\n\n\t/**\n\t * returns points inside the profile points\n\t *\n\t * maxDepth:\t\tsearch points up to the given octree depth\n\t *\n\t *\n\t * The return value is an array with all segments of the profile path\n\t *  var segment = {\n\t * \t\tstart: \tTHREE.Vector3,\n\t * \t\tend: \tTHREE.Vector3,\n\t * \t\tpoints: {}\n\t * \t\tproject: function()\n\t *  };\n\t *\n\t * The project() function inside each segment can be used to transform\n\t * that segments point coordinates to line up along the x-axis.\n\t *\n\t *\n\t */\n\tgetPointsInProfile(profile, maxDepth, callback)\n\t{\n\t\tif(callback)\n\t\t{\n\t\t\t//var request = new Potree.ProfileRequest(this, profile, maxDepth, callback);\n\t\t\t//this.profileRequests.push(request);\n\t\t\t//return request;\n\t\t}\n\n\t\tvar points = {\n\t\t\tsegments: [],\n\t\t\tboundingBox: new THREE.Box3(),\n\t\t\tprojectedBoundingBox: new THREE.Box2()\n\t\t};\n\n\t\t//evaluate segments\n\t\tfor(var i = 0; i < profile.points.length - 1; i++)\n\t\t{\n\t\t\tvar start = profile.points[i];\n\t\t\tvar end = profile.points[i + 1];\n\t\t\tvar ps = this.getProfile(start, end, profile.width, maxDepth);\n\n\t\t\tvar segment = {\n\t\t\t\tstart: start,\n\t\t\t\tend: end,\n\t\t\t\tpoints: ps,\n\t\t\t\tproject: null\n\t\t\t};\n\n\t\t\tpoints.segments.push(segment);\n\n\t\t\tpoints.boundingBox.expandByPoint(ps.boundingBox.min);\n\t\t\tpoints.boundingBox.expandByPoint(ps.boundingBox.max);\n\t\t}\n\n\t\t//add projection functions to the segments\n\t\tvar mileage = new THREE.Vector3();\n\t\tfor(var i = 0; i < points.segments.length; i++)\n\t\t{\n\t\t\tvar segment = points.segments[i];\n\t\t\tvar start = segment.start;\n\t\t\tvar end = segment.end;\n\n\t\t\tvar project = (function(_start, _end, _mileage, _boundingBox)\n\t\t\t{\n\t\t\t\tvar start = _start;\n\t\t\t\tvar end = _end;\n\t\t\t\tvar mileage = _mileage;\n\t\t\t\tvar boundingBox = _boundingBox;\n\n\t\t\t\tvar xAxis = new THREE.Vector3(1, 0, 0);\n\t\t\t\tvar dir = new THREE.Vector3().subVectors(end, start);\n\t\t\t\tdir.y = 0;\n\t\t\t\tdir.normalize();\n\t\t\t\tvar alpha = Math.acos(xAxis.dot(dir));\n\t\t\t\tif(dir.z > 0)\n\t\t\t\t{\n\t\t\t\t\talpha = -alpha;\n\t\t\t\t}\n\n\t\t\t\treturn function(position)\n\t\t\t\t{\n\t\t\t\t\tvar toOrigin = new THREE.Matrix4().makeTranslation(-start.x, -boundingBox.min.y, -start.z);\n\t\t\t\t\tvar alignWithX = new THREE.Matrix4().makeRotationY(-alpha);\n\t\t\t\t\tvar applyMileage = new THREE.Matrix4().makeTranslation(mileage.x, 0, 0);\n\n\t\t\t\t\tvar pos = position.clone();\n\t\t\t\t\tpos.applyMatrix4(toOrigin);\n\t\t\t\t\tpos.applyMatrix4(alignWithX);\n\t\t\t\t\tpos.applyMatrix4(applyMileage);\n\n\t\t\t\t\treturn pos;\n\t\t\t\t};\n\t\t\t}(start, end, mileage.clone(), points.boundingBox.clone()));\n\n\t\t\tsegment.project = project;\n\n\t\t\tmileage.x += new THREE.Vector3(start.x, 0, start.z).distanceTo(new THREE.Vector3(end.x, 0, end.z));\n\t\t\tmileage.y += end.y - start.y;\n\t\t}\n\n\t\tpoints.projectedBoundingBox.min.x = 0;\n\t\tpoints.projectedBoundingBox.min.y = points.boundingBox.min.y;\n\t\tpoints.projectedBoundingBox.max.x = mileage.x;\n\t\tpoints.projectedBoundingBox.max.y = points.boundingBox.max.y;\n\n\t\treturn points;\n\t}\n\n\t/**\n\t * returns points inside the given profile bounds.\n\t *\n\t * start:\n\t * end:\n\t * width:\n\t * depth:\t\tsearch points up to the given octree depth\n\t * callback:\tif specified, points are loaded before searching\n\t *\n\t *\n\t */\n\tgetProfile(start, end, width, depth, callback)\n\t{\n\t\t//var request = new Potree.ProfileRequest(start, end, width, depth, callback);\n\t\t//this.profileRequests.push(request);\n\t};\n\n\tgetVisibleExtent()\n\t{\n\t\treturn this.visibleBounds.applyMatrix4(this.matrixWorld);\n\t};\n\n\t/**\n\t *\n\t *\n\t *\n\t * params.pickWindowSize:\tLook for points inside a pixel window of this size.\n\t * \t\t\t\t\t\t\tUse odd values: 1, 3, 5, ...\n\t *\n\t *\n\t * TODO: only draw pixels that are actually read with readPixels().\n\t *\n\t */\n\tpick(viewer, camera, ray, params = {})\n\t{\n\t\tvar renderer = viewer.renderer;\n\t\tvar pRenderer = viewer.pRenderer;\n\n\t\tperformance.mark(\"pick-start\");\n\n\t\tvar getVal = (a, b) => a !== undefined ? a : b;\n\n\t\tvar pickWindowSize = getVal(params.pickWindowSize, 17);\n\n\t\tvar size = renderer.getSize(new THREE.Vector3());\n\n\t\tvar width = Math.ceil(getVal(params.width, size.width));\n\t\tvar height = Math.ceil(getVal(params.height, size.height));\n\n\t\tvar pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType);\n\t\tvar pointSize = getVal(params.pointSize, this.material.size);\n\n\t\tvar nodes = this.nodesOnRay(this.visibleNodes, ray);\n\n\t\tif(nodes.length === 0)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tif(!this.pickState)\n\t\t{\n\t\t\tvar scene = new THREE.Scene();\n\n\t\t\tvar material = new PointCloudMaterial();\n\t\t\tmaterial.pointColorType = PointColorType.POINT_INDEX;\n\n\t\t\tvar renderTarget = new THREE.WebGLRenderTarget(\n\t\t\t\t1, 1,\n\t\t\t\t{\n\t\t\t\t\tminFilter: THREE.LinearFilter,\n\t\t\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\t\t\tformat: THREE.RGBAFormat\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tthis.pickState = {\n\t\t\t\trenderTarget: renderTarget,\n\t\t\t\tmaterial: material,\n\t\t\t\tscene: scene\n\t\t\t};\n\t\t};\n\n\t\tvar pickState = this.pickState;\n\t\tvar pickMaterial = pickState.material;\n\n\t\t//Update pick material\n\t\tpickMaterial.pointSizeType = pointSizeType;\n\t\tpickMaterial.shape = this.material.shape;\n\n\t\tpickMaterial.size = pointSize;\n\t\tpickMaterial.uniforms.minSize.value = this.material.uniforms.minSize.value;\n\t\tpickMaterial.uniforms.maxSize.value = this.material.uniforms.maxSize.value;\n\t\tpickMaterial.classification = this.material.classification;\n\t\tpickMaterial.clippingPlanes = this.material.clippingPlanes;\n\t\tpickMaterial.clipping = this.material.clipping;\n\n\t\tthis.updateMaterial(pickMaterial, camera, renderer);\n\n\t\tpickState.renderTarget.setSize(width, height);\n\n\t\tvar pixelPos = new THREE.Vector2(params.x, params.y);\n\n\t\tvar gl = renderer.getContext();\n\t\tgl.enable(gl.SCISSOR_TEST);\n\t\tgl.scissor(parseInt(pixelPos.x - (pickWindowSize - 1) / 2), parseInt(pixelPos.y - (pickWindowSize - 1) / 2), parseInt(pickWindowSize), parseInt(pickWindowSize));\n\n\t\trenderer.state.buffers.depth.setTest(pickMaterial.depthTest);\n\t\trenderer.state.buffers.depth.setMask(pickMaterial.depthWrite);\n\t\trenderer.state.setBlending(THREE.NoBlending);\n\n\t\t//Render\n\t\trenderer.setRenderTarget(pickState.renderTarget);\n\t\tgl.clearColor(0, 0, 0, 0);\n\t\trenderer.clearTarget(pickState.renderTarget, true, true, true);\n\n\t\tvar tmp = this.material;\n\t\tthis.material = pickMaterial;\n\n\t\tpRenderer.renderOctree(this, nodes, camera, pickState.renderTarget);\n\n\t\tthis.material = tmp;\n\n\t\tvar clamp = (number, min, max) => Math.min(Math.max(min, number), max);\n\n\t\tvar x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width));\n\t\tvar y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height));\n\t\tvar w = parseInt(Math.min(x + pickWindowSize, width) - x);\n\t\tvar h = parseInt(Math.min(y + pickWindowSize, height) - y);\n\n\t\tvar pixelCount = w * h;\n\t\tvar buffer = new Uint8Array(4 * pixelCount);\n\n\t\tgl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n\n\t\trenderer.setRenderTarget(null);\n\t\trenderer.resetGLState();\n\t\trenderer.setScissorTest(false);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\n\t\tvar pixels = buffer;\n\t\tvar ibuffer = new Uint32Array(buffer.buffer);\n\n\t\t//find closest hit inside pixelWindow boundaries\n\t\tvar min = Number.MAX_VALUE;\n\t\tvar hits = [];\n\n\t\tfor(var u = 0; u < pickWindowSize; u++)\n\t\t{\n\t\t\tfor(var v = 0; v < pickWindowSize; v++)\n\t\t\t{\n\t\t\t\tvar offset = (u + v * pickWindowSize);\n\t\t\t\tvar distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2);\n\n\t\t\t\tvar pcIndex = pixels[4 * offset + 3];\n\t\t\t\tpixels[4 * offset + 3] = 0;\n\t\t\t\tvar pIndex = ibuffer[offset];\n\n\t\t\t\tif(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined))\n\t\t\t\t{\n\t\t\t\t\tvar hit = {\n\t\t\t\t\t\tpIndex: pIndex,\n\t\t\t\t\t\tpcIndex: pcIndex,\n\t\t\t\t\t\tdistanceToCenter: distance\n\t\t\t\t\t};\n\n\t\t\t\t\tif(params.all)\n\t\t\t\t\t{\n\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif(hits.length > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(distance < hits[0].distanceToCenter)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\thits[0] = hit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor(var hit of hits)\n\t\t{\n\t\t\tvar point = {};\n\n\t\t\tif(!nodes[hit.pcIndex])\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tvar node = nodes[hit.pcIndex];\n\t\t\tvar pc = node.sceneNode;\n\t\t\tvar geometry = node.geometryNode.geometry;\n\n\t\t\tfor(var attributeName in geometry.attributes)\n\t\t\t{\n\t\t\t\tvar attribute = geometry.attributes[attributeName];\n\n\t\t\t\tif(attributeName === \"position\")\n\t\t\t\t{\n\t\t\t\t\tvar x = attribute.array[3 * hit.pIndex + 0];\n\t\t\t\t\tvar y = attribute.array[3 * hit.pIndex + 1];\n\t\t\t\t\tvar z = attribute.array[3 * hit.pIndex + 2];\n\n\t\t\t\t\tvar position = new THREE.Vector3(x, y, z);\n\t\t\t\t\tposition.applyMatrix4(pc.matrixWorld);\n\n\t\t\t\t\tpoint[attributeName] = position;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\telse if(attributeName === \"indices\")\n\t\t\t\t{\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//if (values.itemSize === 1) {\n\t\t\t\t\t//\tpoint[attribute.name] = values.array[hit.pIndex];\n\t\t\t\t\t//} else {\n\t\t\t\t\t//\tvar value = [];\n\t\t\t\t\t//\tfor (var j = 0; j < values.itemSize; j++) {\n\t\t\t\t\t//\t\tvalue.push(values.array[values.itemSize * hit.pIndex + j]);\n\t\t\t\t\t//\t}\n\t\t\t\t\t//\tpoint[attribute.name] = value;\n\t\t\t\t\t//}\n\t\t\t\t}\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\thit.point = point;\n\t\t}\n\n\t\tperformance.mark(\"pick-end\");\n\t\tperformance.measure(\"pick\", \"pick-start\", \"pick-end\");\n\n\t\tif(params.all)\n\t\t{\n\t\t\treturn hits.map(hit => hit.point);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(hits.length === 0)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn hits[0].point;\n\t\t\t\t//var sorted = hits.sort((a, b) => a.distanceToCenter - b.distanceToCenter);\n\t\t\t\t//return sorted[0].point;\n\t\t\t}\n\t\t}\n\n\t};\n\n\t*getFittedBoxGen(boxNode)\n\t{\n\t\tvar shrinkedLocalBounds = new THREE.Box3();\n\t\tvar worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld);\n\n\t\tfor(var node of this.visibleNodes)\n\t\t{\n\t\t\tif(!node.sceneNode)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar buffer = node.geometryNode.buffer;\n\n\t\t\tvar posOffset = buffer.offset(\"position\");\n\t\t\tvar stride = buffer.stride;\n\t\t\tvar view = new DataView(buffer.data);\n\n\t\t\tvar objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld);\n\n\t\t\tvar pos = new THREE.Vector4();\n\t\t\tfor(var i = 0; i < buffer.numElements; i++)\n\t\t\t{\n\t\t\t\tvar x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\t\tvar y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\t\tvar z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\t\tpos.set(x, y, z, 1);\n\t\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\t\tif(-0.5 < pos.x && pos.x < 0.5)\n\t\t\t\t{\n\t\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tshrinkedLocalBounds.expandByPoint(pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tyield;\n\t\t}\n\n\n\t\tvar fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld);\n\n\t\tvar fitted = new THREE.Object3D();\n\t\tfitted.position.copy(fittedPosition);\n\t\tfitted.scale.copy(boxNode.scale);\n\t\tfitted.rotation.copy(boxNode.rotation);\n\n\t\tvar ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min);\n\t\tfitted.scale.multiply(ds);\n\n\t\tyield fitted;\n\t}\n\n\tgetFittedBox(boxNode, maxLevel = Infinity)\n\t{\n\t\tvar shrinkedLocalBounds = new THREE.Box3();\n\t\tvar worldToBox = new THREE.Matrix4().getInverse(boxNode.matrixWorld);\n\n\t\tfor(var node of this.visibleNodes)\n\t\t{\n\t\t\tif(!node.sceneNode || node.getLevel() > maxLevel)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar buffer = node.geometryNode.buffer;\n\n\t\t\tvar posOffset = buffer.offset(\"position\");\n\t\t\tvar stride = buffer.stride;\n\t\t\tvar view = new DataView(buffer.data);\n\n\t\t\tvar objectToBox = new THREE.Matrix4().multiplyMatrices(worldToBox, node.sceneNode.matrixWorld);\n\n\t\t\tvar pos = new THREE.Vector4();\n\t\t\tfor(var i = 0; i < buffer.numElements; i++)\n\t\t\t{\n\t\t\t\tvar x = view.getFloat32(i * stride + posOffset + 0, true);\n\t\t\t\tvar y = view.getFloat32(i * stride + posOffset + 4, true);\n\t\t\t\tvar z = view.getFloat32(i * stride + posOffset + 8, true);\n\n\t\t\t\tpos.set(x, y, z, 1);\n\t\t\t\tpos.applyMatrix4(objectToBox);\n\n\t\t\t\tif(-0.5 < pos.x && pos.x < 0.5)\n\t\t\t\t{\n\t\t\t\t\tif(-0.5 < pos.y && pos.y < 0.5)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(-0.5 < pos.z && pos.z < 0.5)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tshrinkedLocalBounds.expandByPoint(pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar fittedPosition = shrinkedLocalBounds.getCenter(new THREE.Vector3()).applyMatrix4(boxNode.matrixWorld);\n\n\t\tvar fitted = new THREE.Object3D();\n\t\tfitted.position.copy(fittedPosition);\n\t\tfitted.scale.copy(boxNode.scale);\n\t\tfitted.rotation.copy(boxNode.rotation);\n\n\t\tvar ds = new THREE.Vector3().subVectors(shrinkedLocalBounds.max, shrinkedLocalBounds.min);\n\t\tfitted.scale.multiply(ds);\n\n\t\treturn fitted;\n\t}\n\n\tget progress()\n\t{\n\t\treturn this.visibleNodes.length / this.visibleGeometry.length;\n\t}\n\n\tfind(name)\n\t{\n\t\tvar node = null;\n\t\tfor(var char of name)\n\t\t{\n\t\t\tif(char === \"r\")\n\t\t\t{\n\t\t\t\tnode = this.root;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnode = node.children[char];\n\t\t\t}\n\t\t}\n\n\t\treturn node;\n\t}\n};\n\nexport {PointCloudOctree, PointCloudOctreeNode};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {HelperUtils} from \"../utils/HelperUtils.js\";\nimport {PointCloudTree, PointCloudTreeNode} from \"./PointCloudTree.js\";\nimport {PointColorType } from \"../Potree.js\";\nimport {Global} from \"../Global.js\";\nimport {PointCloudMaterial} from \"./materials/PointCloudMaterial.js\";\nimport {TreeType, PointSizeType} from \"../Potree.js\";\n\nclass PointCloudArena4DNode extends PointCloudTreeNode\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis.left = null;\n\t\tthis.right = null;\n\t\tthis.sceneNode = null;\n\t\tthis.kdtree = null;\n\t}\n\n\tgetNumPoints()\n\t{\n\t\treturn this.geometryNode.numPoints;\n\t}\n\n\tisLoaded()\n\t{\n\t\treturn true;\n\t}\n\n\tisTreeNode()\n\t{\n\t\treturn true;\n\t}\n\n\tisGeometryNode()\n\t{\n\t\treturn false;\n\t}\n\n\tgetLevel()\n\t{\n\t\treturn this.geometryNode.level;\n\t}\n\n\tgetBoundingSphere()\n\t{\n\t\treturn this.geometryNode.boundingSphere;\n\t}\n\n\tgetBoundingBox()\n\t{\n\t\treturn this.geometryNode.boundingBox;\n\t}\n\n\ttoTreeNode(child)\n\t{\n\t\tvar geometryNode = null;\n\n\t\tif(this.left === child)\n\t\t{\n\t\t\tgeometryNode = this.left;\n\t\t}\n\t\telse if(this.right === child)\n\t\t{\n\t\t\tgeometryNode = this.right;\n\t\t}\n\n\t\tif(!geometryNode.loaded)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar node = new PointCloudArena4DNode();\n\t\tvar sceneNode = THREE.PointCloud(geometryNode.geometry, this.kdtree.material);\n\t\tsceneNode.visible = false;\n\n\t\tnode.kdtree = this.kdtree;\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.parent = this;\n\t\tnode.left = this.geometryNode.left;\n\t\tnode.right = this.geometryNode.right;\n\t}\n\n\tgetChildren()\n\t{\n\t\tvar children = [];\n\n\t\tif(this.left)\n\t\t{\n\t\t\tchildren.push(this.left);\n\t\t}\n\n\t\tif(this.right)\n\t\t{\n\t\t\tchildren.push(this.right);\n\t\t}\n\n\t\treturn children;\n\t}\n};\n\nclass PointCloudArena4D extends PointCloudTree\n{\n\tconstructor(geometry)\n\t{\n\t\tsuper();\n\n\t\tthis.root = null;\n\t\tif(geometry.root)\n\t\t{\n\t\t\tthis.root = geometry.root;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tgeometry.addEventListener(\"hierarchy_loaded\", () =>\n\t\t\t{\n\t\t\t\tthis.root = geometry.root;\n\t\t\t});\n\t\t}\n\n\t\tthis.visiblePointsTarget = 2 * 1000 * 1000;\n\t\tthis.minimumNodePixelSize = 150;\n\n\t\tthis.position.sub(geometry.offset);\n\t\tthis.updateMatrix();\n\n\t\tthis.numVisibleNodes = 0;\n\t\tthis.numVisiblePoints = 0;\n\n\t\tthis.boundingBoxNodes = [];\n\t\tthis.loadQueue = [];\n\t\tthis.visibleNodes = [];\n\n\t\tthis.pcoGeometry = geometry;\n\t\tthis.boundingBox = this.pcoGeometry.boundingBox;\n\t\tthis.boundingSphere = this.pcoGeometry.boundingSphere;\n\t\tthis.material = new PointCloudMaterial(\n\t\t{\n\t\t\tvertexColors: THREE.VertexColors,\n\t\t\tsize: 0.05,\n\t\t\ttreeType: TreeType.KDTREE\n\t\t});\n\t\tthis.material.sizeType = PointSizeType.ATTENUATED;\n\t\tthis.material.size = 0.05;\n\t\tthis.profileRequests = [];\n\t\tthis.name = \"\";\n\t}\n\n\tgetBoundingBoxWorld()\n\t{\n\t\tthis.updateMatrixWorld(true);\n\t\tvar box = this.boundingBox;\n\t\tvar transform = this.matrixWorld;\n\t\tvar tBox = HelperUtils.computeTransformedBoundingBox(box, transform);\n\n\t\treturn tBox;\n\t};\n\n\tsetName(name)\n\t{\n\t\tif(this.name !== name)\n\t\t{\n\t\t\tthis.name = name;\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"name_changed\",\n\t\t\t\tname: name,\n\t\t\t\tpointcloud: this\n\t\t\t});\n\t\t}\n\t}\n\n\tgetName()\n\t{\n\t\treturn this.name;\n\t}\n\n\tgetLevel()\n\t{\n\t\treturn this.level;\n\t}\n\n\ttoTreeNode(geometryNode, parent)\n\t{\n\t\tvar node = new PointCloudArena4DNode();\n\n\t\tvar sceneNode = new THREE.Points(geometryNode.geometry, this.material);\n\t\tsceneNode.frustumCulled = true;\n\t\tsceneNode.onBeforeRender = (_this, scene, camera, geometry, material, group) =>\n\t\t{\n\t\t\tif(material.program)\n\t\t\t{\n\t\t\t\t_this.getContext().useProgram(material.program.program);\n\n\t\t\t\tif(material.program.getUniforms().map.level)\n\t\t\t\t{\n\t\t\t\t\tvar level = geometryNode.getLevel();\n\t\t\t\t\tmaterial.uniforms.level.value = level;\n\t\t\t\t\tmaterial.program.getUniforms().map.level.setValue(_this.getContext(), level);\n\t\t\t\t}\n\n\t\t\t\tif(this.visibleNodeTextureOffsets && material.program.getUniforms().map.vnStart)\n\t\t\t\t{\n\t\t\t\t\tvar vnStart = this.visibleNodeTextureOffsets.get(node);\n\t\t\t\t\tmaterial.uniforms.vnStart.value = vnStart;\n\t\t\t\t\tmaterial.program.getUniforms().map.vnStart.setValue(_this.getContext(), vnStart);\n\t\t\t\t}\n\n\t\t\t\tif(material.program.getUniforms().map.pcIndex)\n\t\t\t\t{\n\t\t\t\t\tvar i = node.pcIndex ? node.pcIndex : this.visibleNodes.indexOf(node);\n\t\t\t\t\tmaterial.uniforms.pcIndex.value = i;\n\t\t\t\t\tmaterial.program.getUniforms().map.pcIndex.setValue(_this.getContext(), i);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tnode.geometryNode = geometryNode;\n\t\tnode.sceneNode = sceneNode;\n\t\tnode.pointcloud = this;\n\t\tnode.left = geometryNode.left;\n\t\tnode.right = geometryNode.right;\n\n\t\tif(!parent)\n\t\t{\n\t\t\tthis.root = node;\n\t\t\tthis.add(sceneNode);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tparent.sceneNode.add(sceneNode);\n\n\t\t\tif(parent.left === geometryNode)\n\t\t\t{\n\t\t\t\tparent.left = node;\n\t\t\t}\n\t\t\telse if(parent.right === geometryNode)\n\t\t\t{\n\t\t\t\tparent.right = node;\n\t\t\t}\n\t\t}\n\n\t\tvar disposeListener = function()\n\t\t{\n\t\t\tparent.sceneNode.remove(node.sceneNode);\n\n\t\t\tif(parent.left === node)\n\t\t\t{\n\t\t\t\tparent.left = geometryNode;\n\t\t\t}\n\t\t\telse if(parent.right === node)\n\t\t\t{\n\t\t\t\tparent.right = geometryNode;\n\t\t\t}\n\t\t};\n\t\tgeometryNode.oneTimeDisposeHandlers.push(disposeListener);\n\n\t\treturn node;\n\t}\n\n\tupdateMaterial(material, visibleNodes, camera, renderer)\n\t{\n\t\tmaterial.fov = camera.fov * (Math.PI / 180);\n\t\tmaterial.screenWidth = renderer.domElement.clientWidth;\n\t\tmaterial.screenHeight = renderer.domElement.clientHeight;\n\t\tmaterial.spacing = this.pcoGeometry.spacing;\n\t\tmaterial.near = camera.near;\n\t\tmaterial.far = camera.far;\n\n\t\t//reduce shader source updates by setting maxLevel slightly higher than actually necessary\n\t\tif(this.maxLevel > material.levels)\n\t\t{\n\t\t\tmaterial.levels = this.maxLevel + 2;\n\t\t}\n\n\t\t//material.uniforms.octreeSize.value = this.boundingBox.size().x;\n\t\tvar bbSize = this.boundingBox.getSize(new THREE.Vector3());\n\t\tmaterial.bbSize = [bbSize.x, bbSize.y, bbSize.z];\n\t}\n\n\tupdateVisibleBounds()\n\t{\n\n\t}\n\n\thideDescendants(object)\n\t{\n\t\tvar stack = [];\n\t\tfor(var i = 0; i < object.children.length; i++)\n\t\t{\n\t\t\tvar child = object.children[i];\n\t\t\tif(child.visible)\n\t\t\t{\n\t\t\t\tstack.push(child);\n\t\t\t}\n\t\t}\n\n\t\twhile(stack.length > 0)\n\t\t{\n\t\t\tvar child = stack.shift();\n\n\t\t\tchild.visible = false;\n\t\t\tif(child.boundingBoxNode)\n\t\t\t{\n\t\t\t\tchild.boundingBoxNode.visible = false;\n\t\t\t}\n\n\t\t\tfor(var i = 0; i < child.children.length; i++)\n\t\t\t{\n\t\t\t\tvar childOfChild = child.children[i];\n\t\t\t\tif(childOfChild.visible)\n\t\t\t\t{\n\t\t\t\t\tstack.push(childOfChild);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateMatrixWorld(force)\n\t{\n\t\t//node.matrixWorld.multiplyMatrices( node.parent.matrixWorld, node.matrix );\n\n\t\tif(this.matrixAutoUpdate === true) this.updateMatrix();\n\n\t\tif(this.matrixWorldNeedsUpdate === true || force === true)\n\t\t{\n\t\t\tif(this.parent === undefined)\n\t\t\t{\n\t\t\t\tthis.matrixWorld.copy(this.matrix);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\t\t}\n\t}\n\n\tnodesOnRay(nodes, ray)\n\t{\n\t\tvar nodesOnRay = [];\n\n\t\tvar _ray = ray.clone();\n\t\tfor(var i = 0; i < nodes.length; i++)\n\t\t{\n\t\t\tvar node = nodes[i];\n\t\t\tvar sphere = node.getBoundingSphere(new THREE.Sphere()).clone().applyMatrix4(node.sceneNode.matrixWorld);\n\t\t\t//TODO Unused: var box = node.getBoundingBox().clone().applyMatrix4(node.sceneNode.matrixWorld);\n\n\t\t\tif(_ray.intersectsSphere(sphere))\n\t\t\t{\n\t\t\t\tnodesOnRay.push(node);\n\t\t\t}\n\t\t\t//if(_ray.isIntersectionBox(box)){\n\t\t\t//\tnodesOnRay.push(node);\n\t\t\t//}\n\t\t}\n\n\t\treturn nodesOnRay;\n\t}\n\n\tpick(viewer, camera, ray, params = {})\n\t{\n\n\t\tvar renderer = viewer.renderer;\n\t\tvar pRenderer = viewer.pRenderer;\n\n\t\tperformance.mark(\"pick-start\");\n\n\t\tvar getVal = (a, b) => a !== undefined ? a : b;\n\n\t\tvar pickWindowSize = getVal(params.pickWindowSize, 17);\n\n\t\tvar size = renderer.getSize(new THREE.Vector3());\n\n\t\tvar width = Math.ceil(getVal(params.width, size.width));\n\t\tvar height = Math.ceil(getVal(params.height, size.height));\n\n\t\tvar pointSizeType = getVal(params.pointSizeType, this.material.pointSizeType);\n\t\tvar pointSize = getVal(params.pointSize, this.material.size);\n\n\t\tvar nodes = this.nodesOnRay(this.visibleNodes, ray);\n\n\t\tif(nodes.length === 0)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tif(!this.pickState)\n\t\t{\n\t\t\tvar scene = new THREE.Scene();\n\n\t\t\tvar material = new PointCloudMaterial();\n\t\t\tmaterial.pointColorType = PointColorType.POINT_INDEX;\n\n\t\t\tvar renderTarget = new THREE.WebGLRenderTarget(\n\t\t\t\t1, 1,\n\t\t\t\t{\n\t\t\t\t\tminFilter: THREE.LinearFilter,\n\t\t\t\t\tmagFilter: THREE.NearestFilter,\n\t\t\t\t\tformat: THREE.RGBAFormat\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tthis.pickState = {\n\t\t\t\trenderTarget: renderTarget,\n\t\t\t\tmaterial: material,\n\t\t\t\tscene: scene\n\t\t\t};\n\t\t};\n\n\t\tvar pickState = this.pickState;\n\t\tvar pickMaterial = pickState.material;\n\t\tthis.updateMaterial(pickMaterial, nodes, camera, renderer);\n\n\t\tpickState.renderTarget.setSize(width, height);\n\n\t\tvar pixelPos = new THREE.Vector2(params.x, params.y);\n\n\t\tvar gl = renderer.getContext();\n\t\tgl.enable(gl.SCISSOR_TEST);\n\t\tgl.scissor(parseInt(pixelPos.x - (pickWindowSize - 1) / 2), parseInt(pixelPos.y - (pickWindowSize - 1) / 2), parseInt(pickWindowSize), parseInt(pickWindowSize));\n\n\t\trenderer.state.buffers.depth.setTest(pickMaterial.depthTest);\n\t\trenderer.state.buffers.depth.setMask(pickMaterial.depthWrite);\n\t\trenderer.state.setBlending(THREE.NoBlending);\n\n\t\trenderer.clearTarget(pickState.renderTarget, true, true, true);\n\t\trenderer.setRenderTarget(pickState.renderTarget);\n\t\t\n\t\tgl.clearColor(0, 0, 0, 0);\n\t\trenderer.clearTarget(pickState.renderTarget, true, true, true);\n\n\t\tvar tmp = this.material;\n\t\tthis.material = pickMaterial;\n\n\t\tpRenderer.renderOctree(this, nodes, camera, pickState.renderTarget);\n\n\t\tthis.material = tmp;\n\n\t\tvar clamp = (number, min, max) => Math.min(Math.max(min, number), max);\n\n\t\tvar x = parseInt(clamp(pixelPos.x - (pickWindowSize - 1) / 2, 0, width));\n\t\tvar y = parseInt(clamp(pixelPos.y - (pickWindowSize - 1) / 2, 0, height));\n\t\tvar w = parseInt(Math.min(x + pickWindowSize, width) - x);\n\t\tvar h = parseInt(Math.min(y + pickWindowSize, height) - y);\n\n\t\tvar pixelCount = w * h;\n\t\tvar buffer = new Uint8Array(4 * pixelCount);\n\n\t\tgl.readPixels(x, y, pickWindowSize, pickWindowSize, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n\n\t\trenderer.setRenderTarget(null);\n\t\trenderer.resetGLState();\n\t\trenderer.setScissorTest(false);\n\t\tgl.disable(gl.SCISSOR_TEST);\n\n\t\tvar pixels = buffer;\n\t\tvar ibuffer = new Uint32Array(buffer.buffer);\n\n\t\t//find closest hit inside pixelWindow boundaries\n\t\tvar min = Number.MAX_VALUE;\n\t\tvar hits = [];\n\t\tfor(var u = 0; u < pickWindowSize; u++)\n\t\t{\n\t\t\tfor(var v = 0; v < pickWindowSize; v++)\n\t\t\t{\n\t\t\t\tvar offset = (u + v * pickWindowSize);\n\t\t\t\tvar distance = Math.pow(u - (pickWindowSize - 1) / 2, 2) + Math.pow(v - (pickWindowSize - 1) / 2, 2);\n\n\t\t\t\tvar pcIndex = pixels[4 * offset + 3];\n\t\t\t\tpixels[4 * offset + 3] = 0;\n\t\t\t\tvar pIndex = ibuffer[offset];\n\n\t\t\t\tif(!(pcIndex === 0 && pIndex === 0) && (pcIndex !== undefined) && (pIndex !== undefined))\n\t\t\t\t{\n\t\t\t\t\tvar hit = {\n\t\t\t\t\t\tpIndex: pIndex,\n\t\t\t\t\t\tpcIndex: pcIndex,\n\t\t\t\t\t\tdistanceToCenter: distance\n\t\t\t\t\t};\n\n\t\t\t\t\tif(params.all)\n\t\t\t\t\t{\n\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif(hits.length > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(distance < hits[0].distanceToCenter)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\thits[0] = hit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thits.push(hit);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor(var hit of hits)\n\t\t{\n\t\t\tvar point = {};\n\n\t\t\tif(!nodes[hit.pcIndex])\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tvar node = nodes[hit.pcIndex];\n\t\t\tvar pc = node.sceneNode;\n\t\t\tvar geometry = node.geometryNode.geometry;\n\n\t\t\tfor(var attributeName in geometry.attributes)\n\t\t\t{\n\t\t\t\tvar attribute = geometry.attributes[attributeName];\n\n\t\t\t\tif(attributeName === \"position\")\n\t\t\t\t{\n\t\t\t\t\tvar x = attribute.array[3 * hit.pIndex + 0];\n\t\t\t\t\tvar y = attribute.array[3 * hit.pIndex + 1];\n\t\t\t\t\tvar z = attribute.array[3 * hit.pIndex + 2];\n\n\t\t\t\t\tvar position = new THREE.Vector3(x, y, z);\n\t\t\t\t\tposition.applyMatrix4(pc.matrixWorld);\n\n\t\t\t\t\tpoint[attributeName] = position;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thit.point = point;\n\t\t}\n\n\t\tperformance.mark(\"pick-end\");\n\t\tperformance.measure(\"pick\", \"pick-start\", \"pick-end\");\n\n\t\tif(params.all)\n\t\t{\n\t\t\treturn hits.map(hit => hit.point);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(hits.length === 0)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn hits[0].point;\n\t\t\t}\n\t\t}\n\t}\n\n\tcomputeVisibilityTextureData(nodes)\n\t{\n\t\tif(Global.measureTimings)\n\t\t{\n\t\t\tperformance.mark(\"computeVisibilityTextureData-start\");\n\t\t}\n\n\t\tvar data = new Uint8Array(nodes.length * 3);\n\t\tvar visibleNodeTextureOffsets = new Map();\n\n\t\t//copy array\n\t\tnodes = nodes.slice();\n\n\t\t//sort by level and number\n\t\tvar sort = function(a, b)\n\t\t{\n\t\t\tvar la = a.geometryNode.level;\n\t\t\tvar lb = b.geometryNode.level;\n\t\t\tvar na = a.geometryNode.number;\n\t\t\tvar nb = b.geometryNode.number;\n\t\t\tif(la !== lb) return la - lb;\n\t\t\tif(na < nb) return -1;\n\t\t\tif(na > nb) return 1;\n\t\t\treturn 0;\n\t\t};\n\t\tnodes.sort(sort);\n\n\t\tvar visibleNodeNames = [];\n\t\tfor(var i = 0; i < nodes.length; i++)\n\t\t{\n\t\t\tvisibleNodeNames.push(nodes[i].geometryNode.number);\n\t\t}\n\n\t\tfor(var i = 0; i < nodes.length; i++)\n\t\t{\n\t\t\tvar node = nodes[i];\n\n\t\t\tvisibleNodeTextureOffsets.set(node, i);\n\n\t\t\tvar b1 = 0; //children\n\t\t\tvar b2 = 0; //offset to first child\n\t\t\tvar b3 = 0; //split\n\n\t\t\tif(node.geometryNode.left && visibleNodeNames.indexOf(node.geometryNode.left.number) > 0)\n\t\t\t{\n\t\t\t\tb1 += 1;\n\t\t\t\tb2 = visibleNodeNames.indexOf(node.geometryNode.left.number) - i;\n\t\t\t}\n\t\t\tif(node.geometryNode.right && visibleNodeNames.indexOf(node.geometryNode.right.number) > 0)\n\t\t\t{\n\t\t\t\tb1 += 2;\n\t\t\t\tb2 = (b2 === 0) ? visibleNodeNames.indexOf(node.geometryNode.right.number) - i : b2;\n\t\t\t}\n\n\t\t\tif(node.geometryNode.split === \"X\")\n\t\t\t{\n\t\t\t\tb3 = 1;\n\t\t\t}\n\t\t\telse if(node.geometryNode.split === \"Y\")\n\t\t\t{\n\t\t\t\tb3 = 2;\n\t\t\t}\n\t\t\telse if(node.geometryNode.split === \"Z\")\n\t\t\t{\n\t\t\t\tb3 = 4;\n\t\t\t}\n\n\t\t\tdata[i * 3 + 0] = b1;\n\t\t\tdata[i * 3 + 1] = b2;\n\t\t\tdata[i * 3 + 2] = b3;\n\t\t}\n\n\t\tif(Global.measureTimings)\n\t\t{\n\t\t\tperformance.mark(\"computeVisibilityTextureData-end\");\n\t\t\tperformance.measure(\"render.computeVisibilityTextureData\", \"computeVisibilityTextureData-start\", \"computeVisibilityTextureData-end\");\n\t\t}\n\n\t\treturn {\n\t\t\tdata: data,\n\t\t\toffsets: visibleNodeTextureOffsets\n\t\t};\n\t}\n\n\tget progress()\n\t{\n\t\tif(this.pcoGeometry.root)\n\t\t{\n\t\t\treturn Global.numNodesLoading > 0 ? 0 : 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t}\n};\n\nexport {PointCloudArena4D, PointCloudArena4DNode};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport {PointAttributes, PointAttribute} from \"../../PointAttributes.js\";\nimport {Global} from \"../../Global.js\";\nimport {XHRFactory} from \"../../XHRFactory.js\";\n\nclass PointCloudArena4DGeometryNode\n{\n\tconstructor()\n\t{\n\t\tthis.left = null;\n\t\tthis.right = null;\n\t\tthis.boundingBox = null;\n\t\tthis.number = null;\n\t\tthis.pcoGeometry = null;\n\t\tthis.loaded = false;\n\t\tthis.numPoints = 0;\n\t\tthis.level = 0;\n\t\tthis.children = [];\n\t\tthis.oneTimeDisposeHandlers = [];\n\t}\n\n\tisGeometryNode()\n\t{\n\t\treturn true;\n\t}\n\n\tisTreeNode()\n\t{\n\t\treturn false;\n\t}\n\n\tisLoaded()\n\t{\n\t\treturn this.loaded;\n\t}\n\n\tgetBoundingSphere()\n\t{\n\t\treturn this.boundingSphere;\n\t}\n\n\tgetBoundingBox()\n\t{\n\t\treturn this.boundingBox;\n\t}\n\n\tgetChildren()\n\t{\n\t\tvar children = [];\n\n\t\tif(this.left)\n\t\t{\n\t\t\tchildren.push(this.left);\n\t\t}\n\n\t\tif(this.right)\n\t\t{\n\t\t\tchildren.push(this.right);\n\t\t}\n\n\t\treturn children;\n\t}\n\n\tgetLevel()\n\t{\n\t\treturn this.level;\n\t}\n\n\tload()\n\t{\n\t\tif(this.loaded || this.loading)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif(Global.numNodesLoading >= Global.maxNodesLoading)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis.loading = true;\n\n\t\tGlobal.numNodesLoading++;\n\n\t\tvar self = this;\n\t\tvar url = this.pcoGeometry.url + \"?node=\" + this.number;\n\t\t\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.onload = function()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar buffer = xhr.response;\n\t\t\t\tvar sourceView = new DataView(buffer);\n\t\t\t\tvar numPoints = buffer.byteLength / 17;\n\t\t\t\tvar bytesPerPoint = 28;\n\n\t\t\t\tvar data = new ArrayBuffer(numPoints * bytesPerPoint);\n\t\t\t\tvar targetView = new DataView(data);\n\n\t\t\t\tvar attributes = [\n\t\t\t\t\tPointAttribute.POSITION_CARTESIAN,\n\t\t\t\t\tPointAttribute.RGBA_PACKED,\n\t\t\t\t\tPointAttribute.INTENSITY,\n\t\t\t\t\tPointAttribute.CLASSIFICATION,\n\t\t\t\t];\n\n\t\t\t\tvar position = new Float32Array(numPoints * 3);\n\t\t\t\tvar color = new Uint8Array(numPoints * 4);\n\t\t\t\tvar intensities = new Float32Array(numPoints);\n\t\t\t\tvar classifications = new Uint8Array(numPoints);\n\t\t\t\tvar indices = new ArrayBuffer(numPoints * 4);\n\t\t\t\tvar u32Indices = new Uint32Array(indices);\n\n\t\t\t\tvar tightBoundingBox = new THREE.Box3();\n\n\t\t\t\tfor(var i = 0; i < numPoints; i++)\n\t\t\t\t{\n\t\t\t\t\tvar x = sourceView.getFloat32(i * 17 + 0, true) + self.boundingBox.min.x;\n\t\t\t\t\tvar y = sourceView.getFloat32(i * 17 + 4, true) + self.boundingBox.min.y;\n\t\t\t\t\tvar z = sourceView.getFloat32(i * 17 + 8, true) + self.boundingBox.min.z;\n\n\t\t\t\t\tvar r = sourceView.getUint8(i * 17 + 12, true);\n\t\t\t\t\tvar g = sourceView.getUint8(i * 17 + 13, true);\n\t\t\t\t\tvar b = sourceView.getUint8(i * 17 + 14, true);\n\n\t\t\t\t\tvar intensity = sourceView.getUint8(i * 17 + 15, true);\n\n\t\t\t\t\tvar classification = sourceView.getUint8(i * 17 + 16, true);\n\n\t\t\t\t\ttightBoundingBox.expandByPoint(new THREE.Vector3(x, y, z));\n\n\t\t\t\t\tposition[i * 3 + 0] = x;\n\t\t\t\t\tposition[i * 3 + 1] = y;\n\t\t\t\t\tposition[i * 3 + 2] = z;\n\n\t\t\t\t\tcolor[i * 4 + 0] = r;\n\t\t\t\t\tcolor[i * 4 + 1] = g;\n\t\t\t\t\tcolor[i * 4 + 2] = b;\n\t\t\t\t\tcolor[i * 4 + 3] = 255;\n\n\t\t\t\t\tintensities[i] = intensity;\n\t\t\t\t\tclassifications[i] = classification;\n\n\t\t\t\t\tu32Indices[i] = i;\n\t\t\t\t}\n\n\t\t\t\tvar geometry = new THREE.BufferGeometry();\n\t\t\t\tgeometry.setAttribute(\"position\", new THREE.BufferAttribute(position, 3));\n\t\t\t\tgeometry.setAttribute(\"color\", new THREE.BufferAttribute(color, 4, true));\n\t\t\t\tgeometry.setAttribute(\"intensity\", new THREE.BufferAttribute(intensities, 1));\n\t\t\t\tgeometry.setAttribute(\"classification\", new THREE.BufferAttribute(classifications, 1));\n\t\t\t\t{\n\t\t\t\t\tvar bufferAttribute = new THREE.BufferAttribute(new Uint8Array(indices), 4, true);\n\t\t\t\t\tgeometry.setAttribute(\"indices\", bufferAttribute);\n\t\t\t\t}\n\n\t\t\t\tself.geometry = geometry;\n\t\t\t\tself.numPoints = numPoints;\n\t\t\t\tself.loaded = true;\n\t\t\t\tself.loading = false;\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t}\n\t\t\tcatch(e)\n\t\t\t{\n\t\t\t\tconsole.error(\"Potree: Exception thrown parsing points.\", e);\n\t\t\t\tGlobal.numNodesLoading--;\n\t\t\t}\n\n\t\t};\n\t\txhr.onerror = function()\n\t\t{\n\t\t\tGlobal.numNodesLoading--;\n\t\t\tconsole.log(\"Potree: Failed to load file, \" + xhr.status + \", file: \" + url);\n\t\t};\n\t\txhr.send(null);\n\t}\n\n\tdispose()\n\t{\n\t\tif(this.geometry && this.parent != null)\n\t\t{\n\t\t\tthis.geometry.dispose();\n\t\t\tthis.geometry = null;\n\t\t\tthis.loaded = false;\n\n\t\t\t//this.dispatchEvent( { type: \"dispose\" } );\n\t\t\tfor(var i = 0; i < this.oneTimeDisposeHandlers.length; i++)\n\t\t\t{\n\t\t\t\tvar handler = this.oneTimeDisposeHandlers[i];\n\t\t\t\thandler();\n\t\t\t}\n\t\t\tthis.oneTimeDisposeHandlers = [];\n\t\t}\n\t}\n\n\tgetNumPoints()\n\t{\n\t\treturn this.numPoints;\n\t}\n};\n\nclass PointCloudArena4DGeometry extends THREE.EventDispatcher\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis.numPoints = 0;\n\t\tthis.version = 0;\n\t\tthis.boundingBox = null;\n\t\tthis.numNodes = 0;\n\t\tthis.name = null;\n\t\tthis.provider = null;\n\t\tthis.url = null;\n\t\tthis.root = null;\n\t\tthis.levels = 0;\n\t\tthis._spacing = null;\n\t\tthis.pointAttributes = new PointAttributes([\n\t\t\t\"POSITION_CARTESIAN\",\n\t\t\t\"COLOR_PACKED\"\n\t\t]);\n\t}\n\n\tstatic load(url, callback)\n\t{\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", url + \"?info\", true);\n\n\t\txhr.onreadystatechange = function()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(xhr.readyState === 4 && xhr.status === 200)\n\t\t\t\t{\n\t\t\t\t\tvar response = JSON.parse(xhr.responseText);\n\n\t\t\t\t\tvar geometry = new PointCloudArena4DGeometry();\n\t\t\t\t\tgeometry.url = url;\n\t\t\t\t\tgeometry.name = response.Name;\n\t\t\t\t\tgeometry.provider = response.Provider;\n\t\t\t\t\tgeometry.numNodes = response.Nodes;\n\t\t\t\t\tgeometry.numPoints = response.Points;\n\t\t\t\t\tgeometry.version = response.Version;\n\t\t\t\t\tgeometry.boundingBox = new THREE.Box3(\n\t\t\t\t\t\tnew THREE.Vector3().fromArray(response.BoundingBox.slice(0, 3)),\n\t\t\t\t\t\tnew THREE.Vector3().fromArray(response.BoundingBox.slice(3, 6))\n\t\t\t\t\t);\n\t\t\t\t\tif(response.Spacing)\n\t\t\t\t\t{\n\t\t\t\t\t\tgeometry.spacing = response.Spacing;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar offset = geometry.boundingBox.min.clone().multiplyScalar(-1);\n\n\t\t\t\t\tgeometry.boundingBox.min.add(offset);\n\t\t\t\t\tgeometry.boundingBox.max.add(offset);\n\t\t\t\t\tgeometry.offset = offset;\n\n\t\t\t\t\tvar center = new THREE.Vector3();\n\t\t\t\t\tgeometry.boundingBox.getCenter(center);\n\t\t\t\t\tvar radius = geometry.boundingBox.getSize(new THREE.Vector3()).length() / 2;\n\t\t\t\t\tgeometry.boundingSphere = new THREE.Sphere(center, radius);\n\n\t\t\t\t\tgeometry.loadHierarchy();\n\n\t\t\t\t\tcallback(geometry);\n\t\t\t\t}\n\t\t\t\telse if(xhr.readyState === 4)\n\t\t\t\t{\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch(e)\n\t\t\t{\n\t\t\t\tconsole.error(e.message);\n\t\t\t\tcallback(null);\n\t\t\t}\n\t\t};\n\n\t\txhr.send(null);\n\t};\n\n\tloadHierarchy()\n\t{\n\t\tvar url = this.url + \"?tree\";\n\t\t\n\t\tvar xhr = XHRFactory.createXMLHttpRequest();\n\t\txhr.overrideMimeType(\"text/plain\");\n\t\txhr.open(\"GET\", url, true);\n\t\txhr.responseType = \"arraybuffer\";\n\n\t\txhr.onreadystatechange = () =>\n\t\t{\n\t\t\tif(!(xhr.readyState === 4 && xhr.status === 200))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar buffer = xhr.response;\n\t\t\tvar numNodes = buffer.byteLength / 3;\n\t\t\tvar view = new DataView(buffer);\n\t\t\tvar stack = [];\n\t\t\tvar root = null;\n\n\t\t\tvar levels = 0;\n\n\t\t\t//TODO Debug: var start = new Date().getTime();\n\t\t\t//read hierarchy\n\t\t\tfor(var i = 0; i < numNodes; i++)\n\t\t\t{\n\t\t\t\tvar mask = view.getUint8(i * 3 + 0, true);\n\n\t\t\t\tvar hasLeft = (mask & 1) > 0;\n\t\t\t\tvar hasRight = (mask & 2) > 0;\n\t\t\t\tvar splitX = (mask & 4) > 0;\n\t\t\t\tvar splitY = (mask & 8) > 0;\n\t\t\t\tvar splitZ = (mask & 16) > 0;\n\t\t\t\tvar split = null;\n\t\t\t\tif(splitX)\n\t\t\t\t{\n\t\t\t\t\tsplit = \"X\";\n\t\t\t\t}\n\t\t\t\telse if(splitY)\n\t\t\t\t{\n\t\t\t\t\tsplit = \"Y\";\n\t\t\t\t}\n\t\t\t\tif(splitZ)\n\t\t\t\t{\n\t\t\t\t\tsplit = \"Z\";\n\t\t\t\t}\n\n\t\t\t\tvar node = new PointCloudArena4DGeometryNode();\n\t\t\t\tnode.hasLeft = hasLeft;\n\t\t\t\tnode.hasRight = hasRight;\n\t\t\t\tnode.split = split;\n\t\t\t\tnode.isLeaf = !hasLeft && !hasRight;\n\t\t\t\tnode.number = i;\n\t\t\t\tnode.left = null;\n\t\t\t\tnode.right = null;\n\t\t\t\tnode.pcoGeometry = this;\n\t\t\t\tnode.level = stack.length;\n\t\t\t\tlevels = Math.max(levels, node.level);\n\n\t\t\t\t\n\n\t\t\t\tif(stack.length > 0)\n\t\t\t\t{\n\t\t\t\t\tvar parent = stack[stack.length - 1];\n\t\t\t\t\tnode.boundingBox = parent.boundingBox.clone();\n\t\t\t\t\tvar parentBBSize = parent.boundingBox.getSize(new THREE.Vector3());\n\n\t\t\t\t\tif(parent.hasLeft && !parent.left)\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.left = node;\n\t\t\t\t\t\tparent.children.push(node);\n\n\t\t\t\t\t\tif(parent.split === \"X\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnode.boundingBox.max.x = node.boundingBox.min.x + parentBBSize.x / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(parent.split === \"Y\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnode.boundingBox.max.y = node.boundingBox.min.y + parentBBSize.y / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(parent.split === \"Z\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnode.boundingBox.max.z = node.boundingBox.min.z + parentBBSize.z / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar center = new THREE.Vector3();\n\t\t\t\t\t\tnode.boundingBox.getCenter(center);\n\t\t\t\t\t\tvar radius = node.boundingBox.getSize(new THREE.Vector3()).length() / 2;\n\t\t\t\t\t\tnode.boundingSphere = new THREE.Sphere(center, radius);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tparent.right = node;\n\t\t\t\t\t\tparent.children.push(node);\n\n\t\t\t\t\t\tif(parent.split === \"X\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnode.boundingBox.min.x = node.boundingBox.min.x + parentBBSize.x / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(parent.split === \"Y\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnode.boundingBox.min.y = node.boundingBox.min.y + parentBBSize.y / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(parent.split === \"Z\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnode.boundingBox.min.z = node.boundingBox.min.z + parentBBSize.z / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar center = new THREE.Vector3();\n\t\t\t\t\t\tnode.boundingBox.getCenter(center);\n\t\t\t\t\t\tvar radius = node.boundingBox.getSize(new THREE.Vector3()).length() / 2;\n\t\t\t\t\t\tnode.boundingSphere = new THREE.Sphere(center, radius);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\troot = node;\n\t\t\t\t\troot.boundingBox = this.boundingBox.clone();\n\n\t\t\t\t\tvar center = new THREE.Vector3();\n\t\t\t\t\troot.boundingBox.getCenter(center);\n\t\t\t\t\tvar radius = root.boundingBox.getSize(new THREE.Vector3()).length() / 2;\n\t\t\t\t\troot.boundingSphere = new THREE.Sphere(center, radius);\n\t\t\t\t}\n\n\t\t\t\tvar bbSize = node.boundingBox.getSize(new THREE.Vector3());\n\t\t\t\tnode.spacing = ((bbSize.x + bbSize.y + bbSize.z) / 3) / 75;\n\t\t\t\tnode.estimatedSpacing = node.spacing;\n\n\t\t\t\tstack.push(node);\n\n\t\t\t\tif(node.isLeaf)\n\t\t\t\t{\n\t\t\t\t\tvar done = false;\n\t\t\t\t\twhile(!done && stack.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tstack.pop();\n\n\t\t\t\t\t\tvar top = stack[stack.length - 1];\n\n\t\t\t\t\t\tdone = stack.length > 0 && top.hasRight && top.right == null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.root = root;\n\t\t\tthis.levels = levels;\n\n\t\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype: \"hierarchy_loaded\"\n\t\t\t});\n\t\t};\n\n\t\txhr.send(null);\n\t};\n\n\tget spacing()\n\t{\n\t\tif(this._spacing)\n\t\t{\n\t\t\treturn this._spacing;\n\t\t}\n\t\telse if(this.root)\n\t\t{\n\t\t\treturn this.root.spacing;\n\t\t}\n\t}\n\n\tset spacing(value)\n\t{\n\t\tthis._spacing = value;\n\t}\n};\n\nexport {PointCloudArena4DGeometry, PointCloudArena4DGeometryNode};\n","/*\n** Binary Heap implementation in Javascript\n** From: http://eloquentjavascript.net/1st_edition/appendix2.htmlt\n**\n** Copyright (c) 2007 Marijn Haverbeke, last modified on November 28 2013.\n**\n** Licensed under a Creative Commons attribution-noncommercial license. \n** All code in this book may also be considered licensed under an MIT license.\n*/\n\nfunction BinaryHeap(scoreFunction)\n{\n\tthis.content = [];\n\tthis.scoreFunction = scoreFunction;\n}\n\nBinaryHeap.prototype =\n{\n\tpush: function(element)\n\t{\n\t\t// Add the new element to the end of the array.\n\t\tthis.content.push(element);\n\t\t// Allow it to bubble up.\n\t\tthis.bubbleUp(this.content.length - 1);\n\t},\n\n\tpop: function()\n\t{\n\t\t// Store the first element so we can return it later.\n\t\tvar result = this.content[0];\n\t\t// Get the element at the end of the array.\n\t\tvar end = this.content.pop();\n\t\t// If there are any elements left, put the end element at the\n\t\t// start, and let it sink down.\n\t\tif(this.content.length > 0)\n\t\t{\n\t\t\tthis.content[0] = end;\n\t\t\tthis.sinkDown(0);\n\t\t}\n\t\treturn result;\n\t},\n\n\tremove: function(node)\n\t{\n\t\tvar length = this.content.length;\n\t\t// To remove a value, we must search through the array to find\n\t\t// it.\n\t\tfor(var i = 0; i < length; i++)\n\t\t{\n\t\t\tif(this.content[i] != node) continue;\n\t\t\t// When it is found, the process seen in 'pop' is repeated\n\t\t\t// to fill up the hole.\n\t\t\tvar end = this.content.pop();\n\t\t\t// If the element we popped was the one we needed to remove,\n\t\t\t// we're done.\n\t\t\tif(i == length - 1) break;\n\t\t\t// Otherwise, we replace the removed element with the popped\n\t\t\t// one, and allow it to float up or sink down as appropriate.\n\t\t\tthis.content[i] = end;\n\t\t\tthis.bubbleUp(i);\n\t\t\tthis.sinkDown(i);\n\t\t\tbreak;\n\t\t}\n\t},\n\n\tsize: function()\n\t{\n\t\treturn this.content.length;\n\t},\n\n\tbubbleUp: function(n)\n\t{\n\t\t// Fetch the element that has to be moved.\n\t\tvar element = this.content[n], score = this.scoreFunction(element);\n\t\t// When at 0, an element can not go up any further.\n\t\twhile(n > 0)\n\t\t{\n\t\t\t// Compute the parent element's index, and fetch it.\n\t\t\tvar parentN = Math.floor((n + 1) / 2) - 1,\n\t\t\tparent = this.content[parentN];\n\t\t\t// If the parent has a lesser score, things are in order and we\n\t\t\t// are done.\n\t\t\tif(score >= this.scoreFunction(parent))\n\t\t\t\tbreak;\n\n\t\t\t// Otherwise, swap the parent with the current element and\n\t\t\t// continue.\n\t\t\tthis.content[parentN] = element;\n\t\t\tthis.content[n] = parent;\n\t\t\tn = parentN;\n\t\t}\n\t},\n\n\tsinkDown: function(n)\n\t{\n\t\t// Look up the target element and its score.\n\t\tvar length = this.content.length,\n\t\telement = this.content[n],\n\t\telemScore = this.scoreFunction(element);\n\n\t\twhile(true)\n\t\t{\n\t\t\t// Compute the indices of the child elements.\n\t\t\tvar child2N = (n + 1) * 2, child1N = child2N - 1;\n\t\t\t// This is used to store the new position of the element,\n\t\t\t// if any.\n\t\t\tvar swap = null;\n\t\t\t// If the first child exists (is inside the array)...\n\t\t\tif(child1N < length)\n\t\t\t{\n\t\t\t\t// Look it up and compute its score.\n\t\t\t\tvar child1 = this.content[child1N],\n\t\t\t\tchild1Score = this.scoreFunction(child1);\n\t\t\t\t// If the score is less than our element's, we need to swap.\n\t\t\t\tif(child1Score < elemScore)\n\t\t\t\t\tswap = child1N;\n\t\t\t}\n\t\t\t// Do the same checks for the other child.\n\t\t\tif(child2N < length)\n\t\t\t{\n\t\t\t\tvar child2 = this.content[child2N],\n\t\t\t\tchild2Score = this.scoreFunction(child2);\n\t\t\t\tif(child2Score < (swap == null ? elemScore : child1Score))\n\t\t\t\t\tswap = child2N;\n\t\t\t}\n\n\t\t\t// No need to swap further, we are done.\n\t\t\tif(swap == null) break;\n\n\t\t\t// Otherwise, swap and continue.\n\t\t\tthis.content[n] = this.content[swap];\n\t\t\tthis.content[swap] = element;\n\t\t\tn = swap;\n\t\t}\n\t}\n};\n\nexport {BinaryHeap};\n","\"use strict\";\r\n\r\nimport * as THREE from 'three';\r\n\r\nimport { GreyhoundLoader } from \"./loaders/GreyhoundLoader.js\";\r\nimport { POCLoader } from \"./loaders/POCLoader.js\";\r\nimport { EptLoader } from \"./loaders/EptLoader.js\";\r\nimport { PointCloudOctree } from \"./pointcloud/PointCloudOctree.js\";\r\nimport { PointCloudArena4D } from \"./pointcloud/PointCloudArena4D.js\";\r\nimport { PointCloudArena4DGeometry } from \"./pointcloud/geometries/PointCloudArena4DGeometry.js\";\r\nimport { BinaryHeap } from \"./lib/BinaryHeap.js\";\r\nimport { Global } from \"./Global.js\";\r\n\r\nvar AttributeLocations =\r\n{\r\n  position: 0,\r\n  color: 1,\r\n  intensity: 2,\r\n  classification: 3,\r\n  returnNumber: 4,\r\n  numberOfReturns: 5,\r\n  pointSourceID: 6,\r\n  indices: 7,\r\n  normal: 8,\r\n  spacing: 9,\r\n};\r\n\r\nvar Classification =\r\n{\r\n  DEFAULT:\r\n  {\r\n    0: new THREE.Vector4(0.5, 0.5, 0.5, 1.0),\r\n    1: new THREE.Vector4(0.5, 0.5, 0.5, 1.0),\r\n    2: new THREE.Vector4(0.63, 0.32, 0.18, 1.0),\r\n    3: new THREE.Vector4(0.0, 1.0, 0.0, 1.0),\r\n    4: new THREE.Vector4(0.0, 0.8, 0.0, 1.0),\r\n    5: new THREE.Vector4(0.0, 0.6, 0.0, 1.0),\r\n    6: new THREE.Vector4(1.0, 0.66, 0.0, 1.0),\r\n    7: new THREE.Vector4(1.0, 0, 1.0, 1.0),\r\n    8: new THREE.Vector4(1.0, 0, 0.0, 1.0),\r\n    9: new THREE.Vector4(0.0, 0.0, 1.0, 1.0),\r\n    12: new THREE.Vector4(1.0, 1.0, 0.0, 1.0),\r\n    DEFAULT: new THREE.Vector4(0.3, 0.6, 0.6, 0.5)\r\n  }\r\n};\r\n\r\nvar PointSizeType =\r\n{\r\n  FIXED: 0,\r\n  ATTENUATED: 1,\r\n  ADAPTIVE: 2\r\n};\r\n\r\nvar PointShape =\r\n{\r\n  SQUARE: 0,\r\n  CIRCLE: 1,\r\n  PARABOLOID: 2\r\n};\r\n\r\nvar PointColorType =\r\n{\r\n  RGB: 0,\r\n  COLOR: 1,\r\n  DEPTH: 2,\r\n  HEIGHT: 3,\r\n  ELEVATION: 3,\r\n  INTENSITY: 4,\r\n  INTENSITY_GRADIENT: 5,\r\n  LOD: 6,\r\n  LEVEL_OF_DETAIL: 6,\r\n  POINT_INDEX: 7,\r\n  CLASSIFICATION: 8,\r\n  RETURN_NUMBER: 9,\r\n  SOURCE: 10,\r\n  NORMAL: 11,\r\n  PHONG: 12,\r\n  RGB_HEIGHT: 13,\r\n  COMPOSITE: 50\r\n};\r\n\r\nvar TreeType =\r\n{\r\n  OCTREE: 0,\r\n  KDTREE: 1\r\n};\r\n\r\nfunction loadPointCloud(path, name, callback) {\r\n  var loaded = function (pointcloud) {\r\n    if (name !== undefined) {\r\n      pointcloud.name = name;\r\n    }\r\n\r\n    callback(\r\n      {\r\n        type: \"pointcloud_loaded\",\r\n        pointcloud: pointcloud\r\n      });\r\n  };\r\n\r\n  //Greyhound pointcloud server URL.\r\n  if (path.indexOf(\"greyhound://\") === 0) {\r\n    GreyhoundLoader.load(path, function (geometry) {\r\n      if (geometry !== undefined) {\r\n        loaded(new PointCloudOctree(geometry));\r\n      }\r\n    });\r\n  }\r\n  //Potree point cloud\r\n  else if (path.indexOf(\"cloud.js\") > 0) {\r\n    POCLoader.load(path, function (geometry) {\r\n      if (geometry !== undefined) {\r\n        loaded(new PointCloudOctree(geometry));\r\n      }\r\n    });\r\n  }\r\n  else if (path.indexOf('ept.json') > 0) {\r\n    EptLoader.load(path, function (geometry) {\r\n      if (geometry !== undefined) {\r\n        loaded(new PointCloudOctree(geometry));\r\n      }\r\n    });\r\n  }\r\n  //Arena 4D point cloud\r\n  else if (path.indexOf(\".vpc\") > 0) {\r\n    PointCloudArena4DGeometry.load(path, function (geometry) {\r\n      if (geometry !== undefined) {\r\n        loaded(new PointCloudArena4D(geometry));\r\n      }\r\n    });\r\n  }\r\n  else {\r\n    throw new Error(\"Potree: Failed to load point cloud from URL \" + path);\r\n  }\r\n}\r\n\r\nfunction updateVisibility(pointclouds, camera, renderer, totalPointBudget) {\r\n  var numVisibleNodes = 0;\r\n  var numVisiblePoints = 0;\r\n  var numVisiblePointsInPointclouds = new Map(pointclouds.map(pc => [pc, 0]));\r\n  var visibleNodes = [];\r\n  var visibleGeometry = [];\r\n  var unloadedGeometry = [];\r\n  var lowestSpacing = Infinity;\r\n\r\n  //Calculate object space frustum and cam pos and setup priority queue\r\n  var structures = updateVisibilityStructures(pointclouds, camera, renderer);\r\n  var frustums = structures.frustums;\r\n  var camObjPositions = structures.camObjPositions;\r\n  var priorityQueue = structures.priorityQueue;\r\n\r\n  var loadedToGPUThisFrame = 0;\r\n  var domWidth = renderer.domElement.clientWidth;\r\n  var domHeight = renderer.domElement.clientHeight;\r\n\r\n  //Check if pointcloud has been transformed, some code will only be executed if changes have been detected\r\n  if (!Global.pointcloudTransformVersion) {\r\n    Global.pointcloudTransformVersion = new Map();\r\n  }\r\n\r\n  var pointcloudTransformVersion = Global.pointcloudTransformVersion;\r\n\r\n  for (var i = 0; i < pointclouds.length; i++) {\r\n    var pointcloud = pointclouds[i];\r\n\r\n    if (!pointcloud.visible) {\r\n      continue;\r\n    }\r\n\r\n    pointcloud.updateMatrixWorld();\r\n\r\n    if (!pointcloudTransformVersion.has(pointcloud)) {\r\n      pointcloudTransformVersion.set(pointcloud,\r\n        {\r\n          number: 0,\r\n          transform: pointcloud.matrixWorld.clone()\r\n        });\r\n    }\r\n    else {\r\n      var version = pointcloudTransformVersion.get(pointcloud);\r\n      if (!version.transform.equals(pointcloud.matrixWorld)) {\r\n        version.number++;\r\n        version.transform.copy(pointcloud.matrixWorld);\r\n\r\n        pointcloud.dispatchEvent(\r\n          {\r\n            type: \"transformation_changed\",\r\n            target: pointcloud\r\n          });\r\n      }\r\n    }\r\n  }\r\n\r\n  //Process priority queue\r\n  while (priorityQueue.size() > 0) {\r\n    var element = priorityQueue.pop();\r\n    var node = element.node;\r\n    var parent = element.parent;\r\n    var pointcloud = pointclouds[element.pointcloud];\r\n    var box = node.getBoundingBox();\r\n    var frustum = frustums[element.pointcloud];\r\n    var camObjPos = camObjPositions[element.pointcloud];\r\n\r\n    var insideFrustum = frustum.intersectsBox(box);\r\n    var maxLevel = pointcloud.maxLevel || Infinity;\r\n    var level = node.getLevel();\r\n\r\n    var visible = insideFrustum;\r\n    // Within 'global' total budget?\r\n    visible = visible && (numVisiblePoints + node.getNumPoints() <= totalPointBudget);\r\n    // Within budget of the point cloud?\r\n    visible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget);\r\n    visible = visible && level < maxLevel;\r\n\r\n    if (node.spacing) {\r\n      lowestSpacing = Math.min(lowestSpacing, node.spacing);\r\n    }\r\n    else if (node.geometryNode && node.geometryNode.spacing) {\r\n      lowestSpacing = Math.min(lowestSpacing, node.geometryNode.spacing);\r\n    }\r\n\r\n    if (!visible) {\r\n      continue;\r\n    }\r\n\r\n    numVisibleNodes++;\r\n    numVisiblePoints += node.getNumPoints();\r\n\r\n    var numVisiblePointsInPointcloud = numVisiblePointsInPointclouds.get(pointcloud);\r\n    numVisiblePointsInPointclouds.set(pointcloud, numVisiblePointsInPointcloud + node.getNumPoints());\r\n\r\n    pointcloud.numVisibleNodes++;\r\n    pointcloud.numVisiblePoints += node.getNumPoints();\r\n\r\n    if (node.isGeometryNode() && (!parent || parent.isTreeNode())) {\r\n      if (node.isLoaded() && loadedToGPUThisFrame < Global.maxNodesLoadGPUFrame) {\r\n        node = pointcloud.toTreeNode(node, parent);\r\n        loadedToGPUThisFrame++;\r\n      }\r\n      else {\r\n        unloadedGeometry.push(node);\r\n        visibleGeometry.push(node);\r\n      }\r\n    }\r\n\r\n    if (node.isTreeNode()) {\r\n      Global.lru.touch(node.geometryNode);\r\n\r\n      node.sceneNode.visible = true;\r\n      node.sceneNode.material = pointcloud.material;\r\n\r\n      visibleNodes.push(node);\r\n      pointcloud.visibleNodes.push(node);\r\n\r\n      if (node._transformVersion === undefined) {\r\n        node._transformVersion = -1;\r\n      }\r\n\r\n      var transformVersion = pointcloudTransformVersion.get(pointcloud);\r\n      if (node._transformVersion !== transformVersion.number) {\r\n        node.sceneNode.updateMatrix();\r\n        node.sceneNode.matrixWorld.multiplyMatrices(pointcloud.matrixWorld, node.sceneNode.matrix);\r\n        node._transformVersion = transformVersion.number;\r\n      }\r\n\r\n      if (pointcloud.showBoundingBox && !node.boundingBoxNode && node.getBoundingBox) {\r\n        var boxHelper = new THREE.Box3Helper(node.getBoundingBox());\r\n        boxHelper.matrixAutoUpdate = false;\r\n        pointcloud.boundingBoxNodes.push(boxHelper);\r\n        node.boundingBoxNode = boxHelper;\r\n        node.boundingBoxNode.matrix.copy(pointcloud.matrixWorld);\r\n      }\r\n      else if (pointcloud.showBoundingBox) {\r\n        node.boundingBoxNode.visible = true;\r\n        node.boundingBoxNode.matrix.copy(pointcloud.matrixWorld);\r\n      }\r\n      else if (!pointcloud.showBoundingBox && node.boundingBoxNode) {\r\n        node.boundingBoxNode.visible = false;\r\n      }\r\n    }\r\n\r\n    //Add child nodes to priorityQueue\r\n    var children = node.getChildren();\r\n    for (var i = 0; i < children.length; i++) {\r\n      var child = children[i];\r\n      var weight = 0;\r\n\r\n      //Perspective camera\r\n      if (camera.isPerspectiveCamera) {\r\n        var sphere = child.getBoundingSphere(new THREE.Sphere());\r\n        var center = sphere.center;\r\n        var distance = sphere.center.distanceTo(camObjPos);\r\n\r\n        var radius = sphere.radius;\r\n        var fov = (camera.fov * Math.PI) / 180;\r\n        var slope = Math.tan(fov / 2);\r\n        var projFactor = (0.5 * domHeight) / (slope * distance);\r\n        var screenPixelRadius = radius * projFactor;\r\n\r\n        //If pixel radius bellow minimum discard\r\n        if (screenPixelRadius < pointcloud.minimumNodePixelSize) {\r\n          continue;\r\n        }\r\n\r\n        weight = screenPixelRadius;\r\n\r\n        //Really close to the camera\r\n        if (distance - radius < 0) {\r\n          weight = Number.MAX_VALUE;\r\n        }\r\n      }\r\n      //Orthographic camera\r\n      else {\r\n        //TODO <IMPROVE VISIBILITY>\r\n        var bb = child.getBoundingBox();\r\n        var distance = child.getBoundingSphere(new THREE.Sphere()).center.distanceTo(camObjPos);\r\n        var diagonal = bb.max.clone().sub(bb.min).length();\r\n        weight = diagonal / distance;\r\n      }\r\n\r\n      priorityQueue.push(\r\n        {\r\n          pointcloud: element.pointcloud,\r\n          node: child,\r\n          parent: node,\r\n          weight: weight\r\n        });\r\n    }\r\n  }\r\n\r\n  //Update DEM\r\n  var candidates = pointclouds.filter(p => (p.generateDEM && p.dem instanceof DEM));\r\n\r\n  for (var pointcloud of candidates) {\r\n    var updatingNodes = pointcloud.visibleNodes.filter(n => n.getLevel() <= Global.maxDEMLevel);\r\n    pointcloud.dem.update(updatingNodes);\r\n  }\r\n\r\n  for (var i = 0; i < Math.min(Global.maxNodesLoading, unloadedGeometry.length); i++) {\r\n    unloadedGeometry[i].load();\r\n  }\r\n\r\n  return {\r\n    visibleNodes: visibleNodes,\r\n    numVisiblePoints: numVisiblePoints,\r\n    lowestSpacing: lowestSpacing\r\n  };\r\n}\r\n\r\nfunction updatePointClouds(pointclouds, camera, renderer, totalPointBudget) {\r\n  var result = updateVisibility(pointclouds, camera, renderer, totalPointBudget);\r\n\r\n  for (var i = 0; i < pointclouds.length; i++) {\r\n    pointclouds[i].updateMaterial(pointclouds[i].material, camera, renderer);\r\n    pointclouds[i].updateVisibleBounds();\r\n  }\r\n\r\n  Global.lru.freeMemory();\r\n\r\n  return result;\r\n}\r\n\r\nfunction updateVisibilityStructures(pointclouds, camera, renderer) {\r\n  var frustums = [];\r\n  var camObjPositions = [];\r\n  var priorityQueue = new BinaryHeap(function (x) {\r\n    return 1 / x.weight;\r\n  });\r\n\r\n  for (var i = 0; i < pointclouds.length; i++) {\r\n    var pointcloud = pointclouds[i];\r\n\r\n    if (!pointcloud.initialized()) {\r\n      continue;\r\n    }\r\n\r\n    pointcloud.numVisibleNodes = 0;\r\n    pointcloud.numVisiblePoints = 0;\r\n    pointcloud.deepestVisibleLevel = 0;\r\n    pointcloud.visibleNodes = [];\r\n    pointcloud.visibleGeometry = [];\r\n\r\n    //Frustum in object space\r\n    camera.updateMatrixWorld();\r\n    var frustum = new THREE.Frustum();\r\n    var viewI = camera.matrixWorldInverse;\r\n    var world = pointcloud.matrixWorld;\r\n\r\n    //Use close near plane for frustum intersection\r\n    var frustumCam = camera.clone();\r\n    frustumCam.near = camera.near; //Math.min(camera.near, 0.1);\r\n    frustumCam.updateProjectionMatrix();\r\n    var proj = camera.projectionMatrix;\r\n\r\n    var fm = new THREE.Matrix4().multiply(proj).multiply(viewI).multiply(world);\r\n    frustum.setFromProjectionMatrix(fm);\r\n    frustums.push(frustum);\r\n\r\n    //Camera position in object space\r\n    var view = camera.matrixWorld;\r\n    //var worldI = new THREE.Matrix4().getInverse(world);\r\n    var worldI = world.clone().invert();\r\n    var camMatrixObject = new THREE.Matrix4().multiply(worldI).multiply(view);\r\n    var camObjPos = new THREE.Vector3().setFromMatrixPosition(camMatrixObject);\r\n    camObjPositions.push(camObjPos);\r\n\r\n    if (pointcloud.visible && pointcloud.root !== null) {\r\n      priorityQueue.push(\r\n        {\r\n          pointcloud: i,\r\n          node: pointcloud.root,\r\n          weight: Number.MAX_VALUE\r\n        });\r\n    }\r\n\r\n    //Hide all previously visible nodes\r\n    if (pointcloud.root.isTreeNode()) {\r\n      pointcloud.hideDescendants(pointcloud.root.sceneNode);\r\n    }\r\n\r\n    for (var j = 0; j < pointcloud.boundingBoxNodes.length; j++) {\r\n      pointcloud.boundingBoxNodes[j].visible = false;\r\n    }\r\n  }\r\n\r\n  return {\r\n    frustums: frustums,\r\n    camObjPositions: camObjPositions,\r\n    priorityQueue: priorityQueue\r\n  };\r\n}\r\n\r\nexport {\r\n  AttributeLocations,\r\n  Classification,\r\n  PointSizeType,\r\n  PointShape,\r\n  PointColorType,\r\n  TreeType,\r\n  loadPointCloud,\r\n  updateVisibility,\r\n  updatePointClouds,\r\n  updateVisibilityStructures\r\n};\r\n","\"use strict\";\n\nimport * as THREE from 'three';\nclass Points\n{\n\tconstructor()\n\t{\n\t\tthis.boundingBox = new THREE.Box3();\n\t\tthis.numPoints = 0;\n\t\tthis.data = {};\n\t}\n\n\tadd(points)\n\t{\n\t\tvar currentSize = this.numPoints;\n\t\tvar additionalSize = points.numPoints;\n\t\tvar newSize = currentSize + additionalSize;\n\n\t\tvar thisAttributes = Object.keys(this.data);\n\t\tvar otherAttributes = Object.keys(points.data);\n\t\tvar attributes = new Set([...thisAttributes, ...otherAttributes]);\n\n\t\tfor(var attribute of attributes)\n\t\t{\n\t\t\tif(thisAttributes.includes(attribute) && otherAttributes.includes(attribute))\n\t\t\t{\n\t\t\t\t//attribute in both, merge\n\t\t\t\tvar Type = this.data[attribute].constructor;\n\t\t\t\tvar merged = new Type(this.data[attribute].length + points.data[attribute].length);\n\t\t\t\tmerged.set(this.data[attribute], 0);\n\t\t\t\tmerged.set(points.data[attribute], this.data[attribute].length);\n\t\t\t\tthis.data[attribute] = merged;\n\t\t\t}\n\t\t\telse if(thisAttributes.includes(attribute) && !otherAttributes.includes(attribute))\n\t\t\t{\n\t\t\t\t//attribute only in this; take over this and expand to new size\n\t\t\t\tvar elementsPerPoint = this.data[attribute].length / this.numPoints;\n\t\t\t\tvar Type = this.data[attribute].constructor;\n\t\t\t\tvar expanded = new Type(elementsPerPoint * newSize);\n\t\t\t\texpanded.set(this.data[attribute], 0);\n\t\t\t\tthis.data[attribute] = expanded;\n\t\t\t}\n\t\t\telse if(!thisAttributes.includes(attribute) && otherAttributes.includes(attribute))\n\t\t\t{\n\t\t\t\t//attribute only in points to be added; take over new points and expand to new size\n\t\t\t\tvar elementsPerPoint = points.data[attribute].length / points.numPoints;\n\t\t\t\tvar Type = points.data[attribute].constructor;\n\t\t\t\tvar expanded = new Type(elementsPerPoint * newSize);\n\t\t\t\texpanded.set(points.data[attribute], elementsPerPoint * currentSize);\n\t\t\t\tthis.data[attribute] = expanded;\n\t\t\t}\n\t\t}\n\n\t\tthis.numPoints = newSize;\n\n\t\tthis.boundingBox.union(points.boundingBox);\n\t}\n};\n\nexport {Points};\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport { HelperUtils } from \"../utils/HelperUtils.js\";\nimport { updatePointClouds } from \"../Potree.js\";\nimport { PointCloudTree } from \"../pointcloud/PointCloudTree.js\";\n\n/**\n * Potree object is a wrapper to use Potree alongside other THREE based frameworks.\n * \n * The object can be used a normal Object3D.\n * \n * It is based on THREE.Mesh and automatically updates the point cloud based on visibility.\n * \n * Also takes care of geometry ajustments to allow the point clouds to be frustum culled.\n */\nclass BasicGroup extends THREE.Mesh {\n  constructor() {\n    super(new THREE.BufferGeometry(), new THREE.MeshBasicMaterial({ opacity: 0.0, wireframe: false, transparent: true }));\n\n    this.rotation.set(-Math.PI / 2, 0, 0);\n\n    this.frustumCulled = true;\n    this.pointclouds = [];\n\n    this.nodeSize = 30;\n    this.pointBudget = 1e10; //TODO <NOT USED>\n    this.nodeLoadRate = 2; //TODO <NOT USED>\n  }\n\n  /**\n   * Empty raycast method to avoid getting valid collision detection with the box geometry attached.\n   */\n  raycast(raycaster, intersects) { }\n\n  /**\n   * Changes the point budget to be used by potree.\n   */\n  setPointBudget(budget) {\n    this.pointBudget = budget;\n  }\n\n  /**\n   * Used to update the point cloud visibility relative to a camera.\n   * \n   * Called automatically before rendering.\n   */\n  onBeforeRender(renderer, scene, camera, geometry, material, group) {\n    for (var i = 0; i < this.pointclouds.length; i++) {\n      this.pointclouds[i].minimumNodePixelSize = this.nodeSize;\n    }\n\n    updatePointClouds(this.pointclouds, camera, renderer, this.pointBudget);\n  }\n\n  /**\n   * Recalculate the box geometry attached to this group.\n   * \n   * The geometry its not visible and its only used for frustum culling.\n   */\n  recalculateBoxGeometry() {\n    var box = this.getBoundingBox();\n\n    var size = box.getSize(new THREE.Vector3());\n    var center = box.getCenter(new THREE.Vector3());\n\n    var matrix = new THREE.Matrix4();\n    matrix.makeTranslation(center.x, -center.z, center.y);\n\n    var geometry = new THREE.BoxBufferGeometry(size.x, size.z, size.y);\n    geometry.applyMatrix4(matrix);\n\n    this.geometry = geometry;\n  }\n\n  /**\n   * Add an object as children of this scene.\n   * \n   * Point cloud objects are detected and used to recalculate the geometry box used for frustum culling.\n   */\n  add(object) {\n    THREE.Object3D.prototype.add.call(this, object);\n\n    if (object instanceof PointCloudTree) {\n      object.showBoundingBox = false;\n      object.generateDEM = false;\n      this.pointclouds.push(object);\n      this.recalculateBoxGeometry();\n    }\n  }\n\n  /**\n   * Remove object from group.\n   * \n   * Point cloud objects are detected and used to recalculate the geometry box used for frustum culling\n   */\n  remove(object) {\n    THREE.Object3D.prototype.remove.call(this, object);\n\n    if (object instanceof PointCloudTree) {\n      var index = this.pointclouds.indexOf(object);\n      if (index !== -1) {\n        this.pointclouds.splice(index, 1);\n        this.recalculateBoxGeometry();\n      }\n    }\n  }\n\n  /** \n   * Get the point cloud bouding box.\n   */\n  getBoundingBox() {\n    var box = new THREE.Box3();\n\n    this.updateMatrixWorld(true);\n\n    for (var i = 0; i < this.pointclouds.length; i++) {\n      var pointcloud = this.pointclouds[i];\n      pointcloud.updateMatrixWorld(true);\n      var pointcloudBox = pointcloud.pcoGeometry.tightBoundingBox ? pointcloud.pcoGeometry.tightBoundingBox : pointcloud.boundingBox;\n      var boxWorld = HelperUtils.computeTransformedBoundingBox(pointcloudBox, pointcloud.matrixWorld);\n      box.union(boxWorld);\n    }\n\n    return box;\n  }\n\n  /** \n   * Estimate the point cloud height at a given position.\n   */\n  estimateHeightAt(position) {\n    var height = null;\n    var fromSpacing = Infinity;\n\n    for (var pointcloud of this.pointclouds) {\n      if (pointcloud.root.geometryNode === undefined) {\n        continue;\n      }\n\n      var pHeight = null;\n      var pFromSpacing = Infinity;\n\n      var lpos = position.clone().sub(pointcloud.position);\n      lpos.z = 0;\n      var ray = new THREE.Ray(lpos, new THREE.Vector3(0, 0, 1));\n\n      var stack = [pointcloud.root];\n      while (stack.length > 0) {\n        var node = stack.pop();\n        var box = node.getBoundingBox();\n        var inside = ray.intersectBox(box);\n\n        if (!inside) {\n          continue;\n        }\n\n        var h = node.geometryNode.mean.z + pointcloud.position.z + node.geometryNode.boundingBox.min.z;\n\n        if (node.geometryNode.spacing <= pFromSpacing) {\n          pHeight = h;\n          pFromSpacing = node.geometryNode.spacing;\n        }\n\n        for (var index of Object.keys(node.children)) {\n          var child = node.children[index];\n          if (child.geometryNode) {\n            stack.push(node.children[index]);\n          }\n        }\n      }\n\n      if (height === null || pFromSpacing < fromSpacing) {\n        height = pHeight;\n        fromSpacing = pFromSpacing;\n      }\n    }\n\n    return height;\n  }\n};\n\nexport { BasicGroup };\n","\"use strict\";\n\nimport * as THREE from 'three';\n\nimport { BasicGroup } from \"./BasicGroup.js\";\nimport { PointCloudTree } from \"../pointcloud/PointCloudTree.js\";\nimport { PointSizeType, PointColorType } from \"../Potree.js\";\n\nclass Group extends BasicGroup {\n  constructor() {\n    super();\n\n    this.textures = new Map();\n  }\n\n  /**\n   * Update the potree group before rendering.\n   */\n  onBeforeRender(renderer, scene, camera, geometry, material, group) {\n    super.onBeforeRender(renderer, scene, camera, geometry, material, group);\n\n    var result = this.fetchOctrees();\n\n    for (var octree of result.octrees) {\n      var nodes = octree.visibleNodes;\n      this.prepareOcttree(renderer, octree, nodes, camera);\n    }\n  }\n\n  fetchOctrees() {\n    var octrees = [];\n    var stack = [this];\n\n    while (stack.length > 0) {\n      var node = stack.pop();\n\n      if (node instanceof PointCloudTree) {\n        octrees.push(node);\n        continue;\n      }\n\n      var visibleChildren = node.children.filter(c => c.visible);\n      stack.push(...visibleChildren);\n    }\n\n    var result =\n    {\n      octrees: octrees\n    };\n\n    return result;\n  }\n\n  prepareOcttree(renderer, octree, nodes, camera) {\n    var material = octree.material;\n    var viewInv = camera.matrixWorld;\n    var proj = camera.projectionMatrix;\n\n    var visibilityTextureData = null;\n\n    if (material.pointSizeType === PointSizeType.ADAPTIVE || material.pointColorType === PointColorType.LOD) {\n      visibilityTextureData = octree.computeVisibilityTextureData(nodes, camera);\n\n      var vnt = material.visibleNodesTexture;\n      vnt.image.data.set(visibilityTextureData.data);\n      vnt.needsUpdate = true;\n    }\n\n    // Clip planes\n    var numClippingPlanes = (material.clipping && material.clippingPlanes && material.clippingPlanes.length) ? material.clippingPlanes.length : 0;\n    var clipPlanesChanged = material.defines['num_clipplanes'] !== numClippingPlanes;\n    var clippingPlanes = [];\n    if (clipPlanesChanged) {\n      material.defines = {\n        ...material.defines,\n        num_clipplanes: numClippingPlanes\n      };\n      material.needsUpdate = true;\n    }\n    if (numClippingPlanes > 0) {\n      var planes = material.clippingPlanes;\n      var flattenedPlanes = new Array(4 * material.clippingPlanes.length);\n      for (var i = 0; i < planes.length; i++) {\n        flattenedPlanes[4*i + 0] = planes[i].normal.x;\n        flattenedPlanes[4*i + 1] = planes[i].normal.y;\n        flattenedPlanes[4*i + 2] = planes[i].normal.z;\n        flattenedPlanes[4*i + 3] = planes[i].constant;\n      }\n      clippingPlanes = flattenedPlanes;\n    }\n\n    const clippingPlanesAsVec4Array = material.clippingPlanes ? material.clippingPlanes.map(x => new THREE.Vector4(x.normal.x, x.normal.y, x.normal.z, x.constant)) : [];\n    material.uniforms.projectionMatrix.value.copy(proj);\n    material.uniforms.uViewInv.value.copy(viewInv);\n    material.uniforms.clipPlanes.value = clippingPlanesAsVec4Array;\n    material.uniforms.fov.value = Math.PI * camera.fov / 180;\n    material.uniforms.near.value = camera.near;\n    material.uniforms.far.value = camera.far;\n    material.uniforms.size.value = material.size;\n    material.uniforms.uOctreeSpacing.value = material.spacing;\n    material.uniforms.uColor.value = material.color;\n    material.uniforms.uOpacity.value = material.opacity;\n    material.uniforms.elevationRange.value = material.elevationRange;\n    material.uniforms.intensityRange.value = material.intensityRange;\n    material.uniforms.intensityGamma.value = material.intensityGamma;\n    material.uniforms.intensityContrast.value = material.intensityContrast;\n    material.uniforms.intensityBrightness.value = material.intensityBrightness;\n    material.uniforms.rgbGamma.value = material.rgbGamma;\n    material.uniforms.rgbBrightness.value = material.rgbBrightness;\n    material.uniforms.uTransition.value = material.transition;\n    material.uniforms.wRGB.value = material.weightRGB;\n    material.uniforms.wIntensity.value = material.weightIntensity;\n    material.uniforms.wElevation.value = material.weightElevation;\n    material.uniforms.wClassification.value = material.weightClassification;\n    material.uniforms.wReturnNumber.value = material.weightReturnNumber;\n    material.uniforms.wSourceID.value = material.weightSourceID;\n    material.uniforms.logDepthBufFC.value = renderer.capabilities.logarithmicDepthBuffer ? 2.0 / (Math.log(camera.far + 1.0) / Math.LN2) : undefined;\n    material.uniformsNeedUpdate = true;\n  }\n};\n\nexport { Group };\n"],"sourceRoot":""}