/
potree.min.js
6 lines (6 loc) · 166 KB
/
potree.min.js
1
2
3
4
5
6
function Potree(){}function LRUItem(e){this.previous=null,this.next=null,this.node=e}function LRU(){this.first=null,this.last=null,this.items={},this.elements=0,this.numPoints=0}function getMousePointCloudIntersection(e,t,i,o){var n=new THREE.Vector3(e.x,e.y,.5);n.unproject(t);for(var r=n.sub(t.position).normalize(),a=new THREE.Ray(t.position,r),s=null,l=null,d=0;d<o.length;d++){var c=o[d],u=c.pick(i,t,a);if(u){var h=t.position.distanceTo(u.position);(!s||l>h)&&(s=u,l=h)}}return s?s.position:null}function pixelsArrayToImage(e,t,i){var o=document.createElement("canvas");o.width=t,o.height=i;var n=o.getContext("2d");e=new e.constructor(e);for(var r=0;r<e.length;r++)e[4*r+3]=255;var a=n.createImageData(t,i);a.data.set(e),n.putImageData(a,0,0);var s=new Image;return s.src=o.toDataURL(),s.style.transform="scaleY(-1)",s}function projectedRadius(e,t,i,o){var n=1/Math.tan(t/2)/i;return n=n*o/2,e*n}Potree.workers={},Potree.Shaders={},Potree.WorkerManager=function(e){this.code=e,this.instances=[],this.createdInstances=0},Potree.WorkerManager.prototype.getWorker=function(){var e=this.instances.pop();return void 0===e&&(e=Potree.utils.createWorker(this.code),this.createdInstances++),e},Potree.WorkerManager.prototype.returnWorker=function(e){this.instances.push(e)},Potree.WorkerManager.fromUrls=function(e){for(var t="",i=0;i<e.length;i++){var o=e[i],n=new XMLHttpRequest;n.open("GET",o,!1),n.responseType="text",n.overrideMimeType("text/plain; charset=x-user-defined"),n.send(null),200===n.status&&(t+=n.responseText+"\n")}return new Potree.WorkerManager(t)},Potree.workers.binaryDecoder=new Potree.WorkerManager(atob("Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3VpbnQ4YXJyYXktdnMtZGF0YXZpZXczLzMKZnVuY3Rpb24gQ3VzdG9tVmlldyhidWZmZXIpIHsKCXRoaXMuYnVmZmVyID0gYnVmZmVyOwoJdGhpcy51OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CgkKCXZhciB0bXAgPSBuZXcgQXJyYXlCdWZmZXIoNCk7Cgl2YXIgdG1wZiA9IG5ldyBGbG9hdDMyQXJyYXkodG1wKTsKCXZhciB0bXB1OCA9IG5ldyBVaW50OEFycmF5KHRtcCk7CgkKCXRoaXMuZ2V0VWludDMyID0gZnVuY3Rpb24gKGkpIHsKCQlyZXR1cm4gKHRoaXMudThbaSszXSA8PCAyNCkgfCAodGhpcy51OFtpKzJdIDw8IDE2KSB8ICh0aGlzLnU4W2krMV0gPDwgOCkgfCB0aGlzLnU4W2ldOwoJfQoJCgl0aGlzLmdldFVpbnQxNiA9IGZ1bmN0aW9uIChpKSB7CgkJcmV0dXJuICh0aGlzLnU4W2krMV0gPDwgOCkgfCB0aGlzLnU4W2ldOwoJfQoJCgl0aGlzLmdldEZsb2F0ID0gZnVuY3Rpb24oaSl7CgkJdG1wdThbMF0gPSB0aGlzLnU4W2krMF07CgkJdG1wdThbMV0gPSB0aGlzLnU4W2krMV07CgkJdG1wdThbMl0gPSB0aGlzLnU4W2krMl07CgkJdG1wdThbM10gPSB0aGlzLnU4W2krM107CgkJCgkJcmV0dXJuIHRtcGZbMF07Cgl9CgkKCXRoaXMuZ2V0VWludDggPSBmdW5jdGlvbihpKXsKCQlyZXR1cm4gdGhpcy51OFtpXTsKCX0KfQoKUG90cmVlID0ge307CgoKb25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpewoJdmFyIGJ1ZmZlciA9IGV2ZW50LmRhdGEuYnVmZmVyOwoJdmFyIHBvaW50QXR0cmlidXRlcyA9IGV2ZW50LmRhdGEucG9pbnRBdHRyaWJ1dGVzOwoJdmFyIG51bVBvaW50cyA9IGJ1ZmZlci5ieXRlTGVuZ3RoIC8gcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplOwoJdmFyIGN2ID0gbmV3IEN1c3RvbVZpZXcoYnVmZmVyKTsKCXZhciB2ZXJzaW9uID0gbmV3IFBvdHJlZS5WZXJzaW9uKGV2ZW50LmRhdGEudmVyc2lvbik7Cgl2YXIgbWluID0gZXZlbnQuZGF0YS5taW47Cgl2YXIgbm9kZU9mZnNldCA9IGV2ZW50LmRhdGEub2Zmc2V0OwoJdmFyIHNjYWxlID0gZXZlbnQuZGF0YS5zY2FsZTsKCXZhciB0aWdodEJveE1pbiA9IFsgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWV07Cgl2YXIgdGlnaHRCb3hNYXggPSBbIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSBdOwoJCgl2YXIgYXR0cmlidXRlQnVmZmVycyA9IHt9OwoJCgl2YXIgb2Zmc2V0ID0gMDsKCWZvcih2YXIgaSA9IDA7IGkgPCBwb2ludEF0dHJpYnV0ZXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKyl7CgkJdmFyIHBvaW50QXR0cmlidXRlID0gcG9pbnRBdHRyaWJ1dGVzLmF0dHJpYnV0ZXNbaV07CgkKCQlpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuUE9TSVRJT05fQ0FSVEVTSUFOLm5hbWUpewoJCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCWlmKHZlcnNpb24ubmV3ZXJUaGFuKCIxLjMiKSl7CgkJCQkJcG9zaXRpb25zWzMqaiswXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrMCkgKiBzY2FsZSkgKyBtaW5bMF07CgkJCQkJcG9zaXRpb25zWzMqaisxXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrNCkgKiBzY2FsZSkgKyBtaW5bMV07CgkJCQkJcG9zaXRpb25zWzMqaisyXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrOCkgKiBzY2FsZSkgKyBtaW5bMl07CgkJCQl9ZWxzZXsKCQkJCQlwb3NpdGlvbnNbMypqKzBdID0gY3YuZ2V0RmxvYXQoaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrMCkgKyBub2RlT2Zmc2V0WzBdOwoJCQkJCXBvc2l0aW9uc1szKmorMV0gPSBjdi5nZXRGbG9hdChqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSs0KSArIG5vZGVPZmZzZXRbMV07CgkJCQkJcG9zaXRpb25zWzMqaisyXSA9IGN2LmdldEZsb2F0KGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKzgpICsgbm9kZU9mZnNldFsyXTsKCQkJCX0KCQkJCQoJCQkJdGlnaHRCb3hNaW5bMF0gPSBNYXRoLm1pbih0aWdodEJveE1pblswXSwgcG9zaXRpb25zWzMqaiswXSk7CgkJCQl0aWdodEJveE1pblsxXSA9IE1hdGgubWluKHRpZ2h0Qm94TWluWzFdLCBwb3NpdGlvbnNbMypqKzFdKTsKCQkJCXRpZ2h0Qm94TWluWzJdID0gTWF0aC5taW4odGlnaHRCb3hNaW5bMl0sIHBvc2l0aW9uc1szKmorMl0pOwoJCQkJCgkJCQl0aWdodEJveE1heFswXSA9IE1hdGgubWF4KHRpZ2h0Qm94TWF4WzBdLCBwb3NpdGlvbnNbMypqKzBdKTsKCQkJCXRpZ2h0Qm94TWF4WzFdID0gTWF0aC5tYXgodGlnaHRCb3hNYXhbMV0sIHBvc2l0aW9uc1szKmorMV0pOwoJCQkJdGlnaHRCb3hNYXhbMl0gPSBNYXRoLm1heCh0aWdodEJveE1heFsyXSwgcG9zaXRpb25zWzMqaisyXSk7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJCQoJCX1lbHNlIGlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5DT0xPUl9QQUNLRUQubmFtZSl7CgkJCQoJCQl2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihudW1Qb2ludHMqNCozKTsKCQkJdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCQoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJY29sb3JzWzMqaiswXSA9IGN2LmdldFVpbnQ4KG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMCkgLyAyNTU7CgkJCQljb2xvcnNbMypqKzFdID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyAxKSAvIDI1NTsKCQkJCWNvbG9yc1szKmorMl0gPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDIpIC8gMjU1OwoJCQl9CgkJCQoJCQlhdHRyaWJ1dGVCdWZmZXJzW3BvaW50QXR0cmlidXRlLm5hbWVdID0geyBidWZmZXI6IGJ1ZmYsIGF0dHJpYnV0ZTogcG9pbnRBdHRyaWJ1dGV9OwoJCQkKCQl9ZWxzZSBpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuSU5URU5TSVRZLm5hbWUpewoKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJCQl2YXIgaW50ZW5zaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciBpbnRlbnNpdHkgPSBjdi5nZXRVaW50MTYob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUpOwoJCQkJaW50ZW5zaXRpZXNbal0gPSBpbnRlbnNpdHk7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJCgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLkNMQVNTSUZJQ0FUSU9OLm5hbWUpewoKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJCQl2YXIgY2xhc3NpZmljYXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJCgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQl2YXIgY2xhc3NpZmljYXRpb24gPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSk7CgkJCQljbGFzc2lmaWNhdGlvbnNbal0gPSBjbGFzc2lmaWNhdGlvbjsKCQkJfQoJCQkKCQkJYXR0cmlidXRlQnVmZmVyc1twb2ludEF0dHJpYnV0ZS5uYW1lXSA9IHsgYnVmZmVyOiBidWZmLCBhdHRyaWJ1dGU6IHBvaW50QXR0cmlidXRlfTsKCQkKCQl9ZWxzZSBpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRC5uYW1lKXsKCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KjMpOwoJCQl2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCQoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJdmFyIGJ4ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIGJ5ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDEpOwoJCQkKCQkJCXZhciBleCA9IGJ4IC8gMjU1OwoJCQkJdmFyIGV5ID0gYnkgLyAyNTU7CgkJCQkKCQkJCXZhciBueCA9IGV4ICogMiAtIDE7CgkJCQl2YXIgbnkgPSBleSAqIDIgLSAxOwoJCQkJdmFyIG56ID0gMTsKCQkJCXZhciBudyA9IC0xOwoJCQkJCgkJCQl2YXIgbCA9IChueCAqICgtbngpKSArIChueSAqICgtbnkpKSArIChueiAqICgtbncpKTsKCQkJCW56ID0gbDsKCQkJCW54ID0gbnggKiBNYXRoLnNxcnQobCk7CgkJCQlueSA9IG55ICogTWF0aC5zcXJ0KGwpOwoJCQkJCgkJCQlueCA9IG54ICogMjsKCQkJCW55ID0gbnkgKiAyOwoJCQkJbnogPSBueiAqIDIgLSAxOwoJCQkJCgkJCQlub3JtYWxzWzMqaiArIDBdID0gbng7CgkJCQlub3JtYWxzWzMqaiArIDFdID0gbnk7CgkJCQlub3JtYWxzWzMqaiArIDJdID0gbno7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9PQ1QxNi5uYW1lKXsKCQkJCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KjMpOwoJCQl2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQl2YXIgYnggPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMCk7CgkJCQl2YXIgYnkgPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMSk7CgkJCQkKCQkJCXZhciB1ID0gKGJ4IC8gMjU1KSAqIDIgLSAxOwoJCQkJdmFyIHYgPSAoYnkgLyAyNTUpICogMiAtIDE7CgkJCQkKCQkJCXZhciB6ID0gMSAtIE1hdGguYWJzKHUpIC0gTWF0aC5hYnModik7CgkJCQkKCQkJCWlmKHogPj0gMCl7CgkJCQkJdmFyIHggPSB1OwoJCQkJCXZhciB5ID0gdjsKCQkJCX1lbHNlewoJCQkJCXZhciB4ID0gLSAodi9NYXRoLnNpZ24odikgLSAxKSAvIE1hdGguc2lnbih1KTsKCQkJCQl2YXIgeSA9IC0gKHUvTWF0aC5zaWduKHUpIC0gMSkgLyBNYXRoLnNpZ24odik7CgkJCQl9CgkJCQkKCQkJCXZhciBsZW5ndGggPSBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTsKCQkJCXggPSB4IC8gbGVuZ3RoOwoJCQkJeSA9IHkgLyBsZW5ndGg7CgkJCQl6ID0geiAvIGxlbmd0aDsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTC5uYW1lKXsKCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciB4ID0gY3YuZ2V0RmxvYXQob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIHkgPSBjdi5nZXRGbG9hdChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgNCk7CgkJCQl2YXIgeiA9IGN2LmdldEZsb2F0KG9mZnNldCArIGogKiBwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyA4KTsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfQoJCQoJCW9mZnNldCArPSBwb2ludEF0dHJpYnV0ZS5ieXRlU2l6ZTsKCX0KCQoJdmFyIGluZGljZXMgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJdmFyIGlJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KGluZGljZXMpOwoJZm9yKHZhciBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKXsKCQlpSW5kaWNlc1tpXSA9IGk7Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCWF0dHJpYnV0ZUJ1ZmZlcnM6IGF0dHJpYnV0ZUJ1ZmZlcnMsCgkJdGlnaHRCb3VuZGluZ0JveDogeyBtaW46IHRpZ2h0Qm94TWluLCBtYXg6IHRpZ2h0Qm94TWF4IH0sCgkJaW5kaWNlczogaW5kaWNlcwoJfTsKCQkKCXZhciB0cmFuc2ZlcmFibGVzID0gW107CgkKCWZvcih2YXIgcHJvcGVydHkgaW4gbWVzc2FnZS5hdHRyaWJ1dGVCdWZmZXJzKXsKCQlpZihtZXNzYWdlLmF0dHJpYnV0ZUJ1ZmZlcnMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKXsKCQkJdHJhbnNmZXJhYmxlcy5wdXNoKG1lc3NhZ2UuYXR0cmlidXRlQnVmZmVyc1twcm9wZXJ0eV0uYnVmZmVyKTsKCQl9Cgl9CgkKCXRyYW5zZmVyYWJsZXMucHVzaChtZXNzYWdlLmluZGljZXMpOwoJCQoJcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJhYmxlcyk7CgkKfTsKUG90cmVlLlZlcnNpb24gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Cgl2YXIgdm1MZW5ndGggPSAodmVyc2lvbi5pbmRleE9mKCIuIikgPT09IC0xKSA/IHZlcnNpb24ubGVuZ3RoIDogdmVyc2lvbi5pbmRleE9mKCIuIik7Cgl0aGlzLnZlcnNpb25NYWpvciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKDAsIHZtTGVuZ3RoKSk7Cgl0aGlzLnZlcnNpb25NaW5vciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKHZtTGVuZ3RoICsgMSkpOwoJaWYodGhpcy52ZXJzaW9uTWlub3IubGVuZ3RoID09PSAwKXsKCQl0aGlzLnZlcnNpb25NaW5vciA9IDA7Cgl9CgkKfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS5uZXdlclRoYW4gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID4gdi52ZXJzaW9uTWlub3IpewoJCXJldHVybiB0cnVlOwoJfWVsc2V7CgkJcmV0dXJuIGZhbHNlOwoJfQp9OwoKUG90cmVlLlZlcnNpb24ucHJvdG90eXBlLmVxdWFsT3JIaWdoZXIgPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID49IHYudmVyc2lvbk1pbm9yKXsKCQlyZXR1cm4gdHJ1ZTsKCX1lbHNlewoJCXJldHVybiBmYWxzZTsKCX0KfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS51cFRvID0gZnVuY3Rpb24odmVyc2lvbil7CglyZXR1cm4gIXRoaXMubmV3ZXJUaGFuKHZlcnNpb24pOwp9ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzID0ge307CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5QT1NJVElPTl9DQVJURVNJQU4gCT0gMDsJLy8gZmxvYXQgeCwgeSwgejsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuQ09MT1JfUEFDS0VECQk9IDE7CS8vIGJ5dGUgciwgZywgYiwgYTsgCUkgPSBbMCwxXQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9GTE9BVFNfMQkJPSAyOwkvLyBmbG9hdCByLCBnLCBiOyAJCUkgPSBbMCwxXQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9GTE9BVFNfMjU1CT0gMzsJLy8gZmxvYXQgciwgZywgYjsgCQlJID0gWzAsMjU1XQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfRkxPQVRTCQk9IDQ7ICAJLy8gZmxvYXQgeCwgeSwgejsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuRklMTEVSCQkJCT0gNTsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuSU5URU5TSVRZCQkJPSA2OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DTEFTU0lGSUNBVElPTgkJPSA3OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfU1BIRVJFTUFQUEVECT0gODsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMX09DVDE2CQk9IDk7ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTAkJCQk9IDEwOwoKLyoqCiAqIFNvbWUgdHlwZXMgb2YgcG9zc2libGUgcG9pbnQgYXR0cmlidXRlIGRhdGEgZm9ybWF0cwogKiAKICogQGNsYXNzCiAqLwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcyA9IHsKCURBVEFfVFlQRV9ET1VCTEUJOiB7b3JkaW5hbCA6IDAsIHNpemU6IDh9LAoJREFUQV9UWVBFX0ZMT0FUCQk6IHtvcmRpbmFsIDogMSwgc2l6ZTogNH0sCglEQVRBX1RZUEVfSU5UOAkJOiB7b3JkaW5hbCA6IDIsIHNpemU6IDF9LAoJREFUQV9UWVBFX1VJTlQ4CQk6IHtvcmRpbmFsIDogMywgc2l6ZTogMX0sCglEQVRBX1RZUEVfSU5UMTYJCToge29yZGluYWwgOiA0LCBzaXplOiAyfSwKCURBVEFfVFlQRV9VSU5UMTYJOiB7b3JkaW5hbCA6IDUsIHNpemU6IDJ9LAoJREFUQV9UWVBFX0lOVDMyCQk6IHtvcmRpbmFsIDogNiwgc2l6ZTogNH0sCglEQVRBX1RZUEVfVUlOVDMyCToge29yZGluYWwgOiA3LCBzaXplOiA0fSwKCURBVEFfVFlQRV9JTlQ2NAkJOiB7b3JkaW5hbCA6IDgsIHNpemU6IDh9LAoJREFUQV9UWVBFX1VJTlQ2NAk6IHtvcmRpbmFsIDogOSwgc2l6ZTogOH0KfTsKCnZhciBpID0gMDsKZm9yKHZhciBvYmogaW4gUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMpewoJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXNbaV0gPSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlc1tvYmpdOwoJaSsrOwp9CgovKioKICogQSBzaW5nbGUgcG9pbnQgYXR0cmlidXRlIHN1Y2ggYXMgY29sb3Ivbm9ybWFsLy4uIGFuZCBpdHMgZGF0YSBmb3JtYXQvbnVtYmVyIG9mIGVsZW1lbnRzLy4uLiAKICogCiAqIEBjbGFzcwogKiBAcGFyYW0gbmFtZSAKICogQHBhcmFtIHR5cGUKICogQHBhcmFtIHNpemUKICogQHJldHVybnMKICovClBvdHJlZS5Qb2ludEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIG51bUVsZW1lbnRzKXsKCXRoaXMubmFtZSA9IG5hbWU7Cgl0aGlzLnR5cGUgPSB0eXBlOyAKCXRoaXMubnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKCXRoaXMuYnl0ZVNpemUgPSB0aGlzLm51bUVsZW1lbnRzICogdGhpcy50eXBlLnNpemU7Cn0KClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5QT1NJVElPTl9DQVJURVNJQU4gPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLlBPU0lUSU9OX0NBUlRFU0lBTiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfRkxPQVQsIDMpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLlJHQkFfUEFDS0VEID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9QQUNLRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0lOVDgsIDQpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLkNPTE9SX1BBQ0tFRCA9IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5SR0JBX1BBQ0tFRDsKClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5SR0JfUEFDS0VEID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9QQUNLRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0lOVDgsIDMpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9GTE9BVFMgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9GTE9BVFMsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0ZMT0FULCAzKTsKClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5GSUxMRVJfMUIgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkZJTExFUiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDEpOwoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuSU5URU5TSVRZID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5JTlRFTlNJVFksCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQxNiwgMSk7CQkKCQkKUG90cmVlLlBvaW50QXR0cmlidXRlLkNMQVNTSUZJQ0FUSU9OID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DTEFTU0lGSUNBVElPTiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDEpOwkKCQkKUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9TUEhFUkVNQVBQRUQgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9TUEhFUkVNQVBQRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQ4LCAyKTsJCQoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX09DVDE2ID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfT0NUMTYsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQ4LCAyKTsJCgkJClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUwgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTCwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfRkxPQVQsIDMpOwoKLyoqCiAqIE9yZGVyZWQgbGlzdCBvZiBQb2ludEF0dHJpYnV0ZXMgdXNlZCB0byBpZGVudGlmeSBob3cgcG9pbnRzIGFyZSBhbGlnbmVkIGluIGEgYnVmZmVyLgogKiAKICogQGNsYXNzCiAqIAogKi8KUG90cmVlLlBvaW50QXR0cmlidXRlcyA9IGZ1bmN0aW9uKHBvaW50QXR0cmlidXRlcyl7Cgl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXJyYXkoKTsKCXRoaXMuYnl0ZVNpemUgPSAwOwoJdGhpcy5zaXplID0gMDsKCQoJaWYocG9pbnRBdHRyaWJ1dGVzICE9IG51bGwpewkKCQlmb3IodmFyIGkgPSAwOyBpIDwgcG9pbnRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKXsKCQkJdmFyIHBvaW50QXR0cmlidXRlTmFtZSA9IHBvaW50QXR0cmlidXRlc1tpXTsKCQkJdmFyIHBvaW50QXR0cmlidXRlID0gUG90cmVlLlBvaW50QXR0cmlidXRlW3BvaW50QXR0cmlidXRlTmFtZV07CgkJCXRoaXMuYXR0cmlidXRlcy5wdXNoKHBvaW50QXR0cmlidXRlKTsKCQkJdGhpcy5ieXRlU2l6ZSArPSBwb2ludEF0dHJpYnV0ZS5ieXRlU2l6ZTsKCQkJdGhpcy5zaXplKys7CgkJfQoJfQp9CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihwb2ludEF0dHJpYnV0ZSl7Cgl0aGlzLmF0dHJpYnV0ZXMucHVzaChwb2ludEF0dHJpYnV0ZSk7Cgl0aGlzLmJ5dGVTaXplICs9IHBvaW50QXR0cmlidXRlLmJ5dGVTaXplOwoJdGhpcy5zaXplKys7Cn07CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5oYXNDb2xvcnMgPSBmdW5jdGlvbigpewoJZm9yKHZhciBuYW1lIGluIHRoaXMuYXR0cmlidXRlcyl7CgkJdmFyIHBvaW50QXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW25hbWVdOwoJCWlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNPTE9SX1BBQ0tFRCl7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCQoJcmV0dXJuIGZhbHNlOwp9OwoKUG90cmVlLlBvaW50QXR0cmlidXRlcy5wcm90b3R5cGUuaGFzTm9ybWFscyA9IGZ1bmN0aW9uKCl7Cglmb3IodmFyIG5hbWUgaW4gdGhpcy5hdHRyaWJ1dGVzKXsKCQl2YXIgcG9pbnRBdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07CgkJaWYoCgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRCB8fCAKCQkJcG9pbnRBdHRyaWJ1dGUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUxfRkxPQVRTIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX09DVDE2KXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJCglyZXR1cm4gZmFsc2U7Cn07CgoK")),Potree.Shaders["pointcloud.vs"]=["","// the following is an incomplete list of attributes, uniforms and defines","// which are automatically added through the THREE.ShaderMaterial","","//attribute vec3 position;","//attribute vec3 color;","//attribute vec3 normal;","","//uniform mat4 modelMatrix;","//uniform mat4 modelViewMatrix;","//uniform mat4 projectionMatrix;","//uniform mat4 viewMatrix;","//uniform mat3 normalMatrix;","//uniform vec3 cameraPosition;","","//#define MAX_DIR_LIGHTS 0","//#define MAX_POINT_LIGHTS 1","//#define MAX_SPOT_LIGHTS 0","//#define MAX_HEMI_LIGHTS 0","//#define MAX_SHADOWS 0","//#define MAX_BONES 58","","#define max_clip_boxes 30","","attribute float intensity;","attribute float classification;","attribute float returnNumber;","attribute float numberOfReturns;","attribute float pointSourceID;","attribute vec4 indices;","","uniform float screenWidth;","uniform float screenHeight;","uniform float fov;","uniform float spacing;","uniform float near;","uniform float far;","","#if defined use_clip_box"," uniform mat4 clipBoxes[max_clip_boxes];","#endif","","","uniform float heightMin;","uniform float heightMax;","uniform float intensityMin;","uniform float intensityMax;","uniform float size; // pixel size factor","uniform float minSize; // minimum pixel size","uniform float maxSize; // maximum pixel size","uniform float octreeSize;","uniform vec3 bbSize;","uniform vec3 uColor;","uniform float opacity;","uniform float clipBoxCount;","","","uniform sampler2D visibleNodes;","uniform sampler2D gradient;","uniform sampler2D classificationLUT;","uniform sampler2D depthMap;","","varying float vOpacity;","varying vec3 vColor;","varying float vLinearDepth;","varying float vLogDepth;","varying vec3 vViewPosition;","varying float vRadius;","varying vec3 vWorldPosition;","varying vec3 vNormal;","","","// ---------------------","// OCTREE","// ---------------------","","#if (defined(adaptive_point_size) || defined(color_type_tree_depth)) && defined(tree_type_octree)","/**"," * number of 1-bits up to inclusive index position"," * number is treated as if it were an integer in the range 0-255"," *"," */","float numberOfOnes(float number, float index){"," float tmp = mod(number, pow(2.0, index + 1.0));"," float numOnes = 0.0;"," for(float i = 0.0; i < 8.0; i++){"," if(mod(tmp, 2.0) != 0.0){"," numOnes++;"," }"," tmp = floor(tmp / 2.0);"," }"," return numOnes;","}","","","/**"," * checks whether the bit at index is 1"," * number is treated as if it were an integer in the range 0-255"," *"," */","bool isBitSet(float number, float index){"," return mod(floor(number / pow(2.0, index)), 2.0) != 0.0;","}","","","/**"," * find the tree depth at the point position"," */","float getLocalTreeDepth(){"," vec3 offset = vec3(0.0, 0.0, 0.0);"," float iOffset = 0.0;"," float depth = 0.0;"," for(float i = 0.0; i <= 1000.0; i++){"," float nodeSizeAtLevel = octreeSize / pow(2.0, i);"," vec3 index3d = (position - offset) / nodeSizeAtLevel;"," index3d = floor(index3d + 0.5);"," float index = 4.0*index3d.x + 2.0*index3d.y + index3d.z;"," "," vec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0));"," float mask = value.r * 255.0;"," if(isBitSet(mask, index)){"," // there are more visible child nodes at this position"," iOffset = iOffset + value.g * 255.0 + numberOfOnes(mask, index - 1.0);"," depth++;"," }else{"," // no more visible child nodes at this position"," return depth;"," }"," offset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;"," }"," "," return depth;","}","","float getPointSizeAttenuation(){"," return pow(1.9, getLocalTreeDepth());","}","","","#endif","","","// ---------------------","// KD-TREE","// ---------------------","","#if (defined(adaptive_point_size) || defined(color_type_tree_depth)) && defined(tree_type_kdtree)","","float getLocalTreeDepth(){"," vec3 offset = vec3(0.0, 0.0, 0.0);"," float iOffset = 0.0;"," float depth = 0.0;"," "," "," vec3 size = bbSize; "," vec3 pos = position;"," "," for(float i = 0.0; i <= 1000.0; i++){"," "," vec4 value = texture2D(visibleNodes, vec2(iOffset / 2048.0, 0.0));"," "," int children = int(value.r * 255.0);"," float next = value.g * 255.0;"," int split = int(value.b * 255.0);"," "," if(next == 0.0){"," return depth;"," }"," "," vec3 splitv = vec3(0.0, 0.0, 0.0);"," if(split == 1){"," splitv.x = 1.0;"," }else if(split == 2){"," splitv.y = 1.0;"," }else if(split == 4){"," splitv.z = 1.0;"," }"," "," iOffset = iOffset + next;"," "," float factor = length(pos * splitv / size);"," if(factor < 0.5){"," // left"," if(children == 0 || children == 2){"," return depth;"," }"," }else{"," // right"," pos = pos - size * splitv * 0.5;"," if(children == 0 || children == 1){"," return depth;"," }"," if(children == 3){"," iOffset = iOffset + 1.0;"," }"," }"," size = size * ((1.0 - (splitv + 1.0) / 2.0) + 0.5);"," "," depth++;"," }"," "," "," return depth; ","}","","float getPointSizeAttenuation(){"," return pow(1.3, getLocalTreeDepth());","}","","#endif","","void main() {"," vec4 worldPosition = modelMatrix * vec4( position, 1.0 );"," vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );"," vViewPosition = -mvPosition.xyz;"," vWorldPosition = worldPosition.xyz;"," gl_Position = projectionMatrix * mvPosition;"," vOpacity = opacity;"," vLinearDepth = -mvPosition.z;"," vNormal = normalize(normalMatrix * normal);"," "," #if defined(use_edl)"," vLogDepth = log2(gl_Position.w + 1.0) / log2(far + 1.0);"," #endif"," "," //#if defined(use_logarithmic_depth_buffer)"," // float logarithmicZ = (2.0 * log2(gl_Position.w + 1.0) / log2(far + 1.0) - 1.0) * gl_Position.w;"," // gl_Position.z = logarithmicZ;"," //#endif",""," // ---------------------"," // POINT COLOR"," // ---------------------"," "," #ifdef color_type_rgb"," vColor = color;"," #elif defined color_type_height"," vec4 world = modelMatrix * vec4( position, 1.0 );"," float w = (world.y - heightMin) / (heightMax-heightMin);"," vColor = texture2D(gradient, vec2(w,1.0-w)).rgb;"," #elif defined color_type_depth"," float linearDepth = -mvPosition.z ;"," float expDepth = (gl_Position.z / gl_Position.w) * 0.5 + 0.5;"," vColor = vec3(linearDepth, expDepth, 0.0);"," #elif defined color_type_intensity"," float w = (intensity - intensityMin) / (intensityMax - intensityMin);"," vColor = vec3(w, w, w);"," #elif defined color_type_intensity_gradient"," float w = (intensity - intensityMin) / intensityMax;"," vColor = texture2D(gradient, vec2(w,1.0-w)).rgb;"," #elif defined color_type_color"," vColor = uColor;"," #elif defined color_type_tree_depth"," float depth = getLocalTreeDepth();"," float w = depth / 10.0;"," vColor = texture2D(gradient, vec2(w,1.0-w)).rgb;"," #elif defined color_type_point_index"," vColor = indices.rgb;"," #elif defined color_type_classification"," float c = mod(classification, 16.0);"," vec2 uv = vec2(c / 255.0, 0.5);"," vColor = texture2D(classificationLUT, uv).rgb;"," "," // TODO only for testing - removing points with class 7"," if(classification == 7.0){"," gl_Position = vec4(100.0, 100.0, 100.0, 0.0);"," }"," #elif defined color_type_return_number"," //float w = (returnNumber - 1.0) / 4.0 + 0.1;"," //vColor = texture2D(gradient, vec2(w, 1.0 - w)).rgb;"," "," if(numberOfReturns == 1.0){"," vColor = vec3(1.0, 1.0, 0.0);"," }else{"," if(returnNumber == 1.0){"," vColor = vec3(1.0, 0.0, 0.0);"," }else if(returnNumber == numberOfReturns){"," vColor = vec3(0.0, 0.0, 1.0);"," }else{"," vColor = vec3(0.0, 1.0, 0.0);"," }"," }"," "," #elif defined color_type_source"," float w = mod(pointSourceID, 10.0) / 10.0;"," vColor = texture2D(gradient, vec2(w,1.0 - w)).rgb;"," #elif defined color_type_normal"," vColor = (modelMatrix * vec4(normal, 0.0)).xyz;"," #elif defined color_type_phong"," vColor = color;"," #endif"," "," //if(vNormal.z < 0.0){"," // gl_Position = vec4(1000.0, 1000.0, 1000.0, 1.0);"," //}"," "," // ---------------------"," // POINT SIZE"," // ---------------------"," float pointSize = 1.0;"," "," float projFactor = 1.0 / tan(fov / 2.0);"," projFactor /= vViewPosition.z;"," projFactor *= screenHeight / 2.0;"," float r = spacing * 1.5;"," vRadius = r;"," #if defined fixed_point_size"," pointSize = size;"," #elif defined attenuated_point_size"," pointSize = size * projFactor;"," #elif defined adaptive_point_size"," float worldSpaceSize = size * r / getPointSizeAttenuation();"," pointSize = worldSpaceSize * projFactor;"," #endif",""," pointSize = max(minSize, pointSize);"," pointSize = min(maxSize, pointSize);"," "," vRadius = pointSize / projFactor;"," "," gl_PointSize = pointSize;"," "," "," // ---------------------"," // CLIPPING"," // ---------------------"," "," #if defined use_clip_box"," bool insideAny = false;"," for(int i = 0; i < max_clip_boxes; i++){"," if(i == int(clipBoxCount)){"," break;"," }"," "," vec4 clipPosition = clipBoxes[i] * modelMatrix * vec4( position, 1.0 );"," bool inside = -0.5 <= clipPosition.x && clipPosition.x <= 0.5;"," inside = inside && -0.5 <= clipPosition.y && clipPosition.y <= 0.5;"," inside = inside && -0.5 <= clipPosition.z && clipPosition.z <= 0.5;"," insideAny = insideAny || inside;"," }"," if(!insideAny){"," "," #if defined clip_outside"," gl_Position = vec4(1000.0, 1000.0, 1000.0, 1.0);"," #elif defined clip_highlight_inside && !defined(color_type_depth)"," float c = (vColor.r + vColor.g + vColor.b) / 6.0;"," #endif"," }else{"," #if defined clip_highlight_inside"," vColor.r += 0.5;"," #endif"," }"," "," #endif"," ","}",""].join("\n"),Potree.Shaders["pointcloud.fs"]=["","#if defined use_interpolation"," #extension GL_EXT_frag_depth : enable","#endif","","","// the following is an incomplete list of attributes, uniforms and defines","// which are automatically added through the THREE.ShaderMaterial","","// #define USE_COLOR","// ","// uniform mat4 viewMatrix;","// uniform vec3 cameraPosition;","","","uniform mat4 projectionMatrix;","uniform float opacity;","","","#if defined(color_type_phong)",""," uniform vec3 diffuse;"," uniform vec3 ambient;"," uniform vec3 emissive;"," uniform vec3 specular;"," uniform float shininess;"," uniform vec3 ambientLightColor;",""," #if MAX_POINT_LIGHTS > 0",""," uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];"," uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];"," uniform float pointLightDistance[ MAX_POINT_LIGHTS ];"," uniform float pointLightDecay[ MAX_POINT_LIGHTS ];",""," #endif",""," #if MAX_DIR_LIGHTS > 0",""," uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];"," uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",""," #endif","","#endif","","//#if MAX_SPOT_LIGHTS > 0","//","// uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];","// uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];","// uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];","// uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];","// uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];","//","// uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];","//","//#endif","","uniform float fov;","uniform float spacing;","uniform float near;","uniform float far;","uniform float pcIndex;","uniform float screenWidth;","uniform float screenHeight;","","uniform sampler2D depthMap;","","varying vec3 vColor;","varying float vOpacity;","varying float vLinearDepth;","varying float vLogDepth;","varying vec3 vViewPosition;","varying float vRadius;","varying vec3 vWorldPosition;","varying vec3 vNormal;","","float specularStrength = 1.0;","","void main() {",""," vec3 color = vColor;"," float depth = gl_FragCoord.z;",""," #if defined(circle_point_shape) || defined(use_interpolation) || defined (weighted_splats)"," float u = 2.0 * gl_PointCoord.x - 1.0;"," float v = 2.0 * gl_PointCoord.y - 1.0;"," #endif"," "," #if defined(circle_point_shape) || defined (weighted_splats)"," float cc = u*u + v*v;"," if(cc > 1.0){"," discard;"," }"," #endif"," "," #if defined weighted_splats"," vec2 uv = gl_FragCoord.xy / vec2(screenWidth, screenHeight);"," float sDepth = texture2D(depthMap, uv).r;"," if(vLinearDepth > sDepth + vRadius){"," discard;"," }"," #endif"," "," #if defined use_interpolation"," float wi = 0.0 - ( u*u + v*v);"," vec4 pos = vec4(-vViewPosition, 1.0);"," pos.z += wi * vRadius;"," float linearDepth = pos.z;"," pos = projectionMatrix * pos;"," pos = pos / pos.w;"," float expDepth = pos.z;"," depth = (pos.z + 1.0) / 2.0;"," gl_FragDepthEXT = depth;"," "," #if defined(color_type_depth)"," color.r = linearDepth;"," color.g = expDepth;"," #endif"," "," #endif"," "," #if defined color_type_point_index"," gl_FragColor = vec4(color, pcIndex / 255.0);"," #else"," gl_FragColor = vec4(color, vOpacity);"," #endif"," "," #if defined weighted_splats"," float w = pow(1.0 - (u*u + v*v), 2.0);"," gl_FragColor.rgb = gl_FragColor.rgb * w;"," gl_FragColor.a = w;"," #endif"," "," vec3 normal = normalize( vNormal );"," normal.z = abs(normal.z);"," vec3 viewPosition = normalize( vViewPosition );"," "," #if defined(color_type_phong)",""," // code taken from three.js phong light fragment shader"," "," #if MAX_POINT_LIGHTS > 0",""," vec3 pointDiffuse = vec3( 0.0 );"," vec3 pointSpecular = vec3( 0.0 );",""," for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",""," vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );"," vec3 lVector = lPosition.xyz + vViewPosition.xyz;",""," float lDistance = 1.0;"," if ( pointLightDistance[ i ] > 0.0 )"," lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",""," lVector = normalize( lVector );",""," // diffuse",""," float dotProduct = dot( normal, lVector );",""," #ifdef WRAP_AROUND",""," float pointDiffuseWeightFull = max( dotProduct, 0.0 );"," float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",""," vec3 pointDiffuseWeight = mix( vec3( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );",""," #else",""," float pointDiffuseWeight = max( dotProduct, 0.0 );",""," #endif",""," pointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;",""," // specular",""," vec3 pointHalfVector = normalize( lVector + viewPosition );"," float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );"," float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );",""," float specularNormalization = ( shininess + 2.0 ) / 8.0;",""," vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, pointHalfVector ), 0.0 ), 5.0 );"," pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;"," pointSpecular = vec3(0.0, 0.0, 0.0);"," }"," "," #endif"," "," #if MAX_DIR_LIGHTS > 0",""," vec3 dirDiffuse = vec3( 0.0 );"," vec3 dirSpecular = vec3( 0.0 );",""," for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {",""," vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );"," vec3 dirVector = normalize( lDirection.xyz );",""," // diffuse",""," float dotProduct = dot( normal, dirVector );",""," #ifdef WRAP_AROUND",""," float dirDiffuseWeightFull = max( dotProduct, 0.0 );"," float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",""," vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );",""," #else",""," float dirDiffuseWeight = max( dotProduct, 0.0 );",""," #endif",""," dirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;",""," // specular",""," vec3 dirHalfVector = normalize( dirVector + viewPosition );"," float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );"," float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );",""," float specularNormalization = ( shininess + 2.0 ) / 8.0;",""," vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );"," dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;"," }",""," #endif"," "," vec3 totalDiffuse = vec3( 0.0 );"," vec3 totalSpecular = vec3( 0.0 );"," "," #if MAX_POINT_LIGHTS > 0",""," totalDiffuse += pointDiffuse;"," totalSpecular += pointSpecular;",""," #endif"," "," #if MAX_DIR_LIGHTS > 0",""," totalDiffuse += dirDiffuse;"," totalSpecular += dirSpecular;",""," #endif"," "," gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;",""," #endif"," "," "," #if defined(use_edl)"," gl_FragColor.a = vLogDepth;"," #endif"," ","}","","",""].join("\n"),
Potree.Shaders["normalize.vs"]=["","varying vec2 vUv;","","void main() {"," vUv = uv;",""," gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);","}"].join("\n"),Potree.Shaders["normalize.fs"]=["","#extension GL_EXT_frag_depth : enable","","uniform sampler2D depthMap;","uniform sampler2D texture;","","varying vec2 vUv;","","void main() {"," float depth = texture2D(depthMap, vUv).g; "," "," if(depth <= 0.0){"," discard;"," }"," "," vec4 color = texture2D(texture, vUv); "," color = color / color.w;"," "," gl_FragColor = vec4(color.xyz, 1.0); "," "," gl_FragDepthEXT = depth;","}"].join("\n"),Potree.Shaders["edl.vs"]=["","","varying vec2 vUv;","","void main() {"," vUv = uv;"," "," vec4 mvPosition = modelViewMatrix * vec4(position,1.0);",""," gl_Position = projectionMatrix * mvPosition;","}"].join("\n"),Potree.Shaders["edl.fs"]=["","// ","// adapted from the EDL shader code from Christian Boucheny in cloud compare:","// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL","//","","#define NEIGHBOUR_COUNT 8","","uniform mat4 projectionMatrix;","","uniform float screenWidth;","uniform float screenHeight;","uniform float near;","uniform float far;","uniform vec2 neighbours[NEIGHBOUR_COUNT];","uniform vec3 lightDir;","uniform float expScale;","uniform float radius;","","//uniform sampler2D depthMap;","uniform sampler2D colorMap;","","varying vec2 vUv;","","/**"," * transform linear depth to [0,1] interval with 1 beeing closest to the camera."," */","float ztransform(float linearDepth){"," return 1.0 - (linearDepth - near) / (far - near);","}","","float expToLinear(float z){"," z = 2.0 * z - 1.0;"," float linear = (2.0 * near * far) / (far + near - z * (far - near));",""," return linear;","}","","// this actually only returns linear depth values if LOG_BIAS is 1.0","// lower values work out more nicely, though.","#define LOG_BIAS 0.01","float logToLinear(float z){"," return (pow((1.0 + LOG_BIAS * far), z) - 1.0) / LOG_BIAS;","}","","float obscurance(float z, float dist){"," return max(0.0, z) / dist;","}","","float computeObscurance(float linearDepth){"," vec4 P = vec4(0, 0, 1, -ztransform(linearDepth));"," vec2 uvRadius = radius / vec2(screenWidth, screenHeight);"," "," float sum = 0.0;"," "," for(int c = 0; c < NEIGHBOUR_COUNT; c++){"," vec2 N_rel_pos = uvRadius * neighbours[c];"," vec2 N_abs_pos = vUv + N_rel_pos;"," "," float neighbourDepth = logToLinear(texture2D(colorMap, N_abs_pos).a);"," "," if(neighbourDepth != 0.0){"," float Zn = ztransform(neighbourDepth);"," float Znp = dot( vec4( N_rel_pos, Zn, 1.0), P );"," "," sum += obscurance( Znp, 0.05 * linearDepth );"," }"," }"," "," return sum;","}","","void main(){"," float linearDepth = logToLinear(texture2D(colorMap, vUv).a);"," "," float f = computeObscurance(linearDepth);"," f = exp(-expScale * f);"," "," vec4 color = texture2D(colorMap, vUv);"," if(color.a == 0.0 && f >= 1.0){"," discard;"," }"," "," gl_FragColor = vec4(color.rgb * f, 1.0);","}",""].join("\n"),Potree.Shaders["blur.vs"]=["","varying vec2 vUv;","","void main() {"," vUv = uv;",""," gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);","}"].join("\n"),Potree.Shaders["blur.fs"]=["","uniform mat4 projectionMatrix;","","uniform float screenWidth;","uniform float screenHeight;","uniform float near;","uniform float far;","","uniform sampler2D map;","","varying vec2 vUv;","","void main() {",""," float dx = 1.0 / screenWidth;"," float dy = 1.0 / screenHeight;",""," vec3 color = vec3(0.0, 0.0, 0.0);"," color += texture2D(map, vUv + vec2(-dx, -dy)).rgb;"," color += texture2D(map, vUv + vec2( 0, -dy)).rgb;"," color += texture2D(map, vUv + vec2(+dx, -dy)).rgb;"," color += texture2D(map, vUv + vec2(-dx, 0)).rgb;"," color += texture2D(map, vUv + vec2( 0, 0)).rgb;"," color += texture2D(map, vUv + vec2(+dx, 0)).rgb;"," color += texture2D(map, vUv + vec2(-dx, dy)).rgb;"," color += texture2D(map, vUv + vec2( 0, dy)).rgb;"," color += texture2D(map, vUv + vec2(+dx, dy)).rgb;"," "," color = color / 9.0;"," "," gl_FragColor = vec4(color, 1.0);"," "," ","}"].join("\n"),THREE.PerspectiveCamera.prototype.zoomTo=function(e,t){if(e.geometry||e.boundingSphere){e.geometry&&null===e.geometry.boundingSphere&&e.geometry.computeBoundingSphere(),e.updateMatrixWorld();var i=t||1,o=e.boundingSphere||e.geometry.boundingSphere;o=o.clone().applyMatrix4(e.matrixWorld);var n=o.radius,r=this.fov*Math.PI/180;this.aspect<1&&(r*=this.aspect);var a=Math.abs(n/Math.sin(r/2))*i,s=new THREE.Vector3(0,0,-1).applyQuaternion(this.quaternion),l=s.multiplyScalar(-a);this.position.copy(o.center.clone().add(l))}},THREE.Ray.prototype.distanceToPlaneWithNegative=function(e){var t=e.normal.dot(this.direction);if(0==t)return 0==e.distanceToPoint(this.origin)?0:null;var i=-(this.origin.dot(e.normal)+e.constant)/t;return i},Potree.POCLoader=function(){},Potree.POCLoader.load=function(e,t){try{var i=new Potree.PointCloudOctreeGeometry;i.url=e;var o=new XMLHttpRequest;o.open("GET",e,!0),o.onreadystatechange=function(){if(4===o.readyState&&(200===o.status||0===o.status)){var n=JSON.parse(o.responseText),r=new Potree.Version(n.version);0===n.octreeDir.indexOf("http")?i.octreeDir=n.octreeDir:i.octreeDir=e+"/../"+n.octreeDir,i.spacing=n.spacing,i.hierarchyStepSize=n.hierarchyStepSize,i.pointAttributes=n.pointAttributes;var a=new THREE.Vector3(n.boundingBox.lx,n.boundingBox.ly,n.boundingBox.lz),s=new THREE.Vector3(n.boundingBox.ux,n.boundingBox.uy,n.boundingBox.uz),l=new THREE.Box3(a,s),d=l.clone();n.tightBoundingBox&&(d.min.copy(new THREE.Vector3(n.tightBoundingBox.lx,n.tightBoundingBox.ly,n.tightBoundingBox.lz)),d.max.copy(new THREE.Vector3(n.tightBoundingBox.ux,n.tightBoundingBox.uy,n.tightBoundingBox.uz)));var c=new THREE.Vector3(0,0,0);c.set(-a.x,-a.y,-a.z),l.min.add(c),l.max.add(c),d.min.add(c),d.max.add(c),i.boundingBox=l,i.tightBoundingBox=d,i.boundingSphere=l.getBoundingSphere(),i.tightBoundingSphere=d.getBoundingSphere(),i.offset=c,"LAS"===n.pointAttributes?i.loader=new Potree.LasLazLoader(n.version):"LAZ"===n.pointAttributes?i.loader=new Potree.LasLazLoader(n.version):(i.loader=new Potree.BinaryLoader(n.version,l,n.scale),i.pointAttributes=new Potree.PointAttributes(i.pointAttributes));var u={},h="r",p=new Potree.PointCloudOctreeGeometryNode(h,i,l);if(p.level=0,p.hasChildren=!0,r.upTo("1.5")?p.numPoints=n.hierarchy[0][1]:p.numPoints=0,i.root=p,i.root.load(),u[h]=p,r.upTo("1.4"))for(var m=1;m<n.hierarchy.length;m++){var h=n.hierarchy[m][0],f=n.hierarchy[m][1],v=parseInt(h.charAt(h.length-1)),g=h.substring(0,h.length-1),E=u[g],y=h.length-1,l=Potree.POCLoader.createChildAABB(E.boundingBox,v),b=new Potree.PointCloudOctreeGeometryNode(h,i,l);b.level=y,b.numPoints=f,E.addChild(b),u[h]=b}i.nodes=u,t(i)}},o.send(null)}catch(n){console.log("loading failed: '"+e+"'"),console.log(n)}},Potree.POCLoader.loadPointAttributes=function(e){for(var t=e.pointAttributes,i=new Potree.PointAttributes,o=0;o<t.length;o++){var n=Potree.PointAttribute[t[o]];i.add(n)}return i},Potree.POCLoader.createChildAABB=function(e,t){var i,o,i=(THREE.Vector3,e.min),o=e.max,n=(new THREE.Vector3).copy(o).sub(i).multiplyScalar(.5),r=new THREE.Vector3(n.x,0,0),a=new THREE.Vector3(0,n.y,0),s=new THREE.Vector3(0,0,n.z),l=i,d=(new THREE.Vector3).add(i).add(n);return 1===t?(i=(new THREE.Vector3).copy(l).add(s),o=(new THREE.Vector3).copy(d).add(s)):3===t?(i=(new THREE.Vector3).copy(l).add(s).add(a),o=(new THREE.Vector3).copy(d).add(s).add(a)):0===t?(i=l,o=d):2===t?(i=(new THREE.Vector3).copy(l).add(a),o=(new THREE.Vector3).copy(d).add(a)):5===t?(i=(new THREE.Vector3).copy(l).add(s).add(r),o=(new THREE.Vector3).copy(d).add(s).add(r)):7===t?(i=(new THREE.Vector3).copy(l).add(n),o=(new THREE.Vector3).copy(d).add(n)):4===t?(i=(new THREE.Vector3).copy(l).add(r),o=(new THREE.Vector3).copy(d).add(r)):6===t&&(i=(new THREE.Vector3).copy(l).add(r).add(a),o=(new THREE.Vector3).copy(d).add(r).add(a)),new THREE.Box3(i,o)},Potree.PointAttributeNames={},Potree.PointAttributeNames.POSITION_CARTESIAN=0,Potree.PointAttributeNames.COLOR_PACKED=1,Potree.PointAttributeNames.COLOR_FLOATS_1=2,Potree.PointAttributeNames.COLOR_FLOATS_255=3,Potree.PointAttributeNames.NORMAL_FLOATS=4,Potree.PointAttributeNames.FILLER=5,Potree.PointAttributeNames.INTENSITY=6,Potree.PointAttributeNames.CLASSIFICATION=7,Potree.PointAttributeNames.NORMAL_SPHEREMAPPED=8,Potree.PointAttributeNames.NORMAL_OCT16=9,Potree.PointAttributeNames.NORMAL=10,Potree.PointAttributeTypes={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}};var i=0;for(var obj in Potree.PointAttributeTypes)Potree.PointAttributeTypes[i]=Potree.PointAttributeTypes[obj],i++;Potree.PointAttribute=function(e,t,i){this.name=e,this.type=t,this.numElements=i,this.byteSize=this.numElements*this.type.size},Potree.PointAttribute.POSITION_CARTESIAN=new Potree.PointAttribute(Potree.PointAttributeNames.POSITION_CARTESIAN,Potree.PointAttributeTypes.DATA_TYPE_FLOAT,3),Potree.PointAttribute.RGBA_PACKED=new Potree.PointAttribute(Potree.PointAttributeNames.COLOR_PACKED,Potree.PointAttributeTypes.DATA_TYPE_INT8,4),Potree.PointAttribute.COLOR_PACKED=Potree.PointAttribute.RGBA_PACKED,Potree.PointAttribute.RGB_PACKED=new Potree.PointAttribute(Potree.PointAttributeNames.COLOR_PACKED,Potree.PointAttributeTypes.DATA_TYPE_INT8,3),Potree.PointAttribute.NORMAL_FLOATS=new Potree.PointAttribute(Potree.PointAttributeNames.NORMAL_FLOATS,Potree.PointAttributeTypes.DATA_TYPE_FLOAT,3),Potree.PointAttribute.FILLER_1B=new Potree.PointAttribute(Potree.PointAttributeNames.FILLER,Potree.PointAttributeTypes.DATA_TYPE_UINT8,1),Potree.PointAttribute.INTENSITY=new Potree.PointAttribute(Potree.PointAttributeNames.INTENSITY,Potree.PointAttributeTypes.DATA_TYPE_UINT16,1),Potree.PointAttribute.CLASSIFICATION=new Potree.PointAttribute(Potree.PointAttributeNames.CLASSIFICATION,Potree.PointAttributeTypes.DATA_TYPE_UINT8,1),Potree.PointAttribute.NORMAL_SPHEREMAPPED=new Potree.PointAttribute(Potree.PointAttributeNames.NORMAL_SPHEREMAPPED,Potree.PointAttributeTypes.DATA_TYPE_UINT8,2),Potree.PointAttribute.NORMAL_OCT16=new Potree.PointAttribute(Potree.PointAttributeNames.NORMAL_OCT16,Potree.PointAttributeTypes.DATA_TYPE_UINT8,2),Potree.PointAttribute.NORMAL=new Potree.PointAttribute(Potree.PointAttributeNames.NORMAL,Potree.PointAttributeTypes.DATA_TYPE_FLOAT,3),Potree.PointAttributes=function(e){if(this.attributes=new Array,this.byteSize=0,this.size=0,null!=e)for(var t=0;t<e.length;t++){var i=e[t],o=Potree.PointAttribute[i];this.attributes.push(o),this.byteSize+=o.byteSize,this.size++}},Potree.PointAttributes.prototype.add=function(e){this.attributes.push(e),this.byteSize+=e.byteSize,this.size++},Potree.PointAttributes.prototype.hasColors=function(){for(var e in this.attributes){var t=this.attributes[e];if(t.name===Potree.PointAttributeNames.COLOR_PACKED)return!0}return!1},Potree.PointAttributes.prototype.hasNormals=function(){for(var e in this.attributes){var t=this.attributes[e];if(t===Potree.PointAttribute.NORMAL_SPHEREMAPPED||t===Potree.PointAttribute.NORMAL_FLOATS||t===Potree.PointAttribute.NORMAL||t===Potree.PointAttribute.NORMAL_OCT16)return!0}return!1},Potree.BinaryLoader=function(e,t,i){"string"==typeof e?this.version=new Potree.Version(e):this.version=e,this.boundingBox=t,this.scale=i},Potree.BinaryLoader.prototype.load=function(e){if(!e.loaded){var t=this,i=e.getURL();this.version.equalOrHigher("1.4")&&(i+=".bin");var o=new XMLHttpRequest;o.open("GET",i,!0),o.responseType="arraybuffer",o.overrideMimeType("text/plain; charset=x-user-defined"),o.onreadystatechange=function(){if(4===o.readyState)if(200===o.status||0===o.status){var n=o.response;t.parse(e,n)}else console.log("Failed to load file! HTTP status: "+o.status+", file: "+i)};try{o.send(null)}catch(n){console.log("fehler beim laden der punktwolke: "+n)}}},Potree.BinaryLoader.prototype.parse=function(e,t){var i=t.byteLength/e.pcoGeometry.pointAttributes.byteSize,o=e.pcoGeometry.pointAttributes;this.version.upTo("1.5")&&(e.numPoints=i);var n=Potree.workers.binaryDecoder.getWorker();n.onmessage=function(t){var o=t.data,r=o.attributeBuffers,a=new THREE.Box3((new THREE.Vector3).fromArray(o.tightBoundingBox.min),(new THREE.Vector3).fromArray(o.tightBoundingBox.max));Potree.workers.binaryDecoder.returnWorker(n);var s=new THREE.BufferGeometry;for(var l in r)if(r.hasOwnProperty(l)){var d=r[l].buffer,c=r[l].attribute;c.numElements;parseInt(l)===Potree.PointAttributeNames.POSITION_CARTESIAN?s.addAttribute("position",new THREE.BufferAttribute(new Float32Array(d),3)):parseInt(l)===Potree.PointAttributeNames.COLOR_PACKED?s.addAttribute("color",new THREE.BufferAttribute(new Float32Array(d),3)):parseInt(l)===Potree.PointAttributeNames.INTENSITY?s.addAttribute("intensity",new THREE.BufferAttribute(new Float32Array(d),1)):parseInt(l)===Potree.PointAttributeNames.CLASSIFICATION?s.addAttribute("classification",new THREE.BufferAttribute(new Float32Array(d),1)):parseInt(l)===Potree.PointAttributeNames.NORMAL_SPHEREMAPPED?s.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(d),3)):parseInt(l)===Potree.PointAttributeNames.NORMAL_OCT16?s.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(d),3)):parseInt(l)===Potree.PointAttributeNames.NORMAL&&s.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(d),3))}if(s.addAttribute("indices",new THREE.BufferAttribute(new Float32Array(o.indices),1)),!s.attributes.normal){var d=new Float32Array(3*i);s.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(d),3))}s.boundingBox=e.boundingBox,e.geometry=s,e.tightBoundingBox=a,e.loaded=!0,e.loading=!1,e.pcoGeometry.numNodesLoading--};var r={buffer:t,pointAttributes:o,version:this.version.version,min:[e.boundingBox.min.x,e.boundingBox.min.y,e.boundingBox.min.z],offset:[e.pcoGeometry.offset.x,e.pcoGeometry.offset.y,e.pcoGeometry.offset.z],scale:this.scale};n.postMessage(r,[r.buffer])},Potree.LasLazLoader=function(e){"string"==typeof e?this.version=new Potree.Version(e):this.version=e},Potree.LasLazLoader.prototype.load=function(e){if(!e.loaded){var t=e.pcoGeometry.pointAttributes,i=e.getURL();this.version.equalOrHigher("1.4")&&(i+="."+t.toLowerCase());var o=this,n=new XMLHttpRequest;n.open("GET",i,!0),n.responseType="arraybuffer",n.overrideMimeType("text/plain; charset=x-user-defined"),n.onreadystatechange=function(){if(4===n.readyState)if(200===n.status){var t=n.response;o.parse(e,t)}else console.log("Failed to load file! HTTP status: "+n.status+", file: "+i)},n.send(null)}},Potree.LasLazLoader.progressCB=function(e){},Potree.LasLazLoader.prototype.parse=function(e,t){var i=new LASFile(t),o=new Potree.LasLazBatcher(e);return Promise.resolve(i).cancellable().then(function(e){return e.open().then(function(){return e.isOpen=!0,e})["catch"](Promise.CancellationError,function(t){return e.close().then(function(){throw t})})}).then(function(e){return e.getHeader().then(function(t){return[e,t]})}).then(function(e){var t=e[0],i=e[1],n=1,r=0,a=1>=n?i.pointsCount:i.pointsCount/n,s=function(){var e=t.readData(1e6,0,n);return e.then(function(e){return o.push(new LASDecoder(e.buffer,i.pointsFormatId,i.pointsStructSize,e.count,i.scale,i.offset,i.mins,i.maxs)),r+=e.count,Potree.LasLazLoader.progressCB(r/a),e.hasMoreData?s():(i.totalRead=r,i.versionAsString=t.versionAsString,i.isCompressed=t.isCompressed,[t,i,o])})};return s()}).then(function(e){var t=e[0];return Potree.LasLazLoader.progressCB(1),t.close().then(function(){return t.isOpen=!1,Promise.delay(200).cancellable()}).then(function(){return e.slice(1)})})["catch"](Promise.CancellationError,function(e){if(i.isOpen)return i.close().then(function(){throw i.isOpen=!1,e});throw e})},Potree.LasLazLoader.prototype.handle=function(e,t){},Potree.LasLazBatcher=function(e){this.push=function(t){var i=Potree.workers.lasdecoder.getWorker(),o=new THREE.Vector3(t.mins[0],t.mins[1],t.mins[2]),n=new THREE.Vector3(t.maxs[0],t.maxs[1],t.maxs[2]);o.add(e.pcoGeometry.offset),n.add(e.pcoGeometry.offset),i.onmessage=function(r){for(var a=new THREE.BufferGeometry,s=t.pointsCount,l=r.data.position,d=r.data.color,c=r.data.intensity,u=new Uint8Array(r.data.classification),h=new Float32Array(u.byteLength),p=new Uint8Array(r.data.returnNumber),m=new Uint8Array(r.data.numberOfReturns),f=new Float32Array(p.byteLength),v=new Float32Array(m.byteLength),g=new Uint16Array(r.data.pointSourceID),E=new Float32Array(g.length),y=new ArrayBuffer(4*s),b=new Uint32Array(y),T=new THREE.Box3,P=new Float32Array(l),R=0;s>R;R++)h[R]=u[R],f[R]=p[R],v[R]=m[R],E[R]=g[R],b[R]=R,T.expandByPoint(new THREE.Vector3(P[3*R+0],P[3*R+1],P[3*R+2]));a.addAttribute("position",new THREE.BufferAttribute(new Float32Array(l),3)),a.addAttribute("color",new THREE.BufferAttribute(new Float32Array(d),3)),a.addAttribute("intensity",new THREE.BufferAttribute(new Float32Array(c),1)),a.addAttribute("classification",new THREE.BufferAttribute(new Float32Array(h),1)),a.addAttribute("returnNumber",new THREE.BufferAttribute(new Float32Array(f),1)),a.addAttribute("numberOfReturns",new THREE.BufferAttribute(new Float32Array(v),1)),a.addAttribute("pointSourceID",new THREE.BufferAttribute(new Float32Array(E),1)),a.addAttribute("indices",new THREE.BufferAttribute(y,1)),a.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(3*s),3));var C=new THREE.Box3((new THREE.Vector3).fromArray(r.data.tightBoundingBox.min),(new THREE.Vector3).fromArray(r.data.tightBoundingBox.max));a.boundingBox=new THREE.Box3(o,n),e.tightBoundingBox=C,e.geometry=a,e.loaded=!0,e.loading=!1,e.pcoGeometry.numNodesLoading--,Potree.workers.lasdecoder.returnWorker(i)};var r={buffer:t.arrayb,numPoints:t.pointsCount,pointSize:t.pointSize,pointFormatID:2,scale:t.scale,offset:t.offset,mins:[e.pcoGeometry.boundingBox.min.x,e.pcoGeometry.boundingBox.min.y,e.pcoGeometry.boundingBox.min.z],maxs:[e.pcoGeometry.boundingBox.max.x,e.pcoGeometry.boundingBox.max.y,e.pcoGeometry.boundingBox.max.z],bbOffset:[e.pcoGeometry.offset.x,e.pcoGeometry.offset.y,e.pcoGeometry.offset.z]};i.postMessage(r,[r.buffer])}},Potree.Gradients={RAINBOW:[[0,new THREE.Color(.278,0,.714)],[1/6,new THREE.Color(0,0,1)],[2/6,new THREE.Color(0,1,1)],[.5,new THREE.Color(0,1,0)],[4/6,new THREE.Color(1,1,0)],[5/6,new THREE.Color(1,.64,0)],[1,new THREE.Color(1,0,0)]],GRAYSCALE:[[0,new THREE.Color(0,0,0)],[1,new THREE.Color(1,1,1)]]},Potree.Classification={DEFAULT:{0:new THREE.Color(.5,.5,.5),1:new THREE.Color(.5,.5,.5),2:new THREE.Color(.63,.32,.18),3:new THREE.Color(0,1,0),4:new THREE.Color(0,.8,0),5:new THREE.Color(0,.6,0),6:new THREE.Color(1,.66,0),7:new THREE.Color(1,0,1),8:new THREE.Color(1,0,0),9:new THREE.Color(0,0,1),12:new THREE.Color(1,1,0),DEFAULT:new THREE.Color(.3,.6,.6)}},Potree.PointSizeType={FIXED:0,ATTENUATED:1,ADAPTIVE:2},Potree.PointShape={SQUARE:0,CIRCLE:1},Potree.PointColorType={RGB:0,COLOR:1,DEPTH:2,HEIGHT:3,INTENSITY:4,INTENSITY_GRADIENT:5,TREE_DEPTH:6,POINT_INDEX:7,CLASSIFICATION:8,RETURN_NUMBER:9,SOURCE:10,NORMAL:11,PHONG:12,TREE_DEPTH:13},Potree.ClipMode={DISABLED:0,CLIP_OUTSIDE:1,HIGHLIGHT_INSIDE:2},Potree.TreeType={OCTREE:0,KDTREE:1},Potree.PointCloudMaterial=function(e){THREE.Material.call(this),e=e||{};var t=new THREE.Color(16777215),i=THREE.ImageUtils.generateDataTexture(2048,1,t);i.magFilter=THREE.NearestFilter,this.visibleNodesTexture=i;var o=e.size||1,n=e.minSize||1,r=e.maxSize||50,a=e.treeType||Potree.TreeType.OCTREE,s=1;this._pointSizeType=Potree.PointSizeType.ATTENUATED,this._pointShape=Potree.PointShape.SQUARE,this._interpolate=!1,this._pointColorType=Potree.PointColorType.RGB,this._useClipBox=!1,this.numClipBoxes=0,this._clipMode=Potree.ClipMode.DISABLED,this._weighted=!1,this._depthMap,this._gradient=Potree.Gradients.RAINBOW,this._classification=Potree.Classification.DEFAULT,this.gradientTexture=Potree.PointCloudMaterial.generateGradientTexture(this._gradient),this.classificationTexture=Potree.PointCloudMaterial.generateClassificationTexture(this._classification),this.lights=!0,this._treeType=a,this._useLogarithmicDepthBuffer=!1,this._useEDL=!1;var l={},d={spacing:{type:"f",value:1},fov:{type:"f",value:1},screenWidth:{type:"f",value:1},screenHeight:{type:"f",value:1},near:{type:"f",value:.1},far:{type:"f",value:1},uColor:{type:"c",value:new THREE.Color(16777215)},opacity:{type:"f",value:1},size:{type:"f",value:10},minSize:{type:"f",value:2},maxSize:{type:"f",value:2},octreeSize:{type:"f",value:0},bbSize:{type:"fv",value:[0,0,0]},heightMin:{type:"f",value:0},heightMax:{type:"f",value:1},intensityMin:{type:"f",value:0},intensityMax:{type:"f",value:1},clipBoxCount:{type:"f",value:0},visibleNodes:{type:"t",value:this.visibleNodesTexture},pcIndex:{type:"f",value:0},gradient:{type:"t",value:this.gradientTexture},classificationLUT:{type:"t",value:this.classificationTexture},clipBoxes:{type:"Matrix4fv",value:[]},depthMap:{type:"t",value:null},diffuse:{type:"fv",value:[1,1,1]},ambient:{type:"fv",value:[.1,.1,.1]},ambientLightColor:{type:"fv",value:[1,1,1]},directionalLightColor:{type:"fv",value:null},directionalLightDirection:{type:"fv",value:null},pointLightColor:{type:"fv",value:null},pointLightPosition:{type:"fv",value:null},pointLightDistance:{type:"fv1",value:null},pointLightDecay:{type:"fv1",value:null},spotLightColor:{type:"fv",value:null},spotLightPosition:{type:"fv",value:null},spotLightDistance:{type:"fv1",value:null},spotLightDecay:{type:"fv1",value:null},spotLightDirection:{type:"fv",value:null},spotLightAngleCos:{type:"fv1",value:null},spotLightExponent:{type:"fv1",value:null},hemisphereLightSkyColor:{type:"fv",value:null},hemisphereLightGroundColor:{type:"fv",value:null},hemisphereLightDirection:{type:"fv",value:null}};this.defaultAttributeValues.normal=[0,0,0],this.setValues({uniforms:d,attributes:l,vertexShader:this.getDefines()+Potree.Shaders["pointcloud.vs"],fragmentShader:this.getDefines()+Potree.Shaders["pointcloud.fs"],vertexColors:THREE.VertexColors,size:o,minSize:n,maxSize:r,nodeSize:s,pcIndex:0,alphaTest:.9})},Potree.PointCloudMaterial.prototype=new THREE.ShaderMaterial,Potree.PointCloudMaterial.prototype.updateShaderSource=function(){var e={};this.pointColorType===Potree.PointColorType.INTENSITY||this.pointColorType===Potree.PointColorType.INTENSITY_GRADIENT?e.intensity={type:"f",value:[]}:this.pointColorType===Potree.PointColorType.CLASSIFICATION?e.classification={type:"f",value:[]}:this.pointColorType===Potree.PointColorType.RETURN_NUMBER?(e.returnNumber={type:"f",value:[]},e.numberOfReturns={type:"f",value:[]}):this.pointColorType===Potree.PointColorType.SOURCE?e.pointSourceID={type:"f",value:[]}:(this.pointColorType===Potree.PointColorType.NORMAL||this.pointColorType===Potree.PointColorType.PHONG)&&(e.normal={type:"f",value:[]});var t=this.getDefines()+Potree.Shaders["pointcloud.vs"],i=this.getDefines()+Potree.Shaders["pointcloud.fs"];this.setValues({attributes:e,vertexShader:t,fragmentShader:i}),this.depthMap&&(this.uniforms.depthMap.value=this.depthMap,this.setValues({depthMap:this.depthMap})),1===this.opacity?this.setValues({blending:THREE.NoBlending,transparent:!1,depthTest:!0,depthWrite:!0}):this.setValues({blending:THREE.AdditiveBlending,transparent:!0,depthTest:!1,depthWrite:!0}),this.weighted&&this.setValues({blending:THREE.AdditiveBlending,transparent:!0,depthTest:!0,depthWrite:!1}),this.needsUpdate=!0},Potree.PointCloudMaterial.prototype.getDefines=function(){var e="";return this.pointSizeType===Potree.PointSizeType.FIXED?e+="#define fixed_point_size\n":this.pointSizeType===Potree.PointSizeType.ATTENUATED?e+="#define attenuated_point_size\n":this.pointSizeType===Potree.PointSizeType.ADAPTIVE&&(e+="#define adaptive_point_size\n"),this.pointShape===Potree.PointShape.SQUARE?e+="#define square_point_shape\n":this.pointShape===Potree.PointShape.CIRCLE&&(e+="#define circle_point_shape\n"),this._interpolate&&(e+="#define use_interpolation\n"),this._useLogarithmicDepthBuffer&&(e+="#define use_logarithmic_depth_buffer\n"),this._useEDL&&(e+="#define use_edl\n"),this._pointColorType===Potree.PointColorType.RGB?e+="#define color_type_rgb\n":this._pointColorType===Potree.PointColorType.COLOR?e+="#define color_type_color\n":this._pointColorType===Potree.PointColorType.DEPTH?e+="#define color_type_depth\n":this._pointColorType===Potree.PointColorType.HEIGHT?e+="#define color_type_height\n":this._pointColorType===Potree.PointColorType.INTENSITY?e+="#define color_type_intensity\n":this._pointColorType===Potree.PointColorType.INTENSITY_GRADIENT?e+="#define color_type_intensity_gradient\n":this._pointColorType===Potree.PointColorType.TREE_DEPTH?e+="#define color_type_tree_depth\n":this._pointColorType===Potree.PointColorType.POINT_INDEX?e+="#define color_type_point_index\n":this._pointColorType===Potree.PointColorType.CLASSIFICATION?e+="#define color_type_classification\n":this._pointColorType===Potree.PointColorType.RETURN_NUMBER?e+="#define color_type_return_number\n":this._pointColorType===Potree.PointColorType.SOURCE?e+="#define color_type_source\n":this._pointColorType===Potree.PointColorType.NORMAL?e+="#define color_type_normal\n":this._pointColorType===Potree.PointColorType.PHONG&&(e+="#define color_type_phong\n"),this.clipMode===Potree.ClipMode.DISABLED?e+="#define clip_disabled\n":this.clipMode===Potree.ClipMode.CLIP_OUTSIDE?e+="#define clip_outside\n":this.clipMode===Potree.ClipMode.HIGHLIGHT_INSIDE&&(e+="#define clip_highlight_inside\n"),this._treeType===Potree.TreeType.OCTREE?e+="#define tree_type_octree\n":this._treeType===Potree.TreeType.KDTREE&&(e+="#define tree_type_kdtree\n"),this.weighted&&(e+="#define weighted_splats\n"),this.numClipBoxes>0&&(e+="#define use_clip_box\n"),e},Potree.PointCloudMaterial.prototype.setClipBoxes=function(e){if(e){this.clipBoxes=e;var t=this.numClipBoxes!=e.length&&(0===e.length||0===this.numClipBoxes);this.numClipBoxes=e.length,this.uniforms.clipBoxCount.value=this.numClipBoxes,t&&this.updateShaderSource(),this.uniforms.clipBoxes.value=new Float32Array(16*this.numClipBoxes);for(var i=0;i<this.numClipBoxes;i++){var o=e[i];this.uniforms.clipBoxes.value.set(o.elements,16*i)}}},Object.defineProperty(Potree.PointCloudMaterial.prototype,"gradient",{get:function(){return this._gradient},set:function(e){this._gradient!==e&&(this._gradient=e,this.gradientTexture=Potree.PointCloudMaterial.generateGradientTexture(this._gradient),this.uniforms.gradient.value=this.gradientTexture)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"classification",{get:function(){return this._classification},set:function(e){this._classification!==e&&(this._classification=e,this.classificationTexture=Potree.PointCloudMaterial.generateClassificationTexture(this._classification),this.uniforms.classificationLUT.value=this.classificationTexture)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"spacing",{get:function(){return this.uniforms.spacing.value},set:function(e){this.uniforms.spacing.value!==e&&(this.uniforms.spacing.value=e)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"useClipBox",{get:function(){return this._useClipBox},set:function(e){this._useClipBox!==e&&(this._useClipBox=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"weighted",{get:function(){return this._weighted},set:function(e){this._weighted!==e&&(this._weighted=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"fov",{get:function(){return this.uniforms.fov.value},set:function(e){this.uniforms.fov.value!==e&&(this.uniforms.fov.value=e)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"screenWidth",{get:function(){return this.uniforms.screenWidth.value},set:function(e){this.uniforms.screenWidth.value!==e&&(this.uniforms.screenWidth.value=e)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"screenHeight",{get:function(){return this.uniforms.screenHeight.value},set:function(e){this.uniforms.screenHeight.value!==e&&(this.uniforms.screenHeight.value=e)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"near",{get:function(){return this.uniforms.near.value},set:function(e){this.uniforms.near.value!==e&&(this.uniforms.near.value=e)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"far",{get:function(){return this.uniforms.far.value},set:function(e){this.uniforms.far.value!==e&&(this.uniforms.far.value=e)}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"opacity",{get:function(){return this.uniforms.opacity.value},set:function(e){this.uniforms.opacity&&this.uniforms.opacity.value!==e&&(this.uniforms.opacity.value=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"pointColorType",{get:function(){return this._pointColorType},set:function(e){this._pointColorType!==e&&(this._pointColorType=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"depthMap",{get:function(){return this._depthMap},set:function(e){this._depthMap!==e&&(this._depthMap=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"pointSizeType",{get:function(){return this._pointSizeType},set:function(e){this._pointSizeType!==e&&(this._pointSizeType=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"clipMode",{get:function(){return this._clipMode},set:function(e){this._clipMode!==e&&(this._clipMode=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"interpolate",{get:function(){return this._interpolate},set:function(e){this._interpolate!==e&&(this._interpolate=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"useEDL",{get:function(){return this._useEDL},set:function(e){this._useEDL!==e&&(this._useEDL=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"useLogarithmicDepthBuffer",{get:function(){return this._useLogarithmicDepthBuffer},set:function(e){this._useLogarithmicDepthBuffer!==e&&(this._useLogarithmicDepthBuffer=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"color",{get:function(){return this.uniforms.uColor.value},set:function(e){this.uniforms.uColor.value!==e&&(this.uniforms.uColor.value.copy(e),this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"pointShape",{get:function(){return this._pointShape},set:function(e){this._pointShape!==e&&(this._pointShape=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"size",{get:function(){return this.uniforms.size.value},set:function(e){this.uniforms.size.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"minSize",{get:function(){return this.uniforms.minSize.value},set:function(e){this.uniforms.minSize.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"maxSize",{get:function(){return this.uniforms.maxSize.value},set:function(e){this.uniforms.maxSize.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"heightMin",{get:function(){return this.uniforms.heightMin.value},set:function(e){this.uniforms.heightMin.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"heightMax",{get:function(){return this.uniforms.heightMax.value},set:function(e){this.uniforms.heightMax.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"intensityMin",{get:function(){return this.uniforms.intensityMin.value},set:function(e){this.uniforms.intensityMin.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"intensityMax",{get:function(){return this.uniforms.intensityMax.value},set:function(e){this.uniforms.intensityMax.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"pcIndex",{
get:function(){return this.uniforms.pcIndex.value},set:function(e){this.uniforms.pcIndex.value=e}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"treeType",{get:function(){return this._treeType},set:function(e){this._treeType!=e&&(this._treeType=e,this.updateShaderSource())}}),Object.defineProperty(Potree.PointCloudMaterial.prototype,"bbSize",{get:function(){return this.uniforms.bbSize.value},set:function(e){this.uniforms.bbSize.value=e}}),Potree.PointCloudMaterial.generateGradientTexture=function(e){var t=64;canvas=document.createElement("canvas"),canvas.width=t,canvas.height=t;var i=canvas.getContext("2d");i.rect(0,0,t,t);for(var o=i.createLinearGradient(0,0,t,t),n=0;n<e.length;n++){var r=e[n];o.addColorStop(r[0],"#"+r[1].getHexString())}i.fillStyle=o,i.fill();var a=new THREE.Texture(canvas);return a.needsUpdate=!0,textureImage=a.image,a},Potree.PointCloudMaterial.generateClassificationTexture=function(e){var t=256,i=256,o=THREE.ImageUtils.generateDataTexture(t,i,new THREE.Color);o.magFilter=THREE.NearestFilter;for(var n=o.image.data,r=0;t>r;r++)for(var a=0;i>a;a++){var s,l=r+t*a;s=e[r]?e[r]:e.DEFAULT,n[3*l+0]=255*s.r,n[3*l+1]=255*s.g,n[3*l+2]=255*s.b}return o},Potree.EyeDomeLightingMaterial=function(e){THREE.Material.call(this),e=e||{};for(var t=8,i=new Float32Array(2*t),o=0;t>o;o++)i[2*o+0]=Math.cos(2*o*Math.PI/t),i[2*o+1]=Math.sin(2*o*Math.PI/t);var n=new THREE.Vector3(0,0,1).normalize(),r={screenWidth:{type:"f",value:0},screenHeight:{type:"f",value:0},near:{type:"f",value:0},far:{type:"f",value:0},expScale:{type:"f",value:100},radius:{type:"f",value:3},lightDir:{type:"v3",value:n},neighbours:{type:"2fv",value:i},depthMap:{type:"t",value:null},colorMap:{type:"t",value:null}};this.setValues({uniforms:r,vertexShader:Potree.Shaders["edl.vs"],fragmentShader:Potree.Shaders["edl.fs"]})},Potree.EyeDomeLightingMaterial.prototype=new THREE.ShaderMaterial,Potree.BlurMaterial=function(e){THREE.Material.call(this),e=e||{};var t={near:{type:"f",value:0},far:{type:"f",value:0},screenWidth:{type:"f",value:0},screenHeight:{type:"f",value:0},map:{type:"t",value:null}};this.setValues({uniforms:t,vertexShader:Potree.Shaders["blur.vs"],fragmentShader:Potree.Shaders["blur.fs"]})},Potree.BlurMaterial.prototype=new THREE.ShaderMaterial,THREE.FirstPersonControls=function(e,t){function i(e){l.enabled!==!1&&(e.preventDefault(),0===e.button?(P=T.ROTATE,d.set(e.clientX,e.clientY)):2===e.button&&(P=T.PAN,h.set(e.clientX,e.clientY)),l.domElement.addEventListener("mousemove",o,!1),l.domElement.addEventListener("mouseup",n,!1),l.dispatchEvent(C))}function o(e){if(l.enabled!==!1){e.preventDefault();var t=l.domElement===document?l.domElement.body:l.domElement;P===T.ROTATE?(c.set(e.clientX,e.clientY),u.subVectors(c,d),l.rotateLeft(2*Math.PI*u.x/t.clientWidth*l.rotateSpeed),l.rotateUp(2*Math.PI*u.y/t.clientHeight*l.rotateSpeed),d.copy(c)):P===T.PAN&&(p.set(e.clientX,e.clientY),m.subVectors(p,h),m.multiplyScalar(5e-4).multiplyScalar(l.moveSpeed),l.pan(m.x,m.y),h.copy(p))}}function n(){l.enabled!==!1&&(l.domElement.removeEventListener("mousemove",o,!1),l.domElement.removeEventListener("mouseup",n,!1),l.dispatchEvent(x),P=T.NONE)}function r(e){if(l.enabled!==!1&&l.noZoom!==!0){e.preventDefault();var t=e.detail<0||e.wheelDelta>0?1:-1;l.moveSpeed+=.1*l.moveSpeed*t,l.moveSpeed=Math.max(.1,l.moveSpeed),l.dispatchEvent(C),l.dispatchEvent(x)}}function a(e){if(l.enabled!==!1)switch(e.keyCode){case l.keys.UP:l.moveForward=!0;break;case l.keys.BOTTOM:l.moveBackward=!0;break;case l.keys.LEFT:l.moveLeft=!0;break;case l.keys.RIGHT:l.moveRight=!0;break;case l.keys.W:l.moveForward=!0;break;case l.keys.S:l.moveBackward=!0;break;case l.keys.A:l.moveLeft=!0;break;case l.keys.D:l.moveRight=!0}}function s(e){switch(e.keyCode){case l.keys.W:l.moveForward=!1;break;case l.keys.S:l.moveBackward=!1;break;case l.keys.A:l.moveLeft=!1;break;case l.keys.D:l.moveRight=!1;break;case l.keys.UP:l.moveForward=!1;break;case l.keys.BOTTOM:l.moveBackward=!1;break;case l.keys.LEFT:l.moveLeft=!1;break;case l.keys.RIGHT:l.moveRight=!1}}this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.rotateSpeed=1,this.moveSpeed=10,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40,A:"A".charCodeAt(0),S:"S".charCodeAt(0),D:"D".charCodeAt(0),W:"W".charCodeAt(0)};var l=this,d=new THREE.Vector2,c=new THREE.Vector2,u=new THREE.Vector2,h=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,f=new THREE.Vector3,v=(new THREE.Vector3,0),g=0,E=1,y=new THREE.Vector3,b=new THREE.Vector3,T={NONE:-1,ROTATE:0,SPEEDCHANGE:1,PAN:2},P=T.NONE;this.position0=this.object.position.clone();var R={type:"change"},C={type:"start"},x={type:"end"};this.rotateLeft=function(e){g-=e},this.rotateUp=function(e){v-=e},this.panLeft=function(e){var t=this.object.matrix.elements;f.set(t[0],t[1],t[2]),f.multiplyScalar(-e),y.add(f)},this.panUp=function(e){var t=this.object.matrix.elements;f.set(t[4],t[5],t[6]),f.multiplyScalar(e),y.add(f)},this.panForward=function(e){var t=this.object.matrix.elements;f.set(t[8],t[9],t[10]),f.multiplyScalar(e),y.add(f)},this.pan=function(e,t){var i=l.domElement===document?l.domElement.body:l.domElement;if(void 0!==l.object.fov){var o=l.object.position,n=o.clone(),r=n.length();r*=Math.tan(l.object.fov/2*Math.PI/180),l.panLeft(2*e*r/i.clientHeight),l.panUp(2*t*r/i.clientHeight)}else void 0!==l.object.top?(l.panLeft(e*(l.object.right-l.object.left)/i.clientWidth),l.panUp(t*(l.object.top-l.object.bottom)/i.clientHeight)):console.warn("WARNING: FirstPersonControls.js encountered an unknown camera type - pan disabled.")},this.update=function(e){this.object.rotation.order="ZYX";var t=this.object;this.object=new THREE.Object3D,this.object.position.copy(t.position),this.object.rotation.copy(t.rotation),this.object.updateMatrix(),this.object.updateMatrixWorld();var i=this.object.position;if(void 0!==e&&(this.moveRight&&this.panLeft(-e*this.moveSpeed),this.moveLeft&&this.panLeft(e*this.moveSpeed),this.moveForward&&this.panForward(-e*this.moveSpeed),this.moveBackward&&this.panForward(e*this.moveSpeed)),!y.equals(new THREE.Vector3(0,0,0))){var o={type:"move",translation:y.clone()};this.dispatchEvent(o)}if(i.add(y),0!==g||0!==v){var o={type:"rotate",thetaDelta:g,phiDelta:v};this.dispatchEvent(o)}this.object.updateMatrix();var n=(new THREE.Matrix4).makeRotationY(g),r=(new THREE.Matrix4).multiplyMatrices(n,this.object.matrix);this.object.quaternion.setFromRotationMatrix(r),this.object.rotation.x+=v,this.object.updateMatrixWorld();var a={type:"proposeTransform",oldPosition:t.position,newPosition:this.object.position,objections:0,counterProposals:[]};if(this.dispatchEvent(a),a.objections>0&&a.counterProposals.length>0){var s=a.counterProposals;this.object.position.copy(s[0]),a.objections=0,a.counterProposals=[]}a.objections>0||t.position.copy(this.object.position),t.rotation.copy(this.object.rotation),this.object=t,g=0,v=0,E=1,y.set(0,0,0),b.distanceTo(this.object.position)>0&&(this.dispatchEvent(R),b.copy(this.object.position))},this.reset=function(){P=T.NONE,this.object.position.copy(this.position0)},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault()},!1),this.domElement.addEventListener("mousedown",i,!1),this.domElement.addEventListener("mousewheel",r,!1),this.domElement.addEventListener("DOMMouseScroll",r,!1),window.addEventListener("keydown",a,!1),window.addEventListener("keyup",s,!1)},THREE.FirstPersonControls.prototype=Object.create(THREE.EventDispatcher.prototype),Potree.OrbitControls=function(e,t){function i(){return 2*Math.PI/60/60*h.autoRotateSpeed}function o(){return Math.pow(.95,h.zoomSpeed)}function n(e){if(h.enabled!==!1){if(e.preventDefault(),0===e.button){if(h.noRotate===!0)return;A=V.ROTATE,m.set(e.clientX,e.clientY)}else if(1===e.button){if(h.noZoom===!0)return;A=V.DOLLY,P.set(e.clientX,e.clientY)}else if(2===e.button){if(h.noPan===!0)return;A=V.PAN,g.set(e.clientX,e.clientY)}h.domElement.addEventListener("mousemove",r,!1),h.domElement.addEventListener("mouseup",a,!1),h.dispatchEvent(I)}}function r(e){if(h.enabled!==!1){e.preventDefault();var t=h.domElement===document?h.domElement.body:h.domElement;if(A===V.ROTATE){if(h.noRotate===!0)return;f.set(e.clientX,e.clientY),v.subVectors(f,m),h.rotateLeft(2*Math.PI*v.x/t.clientWidth*h.rotateSpeed),h.rotateUp(2*Math.PI*v.y/t.clientHeight*h.rotateSpeed),m.copy(f)}else if(A===V.DOLLY){if(h.noZoom===!0)return;R.set(e.clientX,e.clientY),C.subVectors(R,P),C.y>0?h.dollyIn():h.dollyOut(),P.copy(R)}else if(A===V.PAN){if(h.noPan===!0)return;E.set(e.clientX,e.clientY),y.subVectors(E,g),h.pan(y.x,y.y),g.copy(E)}}}function a(){h.enabled!==!1&&(h.domElement.removeEventListener("mousemove",r,!1),h.domElement.removeEventListener("mouseup",a,!1),h.dispatchEvent(L),A=V.NONE)}function s(e){if(h.enabled!==!1&&h.noZoom!==!0){e.preventDefault();var t=0;void 0!==e.wheelDelta?t=e.wheelDelta:void 0!==e.detail&&(t=-e.detail),t>0?h.dollyOut():h.dollyIn(),h.dispatchEvent(I),h.dispatchEvent(L)}}function l(e){if(h.enabled!==!1&&h.noKeys!==!0&&h.noPan!==!0)switch(e.keyCode){case h.keys.UP:h.pan(0,h.keyPanSpeed);break;case h.keys.BOTTOM:h.pan(0,-h.keyPanSpeed);break;case h.keys.LEFT:h.pan(h.keyPanSpeed,0);break;case h.keys.RIGHT:h.pan(-h.keyPanSpeed,0)}}function d(e){if(h.enabled!==!1){switch(e.touches.length){case 1:if(h.noRotate===!0)return;A=V.TOUCH_ROTATE,m.set(e.touches[0].pageX,e.touches[0].pageY);break;case 2:if(h.noZoom===!0)return;A=V.TOUCH_DOLLY;var t=e.touches[0].pageX-e.touches[1].pageX,i=e.touches[0].pageY-e.touches[1].pageY,o=Math.sqrt(t*t+i*i);P.set(0,o);break;case 3:if(h.noPan===!0)return;A=V.TOUCH_PAN,g.set(e.touches[0].pageX,e.touches[0].pageY);break;default:A=V.NONE}h.dispatchEvent(I)}}function c(e){if(h.enabled!==!1){e.preventDefault(),e.stopPropagation();var t=h.domElement===document?h.domElement.body:h.domElement;switch(e.touches.length){case 1:if(h.noRotate===!0)return;if(A!==V.TOUCH_ROTATE)return;f.set(e.touches[0].pageX,e.touches[0].pageY),v.subVectors(f,m),h.rotateLeft(2*Math.PI*v.x/t.clientWidth*h.rotateSpeed),h.rotateUp(2*Math.PI*v.y/t.clientHeight*h.rotateSpeed),m.copy(f);break;case 2:if(h.noZoom===!0)return;if(A!==V.TOUCH_DOLLY)return;var i=e.touches[0].pageX-e.touches[1].pageX,o=e.touches[0].pageY-e.touches[1].pageY,n=Math.sqrt(i*i+o*o);R.set(0,n),C.subVectors(R,P);var r=t.clientWidth,a=t.clientHeight,s=Math.sqrt(r*r+a*a),l=C.y/s;C.y>0?h.dollyOut(1-l):h.dollyIn(1+l),P.copy(R);break;case 3:if(h.noPan===!0)return;if(A!==V.TOUCH_PAN)return;E.set(e.touches[0].pageX,e.touches[0].pageY),y.subVectors(E,g),h.pan(y.x,y.y),g.copy(E);break;default:A=V.NONE}}}function u(){h.enabled!==!1&&(h.dispatchEvent(L),A=V.NONE)}this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.target=new THREE.Vector3,this.center=this.target,this.noZoom=!1,this.zoomSpeed=1,this.minDistance=0,this.maxDistance=1/0,this.noRotate=!1,this.rotateSpeed=1,this.noPan=!1,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.fadeFactor=10,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.noKeys=!1,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40};var h=this,p=1e-6,m=new THREE.Vector2,f=new THREE.Vector2,v=new THREE.Vector2,g=new THREE.Vector2,E=new THREE.Vector2,y=new THREE.Vector2,b=new THREE.Vector3,T=new THREE.Vector3,P=new THREE.Vector2,R=new THREE.Vector2,C=new THREE.Vector2,x=0,w=0,H=1,S=new THREE.Vector3,B=new THREE.Vector3,V={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},A=V.NONE;this.target0=this.target.clone(),this.position0=this.object.position.clone();var M={type:"change"},I={type:"start"},L={type:"end"};this.rotateLeft=function(e){void 0===e&&(e=i()),w-=e},this.rotateUp=function(e){void 0===e&&(e=i()),x-=e},this.panLeft=function(e){var t=this.object.matrix.elements;b.set(t[0],t[1],t[2]),b.multiplyScalar(-e),S.add(b)},this.panUp=function(e){var t=this.object.matrix.elements;b.set(t[4],t[5],t[6]),b.multiplyScalar(e),S.add(b)},this.pan=function(e,t){var i=h.domElement===document?h.domElement.body:h.domElement;if(void 0!==h.object.fov){var o=h.object.position,n=o.clone().sub(h.target),r=n.length();r*=Math.tan(h.object.fov/2*Math.PI/180),h.panLeft(2*e*r/i.clientHeight),h.panUp(2*t*r/i.clientHeight)}else void 0!==h.object.top?(h.panLeft(e*(h.object.right-h.object.left)/i.clientWidth),h.panUp(t*(h.object.top-h.object.bottom)/i.clientHeight)):console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.")},this.dollyIn=function(e){void 0===e&&(e=o()),H/=e},this.dollyOut=function(e){void 0===e&&(e=o()),H*=e},this.update=function(e){var t=this.object.position.clone();T.copy(t).sub(this.target);var o=Math.atan2(T.x,T.z),n=Math.atan2(Math.sqrt(T.x*T.x+T.z*T.z),T.y);this.autoRotate&&this.rotateLeft(i());var r=Math.min(1,this.fadeFactor*e);o+=r*w,n+=r*x,n=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,n)),n=Math.max(p,Math.min(Math.PI-p,n));var a=T.length();a+=(H-1)*a*r,a=Math.max(this.minDistance,Math.min(this.maxDistance,a)),this.target.add(S.clone().multiplyScalar(r)),T.x=a*Math.sin(n)*Math.sin(o),T.y=a*Math.cos(n),T.z=a*Math.sin(n)*Math.cos(o),t.copy(this.target).add(T);var s={type:"proposeTransform",oldPosition:this.object.position,newPosition:t,objections:0,counterProposals:[]};if(this.dispatchEvent(s),s.objections>0&&s.counterProposals.length>0){var l=s.counterProposals;t.copy(l[0]),s.objections=0,s.counterProposals=[]}if(s.objections>0)w=0,x=0,H=1,S.set(0,0,0);else{this.object.position.copy(t),this.object.lookAt(this.target);var d=Math.max(0,1-this.fadeFactor*e);w*=d,x*=d,H=1+(H-1)*d,S.multiplyScalar(d)}B.distanceTo(this.object.position)>0&&(this.dispatchEvent(M),B.copy(this.object.position))},this.reset=function(){A=V.NONE,this.target.copy(this.target0),this.object.position.copy(this.position0),this.update()},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault()},!1),this.domElement.addEventListener("mousedown",n,!1),this.domElement.addEventListener("mousewheel",s,!1),this.domElement.addEventListener("DOMMouseScroll",s,!1),this.domElement.addEventListener("touchstart",d,!1),this.domElement.addEventListener("touchend",u,!1),this.domElement.addEventListener("touchmove",c,!1),window.addEventListener("keydown",l,!1)},Potree.OrbitControls.prototype=Object.create(THREE.EventDispatcher.prototype),THREE.EarthControls=function(e,t,i){function o(e){if(s.enabled!==!1){e.preventDefault();var t=s.domElement.getBoundingClientRect(),i={x:(e.clientX-t.left)/s.domElement.clientWidth*2-1,y:2*-((e.clientY-t.top)/s.domElement.clientHeight)+1},o=getMousePointCloudIntersection(i,s.camera,s.renderer,s.pointclouds);if(o){var a=(new THREE.Plane).setFromNormalAndCoplanarPoint(new THREE.Vector3(0,1,0),o),h=new THREE.Vector3(i.x,i.y,.5);h.unproject(s.camera);var p=h.sub(s.camera.position).normalize(),m=new THREE.Ray(s.camera.position,p);v=m.intersectPlane(a),f=s.camera.clone(),f.rotation.copy(s.camera.rotation),c.set(e.clientX-t.left,e.clientY-t.top),u.set(e.clientX-t.left,e.clientY-t.top),s.scene.add(s.pivotNode),s.pivotNode.position.copy(v),0===e.button?d=l.DRAG:2===e.button&&(d=l.ROTATE),s.domElement.addEventListener("mousemove",n,!1),s.domElement.addEventListener("mouseup",r,!1)}}}function n(e){if(s.enabled!==!1){e.preventDefault();var t=s.domElement.getBoundingClientRect();s.domElement===document?s.domElement.body:s.domElement;m.set(e.clientX-t.left-u.x,e.clientY-t.top-u.y),u.set(e.clientX-t.left,e.clientY-t.top)}}function r(){s.enabled!==!1&&(s.domElement.removeEventListener("mousemove",n,!1),s.domElement.removeEventListener("mouseup",r,!1),d=l.NONE,s.scene.remove(s.pivotNode))}function a(e){if(s.enabled!==!1&&s.noZoom!==!0){e.preventDefault();var t=s.domElement.getBoundingClientRect(),i=e.detail<0||e.wheelDelta>0?1:-1,o={x:(e.clientX-t.left)/s.domElement.clientWidth*2-1,y:2*-((e.clientY-t.top)/s.domElement.clientHeight)+1},n=getMousePointCloudIntersection(o,s.camera,s.renderer,s.pointclouds);if(n){var r=n.distanceTo(s.camera.position),a=(new THREE.Vector3).subVectors(n,s.camera.position).normalize();s.camera.position.add(a.multiplyScalar(.1*r*i))}}}this.camera=e,this.renderer=t,this.pointclouds=[],this.domElement=t.domElement,this.scene=i,this.enabled=!0;var s=this,l={NONE:-1,DRAG:0,ROTATE:1},d=l.NONE,c=new THREE.Vector2,u=new THREE.Vector2,h=new THREE.SphereGeometry(1,32,32),p=new THREE.MeshNormalMaterial({shading:THREE.SmoothShading,transparent:!0,opacity:.5});this.pivotNode=new THREE.Mesh(h,p);var m=new THREE.Vector2,f=null,v=null;this.minAngle=10/180*Math.PI,this.maxAngle=70/180*Math.PI,this.update=function(e){this.camera.position;this.camera.updateMatrixWorld();var t=new THREE.Object3D;if(t.position.copy(this.camera.position),t.rotation.copy(this.camera.rotation),t.updateMatrix(),t.updateMatrixWorld(),v){if(d===l.DRAG){var i=(new THREE.Plane).setFromNormalAndCoplanarPoint(new THREE.Vector3(0,1,0),v),o={x:u.x/this.domElement.clientWidth*2-1,y:2*-(u.y/this.domElement.clientHeight)+1},n=new THREE.Vector3(o.x,o.y,.5);n.unproject(f);var r=n.sub(f.position).normalize(),a=new THREE.Ray(f.position,r),s=a.distanceToPlane(i);if(s>0){var c=(new THREE.Vector3).subVectors(v,r.clone().multiplyScalar(s));t.position.copy(c)}}else if(d===l.ROTATE){var h=m.clone().multiplyScalar(e);h.x*=.3,h.y*=.2;var p=new THREE.Object3D,g=new THREE.Object3D;p.add(g),p.position.copy(v),g.position.copy(this.camera.position).sub(v),g.rotation.copy(this.camera.rotation),p.rotation.y+=-h.x;var r=this.camera.getWorldDirection(),E=new THREE.Vector3(0,1,0),y=(new THREE.Vector3).crossVectors(E,r),b=g.position.clone();b.y=0,b.normalize();var T=b.dot(g.position.clone().normalize()),P=Math.acos(T);g.position.y<0&&(P=-P);var R=0;R=h.y>0?h.y-Math.max(0,this.minAngle-(P-h.y)):h.y+Math.max(0,P-h.y-this.maxAngle),p.rotateOnAxis(y,-R),p.updateMatrixWorld(),t.position.copy(g.getWorldPosition()),t.quaternion.copy(g.getWorldQuaternion())}var C={type:"proposeTransform",oldPosition:this.camera.position,newPosition:t.position,objections:0};this.dispatchEvent(C),C.objections>0||(this.camera.position.copy(t.position),this.camera.rotation.copy(t.rotation));var x=this.pivotNode.getWorldPosition().applyMatrix4(this.camera.matrixWorldInverse),w=Math.abs(x.z/30),H=this.pivotNode.scale.length();this.pivotNode.scale.multiplyScalar(w/H)}m.set(0,0)},this.reset=function(){d=l.NONE,this.camera.position.copy(this.position0)},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault()},!1),this.domElement.addEventListener("mousedown",o,!1),this.domElement.addEventListener("mousewheel",a,!1),this.domElement.addEventListener("DOMMouseScroll",a,!1)},THREE.EarthControls.prototype=Object.create(THREE.EventDispatcher.prototype),LRU.prototype.size=function(){return this.elements},LRU.prototype.contains=function(e){return null==this.items[e.id]},LRU.prototype.touch=function(e){if(e.loaded){var t;null==this.items[e.id]?(t=new LRUItem(e),t.previous=this.last,this.last=t,null!==t.previous&&(t.previous.next=t),this.items[e.id]=t,this.elements++,null===this.first&&(this.first=t),this.numPoints+=e.numPoints):(t=this.items[e.id],null===t.previous?null!==t.next&&(this.first=t.next,this.first.previous=null,t.previous=this.last,t.next=null,this.last=t,t.previous.next=t):null===t.next||(t.previous.next=t.next,t.next.previous=t.previous,t.previous=this.last,t.next=null,this.last=t,t.previous.next=t))}},LRU.prototype.remove=function(e){var t=this.items[e.id];t&&(1===this.elements?(this.first=null,this.last=null):(t.previous||(this.first=t.next,this.first.previous=null),t.next||(this.last=t.previous,this.last.next=null),t.previous&&t.next&&(t.previous.next=t.next,t.next.previous=t.previous)),delete this.items[e.id],this.elements--,this.numPoints-=e.numPoints)},LRU.prototype.getLRUItem=function(){if(null===this.first)return null;var e=this.first;return e.node},LRU.prototype.toString=function(){for(var e="{ ",t=this.first;null!==t;)e+=t.node.id,null!==t.next&&(e+=", "),t=t.next;return e+="}",e+="("+this.size()+")"},LRU.prototype.freeMemory=function(){if(!(this.elements<=1))for(;this.numPoints>Potree.pointLoadLimit;){var e=this.first,t=e.node;this.disposeDescendants(t)}},LRU.prototype.disposeDescendants=function(e){var t=[];for(t.push(e);t.length>0;){var i=t.pop();i.dispose(),this.remove(i);for(var o in i.children)if(i.children.hasOwnProperty(o)){var n=i.children[o];n.loaded&&t.push(i.children[o])}}},Potree.PointCloudOctreeNode=function(){this.children={},this.sceneNode=null},Potree.PointCloudOctree=function(e,t){THREE.Object3D.call(this),Potree.PointCloudOctree.lru=Potree.PointCloudOctree.lru||new LRU,this.pcoGeometry=e,this.boundingBox=this.pcoGeometry.tightBoundingBox,this.boundingSphere=this.boundingBox.getBoundingSphere(),this.material=t||new Potree.PointCloudMaterial,this.visiblePointsTarget=2e6,this.minimumNodePixelSize=150,this.level=0,this.position.sub(e.offset),this.updateMatrix(),this.showBoundingBox=!1,this.boundingBoxNodes=[],this.loadQueue=[],this.visibleBounds=new THREE.Box3,this.visibleNodes=[],this.visibleGeometry=[],this.pickTarget,this.generateDEM=!1,this.root=this.pcoGeometry.root},Potree.PointCloudOctree.prototype=Object.create(THREE.Object3D.prototype),Potree.PointCloudOctree.prototype.updateVisibility=function(e,t){this.numVisibleNodes=0,this.numVisiblePoints=0,e.updateMatrixWorld();var i=new THREE.Frustum,o=e.matrixWorldInverse,n=this.matrixWorld,r=e.projectionMatrix,a=(new THREE.Matrix4).multiply(r).multiply(o).multiply(n);i.setFromMatrix(a);var s=e.matrixWorld,l=(new THREE.Matrix4).getInverse(n),d=(new THREE.Matrix4).multiply(l).multiply(s),c=(new THREE.Vector3).setFromMatrixPosition(d),u=new BinaryHeap(function(e){return 1/e.weight});u.push({node:this.root,weight:1});var h=[],p=[],m=[];this.root instanceof Potree.PointCloudOctreeNode&&this.hideDescendants(this.root.sceneNode);for(var f=0;f<this.boundingBoxNodes.length;f++)this.boundingBoxNodes[f].visible=!1;for(;u.size()>0;){var v=u.pop(),g=v.node,E=v.parent,y=g.boundingBox,b=i.intersectsBox(y),T=b;if(T=T&&!(this.numVisiblePoints+g.numPoints>this.visiblePointsTarget)){if(this.numVisibleNodes++,this.numVisiblePoints+=g.numPoints,g instanceof Potree.PointCloudOctreeGeometryNode){var P=g,R=P.geometry;if(("undefined"==typeof E||E instanceof Potree.PointCloudOctreeNode)&&P.loaded){var C=new Potree.PointCloudOctreeNode,x=new THREE.PointCloud(R,this.material);if(x.visible=!1,C.name=P.name,C.level=P.level,C.numPoints=P.numPoints,C.boundingBox=R.boundingBox,C.tightBoundingBox=R.tightBoundingBox,C.boundingSphere=C.boundingBox.getBoundingSphere(),C.geometryNode=P,C.parent=E,C.children=P.children,x.boundingBox=C.boundingBox,x.boundingSphere=C.boundingSphere,x.numPoints=C.numPoints,x.level=C.level,C.sceneNode=x,"undefined"==typeof g.parent)this.root=C,this.add(C.sceneNode),x.matrixWorld.multiplyMatrices(this.matrixWorld,x.matrix);else{var w=parseInt(C.name[C.name.length-1]);E.sceneNode.add(x),E.children[w]=C,x.matrixWorld.multiplyMatrices(E.sceneNode.matrixWorld,x.matrix)}g=C}P.loaded||(m.push(g),p.push(g))}if(g instanceof Potree.PointCloudOctreeNode){if(Potree.PointCloudOctree.lru.touch(g.geometryNode),g.sceneNode.visible=!0,g.sceneNode.material=this.material,h.push(g),p.push(g.geometryNode),g.parent?g.sceneNode.matrixWorld.multiplyMatrices(g.parent.sceneNode.matrixWorld,g.sceneNode.matrix):g.sceneNode.matrixWorld.multiplyMatrices(this.matrixWorld,g.sceneNode.matrix),this.showBoundingBox&&!g.boundingBoxNode){var H=new THREE.BoxHelper(g.sceneNode);this.add(H),this.boundingBoxNodes.push(H),g.boundingBoxNode=H,g.boundingBoxNode.matrixWorld.copy(g.sceneNode.matrixWorld)}else this.showBoundingBox?(g.boundingBoxNode.visible=!0,g.boundingBoxNode.matrixWorld.copy(g.sceneNode.matrixWorld)):!this.showBoundingBox&&g.boundingBoxNode&&(g.boundingBoxNode.visible=!1);this.generateDEM&&g.level<=2&&(g.dem||(g.dem=this.createDEM(g)))}for(var f=0;8>f;f++)if(g.children[f]){var S=g.children[f],B=S.boundingSphere,V=B.center.distanceTo(c),A=B.radius,M=e.fov/2*Math.PI/180,I=1/Math.tan(M)*A/Math.sqrt(V*V-A*A),L=t.domElement.clientHeight*I;if(!(L<this.minimumNodePixelSize)){var W=I;0>V-A&&(W=Number.MAX_VALUE),u.push({node:S,parent:g,weight:W})}}}}this.visibleNodes=h,this.visibleGeometry=p;for(var f=0;f<Math.min(5,m.length);f++)m[f].load()},Potree.PointCloudOctree.prototype.updateVisibleBounds=function(){for(var e=[],t=0;t<this.visibleNodes.length;t++){for(var i=this.visibleNodes[t],o=!0,n=0;n<i.children.length;n++){var r=i.children[n];r instanceof Potree.PointCloudOctreeNode?o=o&&!r.sceneNode.visible:r instanceof Potree.PointCloudOctreeGeometryNode&&(o=!0)}o&&e.push(i)}this.visibleBounds.min=new THREE.Vector3(1/0,1/0,1/0),this.visibleBounds.max=new THREE.Vector3(-(1/0),-(1/0),-(1/0));for(var t=0;t<e.length;t++){var i=e[t];this.visibleBounds.expandByPoint(i.boundingBox.min),this.visibleBounds.expandByPoint(i.boundingBox.max)}},Potree.PointCloudOctree.prototype.updateMaterial=function(e,t,i,o){e.fov=i.fov*(Math.PI/180),e.screenWidth=o.domElement.clientWidth,e.screenHeight=o.domElement.clientHeight,e.spacing=this.pcoGeometry.spacing,e.near=i.near,e.far=i.far,e.uniforms.octreeSize.value=this.pcoGeometry.boundingBox.size().x,e.pointSizeType&&(e.pointSizeType===Potree.PointSizeType.ADAPTIVE||e.pointColorType===Potree.PointColorType.OCTREE_DEPTH)&&this.updateVisibilityTexture(e,t)},Potree.PointCloudOctree.prototype.update=function(e,t){this.updateVisibility(e,t),this.updateMaterial(this.material,this.visibleNodes,e,t),this.updateVisibleBounds(),Potree.PointCloudOctree.lru.freeMemory()},Potree.PointCloudOctree.prototype.updateVisibilityTexture=function(e,t){if(e){var i=e.visibleNodesTexture,o=i.image.data;t=t.slice();var n=function(e,t){var i=e.name,o=t.name;return i.length!=o.length?i.length-o.length:o>i?-1:i>o?1:0};t.sort(n);for(var r=0;r<t.length;r++){for(var a=t[r],s=[],l=0;8>l;l++){var d=a.children[l];d instanceof Potree.PointCloudOctreeNode&&d.sceneNode.visible&&s.push(d)}s.sort(function(e,t){return e.name<t.name?-1:e.name>t.name?1:0}),o[3*r+0]=0,o[3*r+1]=0,o[3*r+2]=0;for(var l=0;l<s.length;l++){var d=s[l],c=parseInt(d.name.substr(-1));if(o[3*r+0]+=Math.pow(2,c),0===l){var u=t.indexOf(d);o[3*r+1]=u-r}}}i.needsUpdate=!0}},Potree.PointCloudOctree.prototype.nodesOnRay=function(e,t){for(var i=[],o=t.clone(),n=0;n<e.length;n++){var r=e[n],a=r.boundingSphere.clone().applyMatrix4(r.sceneNode.matrixWorld);o.isIntersectionSphere(a)&&i.push(r)}return i},Potree.PointCloudOctree.prototype.updateMatrixWorld=function(e){this.matrixAutoUpdate===!0&&this.updateMatrix(),(this.matrixWorldNeedsUpdate===!0||e===!0)&&(void 0===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0)},Potree.PointCloudOctree.prototype.hideDescendants=function(e){for(var t=[],i=0;i<e.children.length;i++){var o=e.children[i];o.visible&&t.push(o)}for(;t.length>0;){var e=t.shift();e.visible=!1;for(var i=0;i<e.children.length;i++){var o=e.children[i];o.visible&&t.push(o)}}},Potree.PointCloudOctree.prototype.moveToOrigin=function(){this.position.set(0,0,0),this.updateMatrixWorld(!0);var e=this.boundingBox,t=this.matrixWorld,i=Potree.utils.computeTransformedBoundingBox(e,t);this.position.set(0,0,0).sub(i.center())},Potree.PointCloudOctree.prototype.moveToGroundPlane=function(){this.updateMatrixWorld(!0);var e=this.boundingBox,t=this.matrixWorld,i=Potree.utils.computeTransformedBoundingBox(e,t);this.position.y+=-i.min.y},Potree.PointCloudOctree.prototype.getBoundingBoxWorld=function(){this.updateMatrixWorld(!0);var e=this.boundingBox,t=this.matrixWorld,i=Potree.utils.computeTransformedBoundingBox(e,t);return i},Potree.PointCloudOctree.prototype.getPointsInProfile=function(e,t){for(var i={segments:[],boundingBox:new THREE.Box3,projectedBoundingBox:new THREE.Box2},o=0;o<e.points.length-1;o++){var n=e.points[o],r=e.points[o+1],a=this.getProfile(n,r,e.width,t),s={start:n,end:r,points:a,project:null};i.segments.push(s),i.boundingBox.expandByPoint(a.boundingBox.min),i.boundingBox.expandByPoint(a.boundingBox.max)}for(var l=new THREE.Vector3,o=0;o<i.segments.length;o++){var s=i.segments[o],n=s.start,r=s.end,d=function(e,t,i,o){var n=e,r=t,a=i,s=o,l=new THREE.Vector3(1,0,0),d=(new THREE.Vector3).subVectors(r,n);d.y=0,d.normalize();var c=Math.acos(l.dot(d));return d.z>0&&(c=-c),function(e){var t=(new THREE.Matrix4).makeTranslation(-n.x,-s.min.y,-n.z),i=(new THREE.Matrix4).makeRotationY(-c),o=(new THREE.Matrix4).makeTranslation(a.x,0,0),r=e.clone();return r.applyMatrix4(t),r.applyMatrix4(i),r.applyMatrix4(o),r}}(n,r,l.clone(),i.boundingBox.clone());s.project=d,l.x+=new THREE.Vector3(n.x,0,n.z).distanceTo(new THREE.Vector3(r.x,0,r.z)),l.y+=r.y-n.y}return i.projectedBoundingBox.min.x=0,i.projectedBoundingBox.min.y=i.boundingBox.min.y,i.projectedBoundingBox.max.x=l.x,i.projectedBoundingBox.max.y=i.boundingBox.max.y,i},Potree.PointCloudOctree.prototype.getProfile=function(e,t,i,o,n){if(void 0===n){var r=[];r.push(this);for(var a=(new THREE.Vector3).addVectors(t,e).multiplyScalar(.5),s=(new THREE.Vector3).subVectors(t,e).length(),l=(new THREE.Vector3).subVectors(t,e).normalize(),d=new THREE.Vector3(0,1,0),c=(new THREE.Vector3).crossVectors(l,d).normalize(),u=c,h=(new THREE.Plane).setFromNormalAndCoplanarPoint(u,e),p=(new THREE.Plane).setFromNormalAndCoplanarPoint(l,a),m=null,f=new THREE.Box3;r.length>0;){var v=r.shift(),g=0;if(v instanceof THREE.PointCloud){var E=v.geometry,y=E.attributes.position,b=y.array,T=v.numPoints;if(!m){m={};for(var P in E.attributes)E.attributes.hasOwnProperty(P)&&("indices"===P||(m[P]=[]))}for(var R=0;T>R;R++){var C=new THREE.Vector3(b[3*R],b[3*R+1],b[3*R+2]);C.applyMatrix4(this.matrixWorld);var x=Math.abs(h.distanceToPoint(C)),w=Math.abs(p.distanceToPoint(C));if(i/2>x&&s/2>w){f.expandByPoint(C);for(var P in E.attributes)if(E.attributes.hasOwnProperty(P))if("position"===P)m[P].push(C);else if("indices"===P);else{var H=E.attributes[P];if(1===H.itemSize)m[P].push(H.array[R+B]);else{for(var S=[],B=0;B<H.itemSize;B++)S.push(H.array[R*H.itemSize+B]);m[P].push(S)}}g++}}}if(v==this||v.level<o)for(var R=0;R<v.children.length;R++){var V=v.children[R];if(V instanceof THREE.PointCloud){var A=V.boundingSphere.clone().applyMatrix4(V.matrixWorld);h.distanceToSphere(A)<A.radius&&r.push(V)}}}m.numPoints=m.position.length;var M=function(e,t){var i=e,o=t,n=new THREE.Vector3(1,0,0),r=(new THREE.Vector3).subVectors(o,i);r.y=0,r.normalize();var a=Math.acos(n.dot(r));return r.z>0&&(a=-a),function(e){var t=(new THREE.Matrix4).makeTranslation(-i.x,-i.y,-i.z),o=(new THREE.Matrix4).makeRotationY(-a),n=e.clone();return n.applyMatrix4(t),n.applyMatrix4(o),n}}(e,t);return m.project=M,m.boundingBox=f,m}this.profileRequests.push(new Potree.ProfileRequest(e,t,i,o,n))},Potree.PointCloudOctree.prototype.getVisibleExtent=function(){return this.visibleBounds.applyMatrix4(this.matrixWorld)},Potree.PointCloudOctree.prototype.pick=function(e,t,i,o){var o=o||{},n=o.pickWindowSize||17,r=this.nodesOnRay(this.visibleNodes,i);if(0===r.length)return null;var a=Math.ceil(e.domElement.clientWidth),s=Math.ceil(e.domElement.clientHeight),l=(new THREE.Vector3).addVectors(t.position,i.direction).project(t);l.addScalar(1).multiplyScalar(.5),l.x*=a,l.y*=s,this.pickTarget?(this.pickTarget.width!=a||this.pickTarget.height!=s)&&(this.pickTarget.dispose(),this.pickTarget=new THREE.WebGLRenderTarget(1,1,{minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat})):this.pickTarget=new THREE.WebGLRenderTarget(1,1,{minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat}),this.pickTarget.setSize(a,s),this.pickMaterial||(this.pickMaterial=new Potree.PointCloudMaterial,this.pickMaterial.pointColorType=Potree.PointColorType.POINT_INDEX),this.pickMaterial.pointSizeType=this.material.pointSizeType,this.pickMaterial.size=this.material.size,this.pickMaterial.pointShape=this.material.pointShape,this.pickMaterial.interpolate=this.material.interpolate,this.pickMaterial.minSize=this.material.minSize,this.pickMaterial.maxSize=this.material.maxSize,this.updateMaterial(this.pickMaterial,r,t,e);var d=e.context;d.enable(d.SCISSOR_TEST),
d.scissor(l.x-(n-1)/2,l.y-(n-1)/2,n,n),d.disable(d.SCISSOR_TEST);var c=this.pickMaterial;e.setRenderTarget(this.pickTarget),e.state.setDepthTest(c.depthTest),e.state.setDepthWrite(c.depthWrite),e.state.setBlending(THREE.NoBlending),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),r.length>0&&r.push(r[0]);for(var u=0;u<r.length;u++){var h=r[u].sceneNode,p=h.geometry;if(p.attributes.indices.buffer){if(c.pcIndex=u,c.program){var m=c.program.program;d.useProgram(m);var f=d.getAttribLocation(m,"indices"),v=4;d.bindBuffer(d.ARRAY_BUFFER,p.attributes.indices.buffer),d.enableVertexAttribArray(f),d.vertexAttribPointer(f,v,d.UNSIGNED_BYTE,!0,0,0),d.uniform1f(c.program.uniforms.pcIndex,c.pcIndex)}e.renderBufferDirect(t,[],null,c,p,h);var m=c.program.program;d.useProgram(m);var f=d.getAttribLocation(m,"indices");d.disableVertexAttribArray(f)}}var g=n*n,E=new ArrayBuffer(4*g),y=new Uint8Array(E),b=new Uint32Array(E);e.context.readPixels(l.x-(n-1)/2,l.y-(n-1)/2,n,n,e.context.RGBA,e.context.UNSIGNED_BYTE,y);for(var T=Number.MAX_VALUE,P=null,R=0;n>R;R++)for(var C=0;n>C;C++){var x=R+C*n,w=Math.pow(R-(n-1)/2,2)+Math.pow(C-(n-1)/2,2),H=y[4*x+3];y[4*x+3]=0;var S=b[x];(0!==S||0!==H)&&T>w&&(P={pIndex:S,pcIndex:H},T=w)}if(P){var B={},V=r[P.pcIndex].sceneNode,A=V.geometry.attributes;for(var M in A)if(A.hasOwnProperty(M)){var I=p.attributes[M];if("position"===M){var L=V.geometry.attributes.position.array,W=L[3*P.pIndex+0],N=L[3*P.pIndex+1],G=L[3*P.pIndex+2],X=new THREE.Vector3(W,N,G);X.applyMatrix4(this.matrixWorld),B[M]=X}else if("indices"===M);else if(1===I.itemSize)B[M]=I.array[u+O];else{for(var D=[],O=0;O<I.itemSize;O++)D.push(I.array[u*I.itemSize+O]);B[M]=D}}return B}return null};var demTime=0;Potree.PointCloudOctree.prototype.createDEM=function(e){for(var t=(new Date).getTime(),i=e.sceneNode,o=i.matrixWorld,n=i.boundingBox.clone().applyMatrix4(o),r=n.size(),a=i.geometry.attributes.position.array,s=64,l=new Array(s*s),d=new Float32Array(s*s),c=a.length/3,u=0;c>u;u++){var h=a[3*u+0],p=a[3*u+1],m=a[3*u+2],f=new THREE.Vector3(h,p,m).applyMatrix4(o),v=parseInt(s*(f.x-n.min.x)/r.x),g=parseInt(s*(f.z-n.min.z)/r.z);v=Math.min(v,s-1),g=Math.min(g,s-1);var E=v+g*s;l[E]||(l[E]=[]),l[E].push(f.y)}for(var u=0;u<l.length;u++){var y=l[u];if(y)if(0===y.length)d[u]=0;else{var b=parseInt((y.length-1)/2);d[u]=y[b]}else d[u]=0}var T=new THREE.Box2;T.expandByPoint(new THREE.Vector3(n.min.x,n.min.z)),T.expandByPoint(new THREE.Vector3(n.max.x,n.max.z));var P={boundingBox:n,boundingBox2D:T,dem:d,demSize:s},R=(new Date).getTime(),C=R-t;return demTime+=C,P},Potree.PointCloudOctree.prototype.getDEMHeight=function(e){var t=new THREE.Vector2(e.x,e.z),i=function(e){var i=e.demSize,o=e.boundingBox2D;o.containsPoint(t);if(o.containsPoint(t)){var n=t.clone().sub(o.min).divide(o.size()),r=n.clone().multiplyScalar(i),a=0;if(r.x>.5&&r.x<i-.5&&r.y>.5&&r.y<i-.5){var s=Math.floor(r.x-.5),l=Math.floor(r.y-.5);s=s===i-1?i-2:s,l=l===i-1?i-2:l;var d=r.x-s-.5,c=r.y-l-.5,u=s+l*i,h=s+1+l*i,p=s+(l+1)*i,m=s+1+(l+1)*i,f=e.dem[u],v=e.dem[h],g=e.dem[p],E=e.dem[m];if(0===f||0===v||0===g||0===E)a=null;else{var y=f*(1-d)+v*d,b=g*(1-d)+E*d;a=y*(1-c)+b*c}}else{r.x=Math.min(parseInt(Math.min(r.x,i)),i-1),r.y=Math.min(parseInt(Math.min(r.y,i)),i-1);var T=r.x+r.y*i;a=e.dem[T]}return a}return null},o=null,n=[];for(this.root.dem&&n.push(this.root);n.length>0;){var r=n.shift(),a=r.dem,s=(a.demSize,a.boundingBox2D);s.containsPoint(t);if(s.containsPoint(t)){var l=i(a);if(o?null!=l&&l>0&&(o=l):o=l,r.level<=2)for(var d=0;d<r.children.length;d++){var c=r.children[d];c.dem&&n.push(c)}}}return o},Potree.PointCloudOctree.prototype.generateTerain=function(){for(var e=this.boundingBox.clone().applyMatrix4(this.matrixWorld),t=300,i=300,o=new THREE.BufferGeometry,n=new Float32Array(t*i*3),r=0,a=0;t>a;a++)for(var s=0;i>s;s++){var l=a/t,d=s/i,c=l*e.size().x+e.min.x,u=d*e.size().z+e.min.z,h=this.getDEMHeight(new THREE.Vector3(c,0,u));h||(h=0),n[r+0]=c,n[r+1]=h,n[r+2]=u,r+=3}o.addAttribute("position",new THREE.BufferAttribute(n,3));var p=new THREE.PointCloudMaterial({size:20,color:65280}),m=new THREE.PointCloud(o,p);scene.add(m)},Object.defineProperty(Potree.PointCloudOctree.prototype,"progress",{get:function(){return this.visibleNodes.length/this.visibleGeometry.length}});var nodesLoadTimes={};Potree.PointCloudOctreeGeometry=function(){Potree.PointCloudOctree.lru=Potree.PointCloudOctree.lru||new LRU,this.url=null,this.octreeDir=null,this.spacing=0,this.boundingBox=null,this.root=null,this.numNodesLoading=0,this.nodes=null,this.pointAttributes=null,this.hierarchyStepSize=-1,this.loader=null},Potree.PointCloudOctreeGeometryNode=function(e,t,i){this.id=Potree.PointCloudOctreeGeometryNode.IDCount++,this.name=e,this.index=parseInt(e.charAt(e.length-1)),this.pcoGeometry=t,this.geometry=null,this.boundingBox=i,this.boundingSphere=i.getBoundingSphere(),this.children={},this.numPoints=0,this.level=null},Potree.PointCloudOctreeGeometryNode.IDCount=0,Potree.PointCloudOctreeGeometryNode.prototype.getURL=function(){var e="",t=this.pcoGeometry.loader.version;return t.equalOrHigher("1.5")?e=this.pcoGeometry.octreeDir+"/"+this.getHierarchyPath()+"/"+this.name:t.equalOrHigher("1.4")?e=this.pcoGeometry.octreeDir+"/"+this.name:t.upTo("1.3")&&(e=this.pcoGeometry.octreeDir+"/"+this.name),e},Potree.PointCloudOctreeGeometryNode.prototype.getHierarchyPath=function(){for(var e="r/",t=this.pcoGeometry.hierarchyStepSize,i=this.name.substr(1),o=Math.floor(i.length/t),n=0;o>n;n++)e+=i.substr(n*t,t)+"/";return e=e.slice(0,-1)},Potree.PointCloudOctreeGeometryNode.prototype.addChild=function(e){this.children[e.index]=e,e.parent=this},Potree.PointCloudOctreeGeometryNode.prototype.load=function(){this.loading===!0||this.pcoGeometry.numNodesLoading>3||(this.loading=!0,this.pcoGeometry.numNodesLoading++,this.pcoGeometry.loader.version.equalOrHigher("1.5")&&this.level%this.pcoGeometry.hierarchyStepSize===0&&this.hasChildren?this.loadHierachyThenPoints():this.loadPoints())},Potree.PointCloudOctreeGeometryNode.prototype.loadPoints=function(){this.pcoGeometry.loader.load(this)},Potree.PointCloudOctreeGeometryNode.prototype.loadHierachyThenPoints=function(){var e=this,t=function(e,t){var i=(t.byteLength/5,new DataView(t)),o=[],n=i.getUint8(0),r=i.getUint32(1,!0);e.numPoints=r,o.push({children:n,numPoints:r,name:e.name});for(var a=[],s=5;o.length>0;){for(var l=o.shift(),d=1,c=0;8>c;c++){if(0!==(l.children&d)){var u=l.name+c,h=i.getUint8(s),p=i.getUint32(s+1,!0);o.push({children:h,numPoints:p,name:u}),a.push({children:h,numPoints:p,name:u}),s+=5}d=2*d}if(s===t.byteLength)break}var m={};m[e.name]=e;for(var f=e.pcoGeometry,c=0;c<a.length;c++){var v=a[c].name,r=a[c].numPoints,g=parseInt(v.charAt(v.length-1)),E=v.substring(0,v.length-1),y=m[E],b=v.length-1,T=Potree.POCLoader.createChildAABB(y.boundingBox,g),P=new Potree.PointCloudOctreeGeometryNode(v,f,T);P.level=b,P.numPoints=r,P.hasChildren=a[c].children>0,y.addChild(P),m[v]=P}e.loadPoints()};if(e.level%e.pcoGeometry.hierarchyStepSize===0){var i=e.pcoGeometry.octreeDir+"/"+e.getHierarchyPath()+"/"+e.name+".hrc",o=new XMLHttpRequest;o.open("GET",i,!0),o.responseType="arraybuffer",o.overrideMimeType("text/plain; charset=x-user-defined"),o.onreadystatechange=function(){if(4===o.readyState)if(200===o.status||0===o.status){var i=o.response;t(e,i)}else console.log("Failed to load file! HTTP status: "+o.status+", file: "+url)};try{o.send(null)}catch(n){console.log("fehler beim laden der punktwolke: "+n)}}},Potree.PointCloudOctreeGeometryNode.prototype.dispose=function(){this.geometry&&(this.geometry.dispose(),this.geometry=null,this.loaded=!1)},Potree.utils=function(){},Potree.utils.pathExists=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),200!==t.status?!1:!0},Potree.utils.computeTransformedBoundingBox=function(e,t){var i=[new THREE.Vector3(e.min.x,e.min.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.min.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.min.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.max.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.min.y,e.max.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.max.y,e.max.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.max.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.min.y,e.max.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.max.y,e.max.z).applyMatrix4(t)],o=new THREE.Box3;return o.setFromPoints(i),o},Potree.utils.addCommas=function(e){e+="",x=e.split("."),x1=x[0],x2=x.length>1?"."+x[1]:"";for(var t=/(\d+)(\d{3})/;t.test(x1);)x1=x1.replace(t,"$1,$2");return x1+x2},Potree.utils.createWorker=function(e){var t=new Blob([e],{type:"application/javascript"}),i=new Worker(URL.createObjectURL(t));return i},Potree.utils.loadSkybox=function(e){var t=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,1,1e5),i=new THREE.Scene,o=".jpg",n=[e+"px"+o,e+"nx"+o,e+"py"+o,e+"ny"+o,e+"pz"+o,e+"nz"+o],r=THREE.ImageUtils.loadTextureCube(n,THREE.CubeRefractionMapping),a={uniforms:{tCube:{type:"t",value:r},tFlip:{type:"f",value:-1}},vertexShader:THREE.ShaderLib.cube.vertexShader,fragmentShader:THREE.ShaderLib.cube.fragmentShader},s=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:a.uniforms,depthWrite:!1,side:THREE.BackSide}),l=new THREE.Mesh(new THREE.BoxGeometry(100,100,100),s);return i.add(l),{camera:t,scene:i}},Potree.utils.createGrid=function(e,t,i,o){for(var n=new THREE.LineBasicMaterial({color:o||8947848}),r=new THREE.Geometry,a=0;t>=a;a++)r.vertices.push(new THREE.Vector3(-(i*e)/2,0,a*i-i*t/2)),r.vertices.push(new THREE.Vector3(+(i*e)/2,0,a*i-i*t/2));for(var a=0;e>=a;a++)r.vertices.push(new THREE.Vector3(a*i-i*e/2,0,-(i*t)/2)),r.vertices.push(new THREE.Vector3(a*i-i*e/2,0,+(i*t)/2));var s=new THREE.Line(r,n,THREE.LinePieces);return s.receiveShadow=!0,s},Potree.utils.createBackgroundTexture=function(e,t){function i(e,t){return 1/(2*Math.PI)*Math.exp(-(e*e+t*t)/2)}var o=THREE.ImageUtils.generateDataTexture(e,t,new THREE.Color);o.magFilter=THREE.NearestFilter;for(var n=o.image.data,r=[1,1.5,1.7],a=i(0,0),s=0;e>s;s++)for(var l=0;t>l;l++){var d=2*(s/e)-1,c=2*(l/t)-1,u=s+e*l,h=i(2*d,2*c)/a,p=(Math.random()+Math.random()+Math.random())/3;p=(.5*h+.5)*p*.03,p=.4*p,n[3*u+0]=255*(h/15+.05+p)*r[0],n[3*u+1]=255*(h/15+.05+p)*r[1],n[3*u+2]=255*(h/15+.05+p)*r[2]}return o},Potree.utils.topView=function(e,t,i){if(e.position.set(0,1,0),e.rotation.set(-Math.PI/2,0,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(e.position.x,o.center.y,e.position.z);t.target.copy(n)}},Potree.utils.frontView=function(e,t,i){if(e.position.set(0,0,1),e.rotation.set(0,0,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(e.position.x,e.position.y,o.center.z);t.target.copy(n)}},Potree.utils.leftView=function(e,t,i){if(e.position.set(-1,0,0),e.rotation.set(0,-Math.PI/2,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(o.center.x,e.position.y,e.position.z);t.target.copy(n)}},Potree.utils.rightView=function(e,t,i){if(e.position.set(1,0,0),e.rotation.set(0,Math.PI/2,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(o.center.x,e.position.y,e.position.z);t.target.copy(n)}},Potree.utils.frustumSphereIntersection=function(e,t){for(var i=e.planes,o=t.center,n=-t.radius,r=Number.MAX_VALUE,a=0;6>a;a++){var s=i[a].distanceToPoint(o);if(n>s)return 0;r=Math.min(r,s)}return r>=t.radius?2:1},Potree.utils.screenPass=new function(){this.screenScene=new THREE.Scene,this.screenQuad=new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2,0)),this.screenQuad.material.depthTest=!0,this.screenQuad.material.depthWrite=!0,this.screenQuad.material.transparent=!0,this.screenScene.add(this.screenQuad),this.camera=new THREE.Camera,this.render=function(e,t,i){this.screenQuad.material=t,void 0===typeof i?e.render(this.screenScene,this.camera):e.render(this.screenScene,this.camera,i)}},Potree.Features=function(){var e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");if(null===t)return null;var i,o=t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.HIGH_FLOAT),n=t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.MEDIUM_FLOAT),r=(t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.LOW_FLOAT),t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.HIGH_FLOAT)),a=t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.MEDIUM_FLOAT),s=(t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.LOW_FLOAT),o.precision>0&&r.precision>0),l=n.precision>0&&a.precision>0;return i=s?"highp":l?"mediump":"lowp",{SHADER_INTERPOLATION:{isSupported:function(){var e=!0;return e=e&&t.getExtension("EXT_frag_depth"),e=e&&t.getParameter(t.MAX_VARYING_VECTORS)>=8}},SHADER_SPLATS:{isSupported:function(){var e=!0;return e=e&&t.getExtension("EXT_frag_depth"),e=e&&t.getExtension("OES_texture_float"),e=e&&t.getParameter(t.MAX_VARYING_VECTORS)>=8}},SHADER_EDL:{isSupported:function(){var e=!0;return e=e&&t.getExtension("EXT_frag_depth"),e=e&&t.getExtension("OES_texture_float"),e=e&&t.getParameter(t.MAX_VARYING_VECTORS)>=8}},precision:i}}(),Potree.TextSprite=function(e){THREE.Object3D.call(this);var t=new THREE.Texture;t.minFilter=THREE.LinearFilter,t.magFilter=THREE.LinearFilter;var i=new THREE.SpriteMaterial({map:t,useScreenCoordinates:!1});this.material=i,this.sprite=new THREE.Sprite(i),this.add(this.sprite),this.borderThickness=4,this.fontface="Arial",this.fontsize=28,this.borderColor={r:0,g:0,b:0,a:1},this.backgroundColor={r:255,g:255,b:255,a:1},this.textColor={r:255,g:255,b:255,a:1},this.text="",this.setText(e)},Potree.TextSprite.prototype=new THREE.Object3D,Potree.TextSprite.prototype.setText=function(e){this.text=e,this.update()},Potree.TextSprite.prototype.setTextColor=function(e){this.textColor=e,this.update()},Potree.TextSprite.prototype.setBorderColor=function(e){this.borderColor=e,this.update()},Potree.TextSprite.prototype.setBackgroundColor=function(e){this.backgroundColor=e,this.update()},Potree.TextSprite.prototype.update=function(){var e=document.createElement("canvas"),t=e.getContext("2d");t.font="Bold "+this.fontsize+"px "+this.fontface;var i=t.measureText(this.text),o=i.width,n=o+2*this.borderThickness,r=1.4*this.fontsize+2*this.borderThickness,e=document.createElement("canvas"),t=e.getContext("2d");t.canvas.width=n,t.canvas.height=r,t.font="Bold "+this.fontsize+"px "+this.fontface,t.fillStyle="rgba("+this.backgroundColor.r+","+this.backgroundColor.g+","+this.backgroundColor.b+","+this.backgroundColor.a+")",t.strokeStyle="rgba("+this.borderColor.r+","+this.borderColor.g+","+this.borderColor.b+","+this.borderColor.a+")",t.lineWidth=this.borderThickness,this.roundRect(t,this.borderThickness/2,this.borderThickness/2,o+this.borderThickness,1.4*this.fontsize+this.borderThickness,6),t.strokeStyle="rgba(0, 0, 0, 1.0)",t.strokeText(this.text,this.borderThickness,this.fontsize+this.borderThickness),t.fillStyle="rgba("+this.textColor.r+","+this.textColor.g+","+this.textColor.b+","+this.textColor.a+")",t.fillText(this.text,this.borderThickness,this.fontsize+this.borderThickness);var a=new THREE.Texture(e);a.minFilter=THREE.LinearFilter,a.magFilter=THREE.LinearFilter,a.needsUpdate=!0,this.sprite.material.map=a,this.sprite.scale.set(.01*n,.01*r,1)},Potree.TextSprite.prototype.roundRect=function(e,t,i,o,n,r){e.beginPath(),e.moveTo(t+r,i),e.lineTo(t+o-r,i),e.quadraticCurveTo(t+o,i,t+o,i+r),e.lineTo(t+o,i+n-r),e.quadraticCurveTo(t+o,i+n,t+o-r,i+n),e.lineTo(t+r,i+n),e.quadraticCurveTo(t,i+n,t,i+n-r),e.lineTo(t,i+r),e.quadraticCurveTo(t,i,t+r,i),e.closePath(),e.fill(),e.stroke()},Potree.Version=function(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)},Potree.Version.prototype.newerThan=function(e){var t=new Potree.Version(e);return this.versionMajor>t.versionMajor?!0:this.versionMajor===t.versionMajor&&this.versionMinor>t.versionMinor?!0:!1},Potree.Version.prototype.equalOrHigher=function(e){var t=new Potree.Version(e);return this.versionMajor>t.versionMajor?!0:this.versionMajor===t.versionMajor&&this.versionMinor>=t.versionMinor?!0:!1},Potree.Version.prototype.upTo=function(e){return!this.newerThan(e)},Potree.Measure=function(){var e=this;THREE.Object3D.call(this),this.points=[],this._showDistances=!0,this._showArea=!0,this._closed=!0,this.maxMarkers=Number.MAX_SAFE_INTEGER,this.spheres=[],this.edges=[],this.sphereLabels=[],this.edgeLabels=[],this.angleLabels=[],this.areaLabel=new Potree.TextSprite(""),this.areaLabel.setBorderColor({r:0,g:255,b:0,a:0}),this.areaLabel.setBackgroundColor({r:0,g:255,b:0,a:0}),this.areaLabel.setTextColor({r:180,g:220,b:180,a:1}),this.areaLabel.material.depthTest=!1,this.areaLabel.material.opacity=1,this.add(this.areaLabel);var t=new THREE.SphereGeometry(.4,10,10);this.color=new THREE.Color(16711680);var i=function(){var t=new THREE.MeshLambertMaterial({shading:THREE.SmoothShading,color:e.color,ambient:11184810,depthTest:!1,depthWrite:!1});return t},o=function(e){e.target.material.emissive.setHex(8947848)},n=function(e){e.target.material.emissive.setHex(0)},r=function(t){var i=t.tool,o=(i.dragstart,i.mouse,i.getMousePointCloudIntersection());if(o){var n=e.spheres.indexOf(i.dragstart.object);e.setPosition(n,o)}},a=function(e){};this.addMarker=function(e){this.points.push(e);var s=new THREE.Mesh(t,i());s.addEventListener("move",o),s.addEventListener("leave",n),s.addEventListener("drag",r),s.addEventListener("drop",a),this.add(s),this.spheres.push(s);var l=new THREE.Geometry;l.vertices.push(new THREE.Vector3,new THREE.Vector3),l.colors.push(this.color,this.color,this.color);var d=new THREE.LineBasicMaterial({linewidth:1});d.depthTest=!1;var c=new THREE.Line(l,d);c.visible=!0,this.add(c),this.edges.push(c);var u=new Potree.TextSprite(0);u.setBorderColor({r:0,g:255,b:0,a:0}),u.setBackgroundColor({r:0,g:255,b:0,a:0}),u.material.depthTest=!1,u.visible=!1,this.edgeLabels.push(u),this.add(u);var h=new Potree.TextSprite;h.setBorderColor({r:0,g:255,b:0,a:0}),h.setBackgroundColor({r:0,g:255,b:0,a:0}),h.material.depthTest=!1,h.material.opacity=1,h.visible=!1,this.angleLabels.push(h),this.add(h);var p={type:"marker_added",measurement:this};this.dispatchEvent(p),this.setPosition(this.points.length-1,e)},this.removeMarker=function(e){this.points.splice(e,1),this.remove(this.spheres[e]);var t=0==e?0:e-1;this.remove(this.edges[t]),this.edges.splice(t,1),this.remove(this.edgeLabels[t]),this.edgeLabels.splice(t,1),this.spheres.splice(e,1),this.update()},this.setPosition=function(e,t){var i=this.points[e];i.copy(t);var o={type:"marker_moved",measure:this,index:e,position:t.clone()};this.dispatchEvent(o),this.update()},this.getArea=function(){for(var e=0,t=this.points.length-1,i=0;i<this.points.length;i++){var o=this.points[i],n=this.points[t];e+=(n.x+o.x)*(o.z-n.z),t=i}return Math.abs(e/2)},this.getAngleBetweenLines=function(e,t,i){var o=(new THREE.Vector3).subVectors(t,e),n=(new THREE.Vector3).subVectors(i,e);return o.angleTo(n)},this.update=function(){if(0!==this.points.length){if(1===this.points.length){var t=this.points[0];return void this.spheres[0].position.copy(t)}for(var i=this.points.length-1,o=new THREE.Vector3,n=0;i>=n;n++){var t=this.points[n];o.add(t)}o.divideScalar(this.points.length);for(var n=0;i>=n;n++){var r=n,a=n+1>i?0:n+1,s=0===n?i:n-1,t=this.points[r],l=this.points[a],d=this.points[s],c=this.spheres[r];c.position.copy(t),c.material.color=e.color;var u=this.edges[r];u.material.color=this.color,u.geometry.vertices[0].copy(t),u.geometry.vertices[1].copy(l),u.geometry.verticesNeedUpdate=!0,u.geometry.computeBoundingSphere(),u.visible=i>r||this.closed;var h=this.edgeLabels[n],p=(new THREE.Vector3).add(t);p.add(l),p=p.multiplyScalar(.5);var m=t.distanceTo(l);h.position.copy(p),h.setText(m.toFixed(2)),h.visible=this.showDistances&&(i>r||this.closed)&&this.points.length>=2&&m>0;var f=this.angleLabels[n],v=this.getAngleBetweenLines(t,d,l),g=l.clone().sub(d);g.multiplyScalar(.5),g=d.clone().add(g).sub(t).normalize();var E=Math.min(t.distanceTo(d),t.distanceTo(l));E/=9;var y=t.clone().add(g.multiplyScalar(E));f.position.copy(y);var b=Potree.utils.addCommas((v*(180/Math.PI)).toFixed(1))+"°";f.setText(b),f.visible=this.showAngles&&(i>r||this.closed)&&this.points.length>=3&&v>0}this.areaLabel.position.copy(o),this.areaLabel.visible=this.showArea&&this.points.length>=3;var b=Potree.utils.addCommas(this.getArea().toFixed(1))+"²";this.areaLabel.setText(b)}},this.raycast=function(e,t){for(var i=0;i<this.points.length;i++){var o=this.spheres[i];o.raycast(e,t)}for(var i=0;i<t.length;i++){var n=t[i];n.distance=e.ray.origin.distanceTo(n.point)}t.sort(function(e,t){return e.distance-t.distance})}},Potree.Measure.prototype=Object.create(THREE.Object3D.prototype),Object.defineProperty(Potree.Measure.prototype,"showArea",{get:function(){return this._showArea},set:function(e){this._showArea=e,this.update()}}),Object.defineProperty(Potree.Measure.prototype,"closed",{get:function(){return this._closed},set:function(e){this._closed=e,this.update()}}),Object.defineProperty(Potree.Measure.prototype,"showDistances",{get:function(){return this._showDistances},set:function(e){this._showDistances=e,this.update()}}),Potree.MeasuringTool=function(e,t,i){function o(e){if(h===u.INSERT){var t=c.getMousePointCloudIntersection();if(t){var i=t.clone();c.activeMeasurement.addMarker(i);var e={type:"newpoint",position:i.clone()};c.dispatchEvent(e),c.activeMeasurement.points.length>c.activeMeasurement.maxMarkers&&c.finishInsertion()}}}function n(e){var t=c.domElement.getBoundingClientRect();if(c.mouse.x=(e.clientX-t.left)/c.domElement.clientWidth*2-1,c.mouse.y=2*-((e.clientY-t.top)/c.domElement.clientHeight)+1,c.dragstart){var i={type:"drag",event:e,tool:c};c.dragstart.object.dispatchEvent(i)}else if(h==u.INSERT&&c.activeMeasurement){var o=c.getMousePointCloudIntersection();if(o){var n=c.activeMeasurement.points.length-1;c.activeMeasurement.setPosition(n,o)}}else{var o=d();o?(o.object.dispatchEvent({type:"move",target:o.object,event:e}),c.hoveredElement&&c.hoveredElement!==o.object&&c.hoveredElement.dispatchEvent({type:"leave",target:c.hoveredElement,event:e}),c.hoveredElement=o.object):(c.hoveredElement&&c.hoveredElement.dispatchEvent({type:"leave",target:c.hoveredElement,event:e}),c.hoveredElement=null)}}function r(e){h==u.INSERT&&c.finishInsertion()}function a(e){if(1===e.which){h!==u.DEFAULT&&e.stopImmediatePropagation();var t=d();t&&(c.dragstart={object:t.object,sceneClickPos:t.point,sceneStartPos:c.sceneRoot.position.clone(),mousePos:{x:c.mouse.x,y:c.mouse.y}},e.stopImmediatePropagation())}else 3===e.which&&r(e)}function s(e){window.getSelection?window.getSelection().removeAllRanges():document.selection&&document.selection.empty(),c.activeMeasurement&&h===u.INSERT&&(c.activeMeasurement.removeMarker(c.activeMeasurement.points.length-1),c.finishInsertion())}function l(e){c.dragstart&&(c.dragstart.object.dispatchEvent({type:"drop",event:e}),c.dragstart=null)}function d(){var e=new THREE.Vector3(c.mouse.x,c.mouse.y,.5);e.unproject(c.camera);var t=new THREE.Raycaster;t.ray.set(c.camera.position,e.sub(c.camera.position).normalize());for(var i=[],o=0;o<c.measurements.length;o++)for(var n=c.measurements[o],r=0;r<n.spheres.length;r++)i.push(n.spheres[r]);var a=t.intersectObjects(i,!0);return a.length>0?a[0]:!1}var c=this;this.enabled=!1,this.scene=e,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0};var u={DEFAULT:0,INSERT:1},h=u.DEFAULT;this.activeMeasurement,this.measurements=[],this.sceneMeasurement=new THREE.Scene,this.sceneRoot=new THREE.Object3D,this.sceneMeasurement.add(this.sceneRoot),this.light=new THREE.DirectionalLight(16777215,1),this.light.position.set(0,0,10),this.light.lookAt(new THREE.Vector3(0,0,0)),this.sceneMeasurement.add(this.light),this.hoveredElement=null,this.getState=function(){return h},this.getMousePointCloudIntersection=function(){var e=new THREE.Vector3(c.mouse.x,c.mouse.y,.5);e.unproject(c.camera);var t=e.sub(c.camera.position).normalize(),i=new THREE.Ray(c.camera.position,t),o=[];c.scene.traverse(function(e){(e instanceof Potree.PointCloudOctree||e instanceof Potree.PointCloudArena4D)&&o.push(e)});for(var n=null,r=null,a=0;a<o.length;a++){var s=o[a],l=s.pick(c.renderer,c.camera,i);if(l){var d=c.camera.position.distanceTo(l.position);(!n||r>d)&&(n=l,r=d)}}return n?n.position:null},this.startInsertion=function(e){h=u.INSERT;var e=e||{},t="undefined"!=typeof e.showDistances?e.showDistances:!0,i="undefined"!=typeof e.showArea?e.showArea:!1,o="undefined"!=typeof e.showAngles?e.showAngles:!1,n="undefined"!=typeof e.closed?e.closed:!1,r=e.maxMarkers||Number.MAX_SAFE_INTEGER,a=new Potree.Measure;a.showDistances=t,a.showArea=i,a.showAngles=o,a.closed=n,a.maxMarkers=r,this.addMeasurement(a),a.addMarker(new THREE.Vector3(0,0,0)),this.activeMeasurement=a},this.finishInsertion=function(){this.activeMeasurement.removeMarker(this.activeMeasurement.points.length-1);var e={type:"insertion_finished",measurement:this.activeMeasurement};this.dispatchEvent(e),this.activeMeasurement=null,h=u.DEFAULT},this.addMeasurement=function(e){this.sceneMeasurement.add(e),this.measurements.push(e),this.dispatchEvent({type:"measurement_added",measurement:e}),e.addEventListener("marker_added",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_removed",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_moved",function(e){c.dispatchEvent(e)})},this.removeMeasurement=function(e){this.sceneMeasurement.remove(e);var t=this.measurements.indexOf(e);t>=0&&this.measurements.splice(t,1)},this.reset=function(){for(var e=this.measurements.length-1;e>=0;e--){var t=this.measurements[e];this.removeMeasurement(t)}},this.update=function(){for(var e=[],t=0;t<this.measurements.length;t++)e.push(this.measurements[t]);this.activeMeasurement&&e.push(this.activeMeasurement);for(var t=0;t<e.length;t++){for(var o=e[t],n=0;n<o.spheres.length;n++){var r=o.spheres[n],a=c.camera.position.distanceTo(r.getWorldPosition()),s=projectedRadius(1,c.camera.fov*Math.PI/180,a,i.domElement.clientHeight),l=15/s;r.scale.set(l,l,l)}for(var n=0;n<o.edgeLabels.length;n++){var d=o.edgeLabels[n],a=c.camera.position.distanceTo(d.getWorldPosition()),s=projectedRadius(1,c.camera.fov*Math.PI/180,a,i.domElement.clientHeight),l=70/s;d.scale.set(l,l,l)}for(var n=0;n<o.edgeLabels.length;n++){var d=o.angleLabels[n],a=c.camera.position.distanceTo(d.getWorldPosition()),s=projectedRadius(1,c.camera.fov*Math.PI/180,a,i.domElement.clientHeight),l=70/s;d.scale.set(l,l,l)}var a=c.camera.position.distanceTo(o.areaLabel.getWorldPosition()),s=projectedRadius(1,c.camera.fov*Math.PI/180,a,i.domElement.clientHeight),l=80/s;o.areaLabel.scale.set(l,l,l)}this.light.position.copy(this.camera.position),this.light.lookAt(this.camera.getWorldDirection().add(this.camera.position))},this.render=function(){this.update(),this.renderer.render(this.sceneMeasurement,this.camera)},this.domElement.addEventListener("click",o,!1),this.domElement.addEventListener("dblclick",s,!1),this.domElement.addEventListener("mousemove",n,!1),this.domElement.addEventListener("mousedown",a,!1),this.domElement.addEventListener("mouseup",l,!0)},Potree.MeasuringTool.prototype=Object.create(THREE.EventDispatcher.prototype),Potree.HeightProfile=function(){var e=this;THREE.Object3D.call(this),this.points=[],this.spheres=[],this.edges=[],this.boxes=[],this.width=1,this.height=20,this._modifiable=!0;var t=new THREE.SphereGeometry(.4,10,10),i=new THREE.Color(16711680),o=function(){var e=new THREE.MeshLambertMaterial({shading:THREE.SmoothShading,color:16711680,ambient:11184810,depthTest:!1,depthWrite:!1});return e},n=function(e){e.target.material.emissive.setHex(8947848)},r=function(e){e.target.material.emissive.setHex(0)},a=function(t){var i=t.tool,o=i.dragstart,n=i.mouse;if(t.event.ctrlKey){var r=new THREE.Vector3(o.mousePos.x,o.mousePos.y,0),a=new THREE.Vector3(n.x,n.y,0),s=o.widthStart,l=1-10*(r.y-a.y);l=Math.max(.01,l),s&&e.setWidth(s*l)}else{var d=i.getMousePointCloudIntersection();if(d){var c=e.spheres.indexOf(i.dragstart.object);e.setPosition(c,d)}}t.event.stopImmediatePropagation()},s=function(e){};this.addMarker=function(e){this.points.push(e);var l=new THREE.Mesh(t,o());if(l.addEventListener("mousemove",n),l.addEventListener("mouseleave",r),l.addEventListener("mousedrag",a),l.addEventListener("drop",s),this.add(l),this.spheres.push(l),this.points.length>1){var d=new THREE.Geometry;d.vertices.push(new THREE.Vector3,new THREE.Vector3),d.colors.push(i,i,i);var c=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors,linewidth:2,transparent:!0,opacity:.4});c.depthTest=!1;var u=new THREE.Line(d,c);u.visible=!1,this.add(u),this.edges.push(u);var h=new THREE.BoxGeometry(1,1,1),p=new THREE.MeshBasicMaterial({color:16711680,transparent:!0,opacity:.2}),m=new THREE.Mesh(h,p);m.visible=!1,this.add(m),this.boxes.push(m)}var f={type:"marker_added",profile:this};this.dispatchEvent(f),this.setPosition(this.points.length-1,e)},this.removeMarker=function(e){this.points.splice(e,1),this.remove(this.spheres[e]);var t=0==e?0:e-1;this.remove(this.edges[t]),this.edges.splice(t,1),this.remove(this.boxes[t]),this.boxes.splice(t,1),this.spheres.splice(e,1),this.update();var i={type:"marker_removed",profile:this};this.dispatchEvent(i)},this.getArea=function(){for(var e=0,t=this.points.length-1,i=0;i<this.points.length;i++){var o=this.points[i],n=this.points[t];e+=(n.x+o.x)*(o.z-n.z),t=i}return Math.abs(e/2)},this.setPosition=function(e,t){var i=this.points[e];i.copy(t);var o={type:"marker_moved",profile:this,index:e,position:t.clone()};this.dispatchEvent(o),this.update()},this.setWidth=function(e){this.width=e,this.update()},this.update=function(){if(0!==this.points.length){if(1===this.points.length){var e=this.points[0];return void this.spheres[0].position.copy(e)}for(var t=this.points[0].clone(),i=this.points[0].clone(),o=new THREE.Vector3,n=this.points.length-1,r=0;n>=r;r++){var e=this.points[r],a=this.spheres[r],s=0===r?n:r-1,l=r===n?0:r+1,d=this.points[s],c=this.points[l],u=this.edges[s],h=this.edges[r],p=this.boxes[s];this.boxes[r],e.distanceTo(d),e.distanceTo(c),(new THREE.Vector3).addVectors(d,e).multiplyScalar(.5),(new THREE.Vector3).addVectors(e,c).multiplyScalar(.5);if(a.position.copy(e),this._modifiable?a.visible=!0:a.visible=!1,u&&(u.geometry.vertices[1].copy(e),u.geometry.verticesNeedUpdate=!0,u.geometry.computeBoundingSphere()),h&&(h.geometry.vertices[0].copy(e),h.geometry.verticesNeedUpdate=!0,h.geometry.computeBoundingSphere()),p){var m=d,f=e,v=m.clone().setY(0).distanceTo(f.clone().setY(0));p.scale.set(v,this.height,this.width);var g=(new THREE.Vector3).addVectors(m,f).multiplyScalar(.5),E=(new THREE.Vector3).subVectors(f,m),y=new THREE.Vector3(E.z,0,-E.x);p.position.set(0,0,0),p.lookAt(y),p.position.copy(g)}o.add(e),t.min(e),i.max(e)}o.multiplyScalar(1/this.points.length);for(var r=0;r<this.boxes.length;r++){var b=this.boxes[r];b.position.y=t.y+(i.y-t.y)/2,b.scale.y=1e6}}},this.raycast=function(e,t){for(var i=0;i<this.points.length;i++){var o=this.spheres[i];o.raycast(e,t)}for(var i=0;i<t.length;i++){var n=t[i];n.distance=e.ray.origin.distanceTo(n.point)}t.sort(function(e,t){return e.distance-t.distance})}},Potree.HeightProfile.prototype=Object.create(THREE.Object3D.prototype),Object.defineProperty(Potree.HeightProfile.prototype,"modifiable",{get:function(){return this.modifiable},set:function(e){this._modifiable=e,this.update()}}),Potree.ProfileTool=function(e,t,i){function o(e){if(h===u.INSERT){var t=c.getMousePointCloudIntersection();if(t){var i=t.clone();c.activeProfile.addMarker(i);var e={type:"newpoint",position:i.clone()};c.dispatchEvent(e)}}}function n(e){var t=c.domElement.getBoundingClientRect();if(c.mouse.x=(e.clientX-t.left)/c.domElement.clientWidth*2-1,c.mouse.y=2*-((e.clientY-t.top)/c.domElement.clientHeight)+1,
c.dragstart){var i={type:"mousedrag",event:e,tool:c};c.dragstart.object.dispatchEvent(i)}else if(h==u.INSERT&&c.activeProfile){var o=c.getMousePointCloudIntersection();if(o){var n=c.activeProfile.points.length-1;c.activeProfile.setPosition(n,o)}}else{var o=d();o?(o.object.dispatchEvent({type:"mousemove",target:o.object,event:e}),c.hoveredElement&&c.hoveredElement!==o.object&&c.hoveredElement.dispatchEvent({type:"mouseleave",target:c.hoveredElement,event:e}),c.hoveredElement=o.object):(c.hoveredElement&&c.hoveredElement.dispatchEvent({type:"mouseleave",target:c.hoveredElement,event:e}),c.hoveredElement=null)}}function r(e){h==u.INSERT&&c.finishInsertion()}function a(e){if(h!==u.DEFAULT&&e.stopImmediatePropagation(),1===e.which){var t=d();if(t){for(var i=null,o=0;o<c.profiles.length;o++)for(var n=c.profiles[o],a=0;a<n.spheres.length;a++){var s=n.spheres[a];s===t.object&&(i=n.width)}c.dragstart={object:t.object,sceneClickPos:t.point,sceneStartPos:c.sceneRoot.position.clone(),mousePos:{x:c.mouse.x,y:c.mouse.y},widthStart:i},e.stopImmediatePropagation()}}else 3===e.which&&r(e)}function s(e){window.getSelection?window.getSelection().removeAllRanges():document.selection&&document.selection.empty(),c.activeProfile&&h===u.INSERT&&(c.activeProfile.removeMarker(c.activeProfile.points.length-1),c.finishInsertion())}function l(e){c.dragstart&&(c.dragstart.object.dispatchEvent({type:"drop",event:e}),c.dragstart=null)}function d(){var e=new THREE.Vector3(c.mouse.x,c.mouse.y,.5);e.unproject(c.camera);var t=new THREE.Raycaster;t.ray.set(c.camera.position,e.sub(c.camera.position).normalize());var i=t.intersectObjects(c.profiles);return i.length>0?i[0]:!1}var c=this;this.enabled=!1,this.scene=e,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0};var u={DEFAULT:0,INSERT:1},h=u.DEFAULT;new THREE.SphereGeometry(.4,10,10);this.activeProfile,this.profiles=[],this.sceneProfile=new THREE.Scene,this.sceneRoot=new THREE.Object3D,this.sceneProfile.add(this.sceneRoot),this.light=new THREE.DirectionalLight(16777215,1),this.light.position.set(0,0,10),this.light.lookAt(new THREE.Vector3(0,0,0)),this.sceneProfile.add(this.light),this.hoveredElement=null,this.getMousePointCloudIntersection=function(){var e=new THREE.Vector3(c.mouse.x,c.mouse.y,.5);e.unproject(c.camera);var t=e.sub(c.camera.position).normalize(),i=new THREE.Ray(c.camera.position,t),o=[];c.scene.traverse(function(e){(e instanceof Potree.PointCloudOctree||e instanceof Potree.PointCloudArena4D)&&o.push(e)});for(var n=null,r=null,a=0;a<o.length;a++){var s=o[a],l=s.pick(c.renderer,c.camera,i);if(l){var d=c.camera.position.distanceTo(l.position);(!n||r>d)&&(n=l,r=d)}}return n?n.position:null},this.startInsertion=function(e){h=u.INSERT;var e=e||{},t=e.clip||!1,i=e.width||1;return this.activeProfile=new Potree.HeightProfile,this.activeProfile.clip=t,this.activeProfile.setWidth(i),this.addProfile(this.activeProfile),this.activeProfile.addMarker(new THREE.Vector3(0,0,0)),this.activeProfile},this.finishInsertion=function(){this.activeProfile.removeMarker(this.activeProfile.points.length-1);var e={type:"insertion_finished",profile:this.activeProfile};this.dispatchEvent(e),this.activeProfile=null,h=u.DEFAULT},this.addProfile=function(e){this.profiles.push(e),this.sceneProfile.add(e),e.update(),this.dispatchEvent({type:"profile_added",profile:e}),e.addEventListener("marker_added",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_removed",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_moved",function(e){c.dispatchEvent(e)})},this.removeProfile=function(e){this.sceneProfile.remove(e);var t=this.profiles.indexOf(e);t>=0&&this.profiles.splice(t,1),this.dispatchEvent({type:"profile_removed",profile:e})},this.reset=function(){for(var e=this.profiles.length-1;e>=0;e--){var t=this.profiles[e];this.removeProfile(t)}},this.update=function(){for(var e=0;e<this.profiles.length;e++)for(var t=this.profiles[e],o=0;o<t.spheres.length;o++){var n=t.spheres[o],r=c.camera.position.distanceTo(n.getWorldPosition()),a=projectedRadius(1,c.camera.fov*Math.PI/180,r,i.domElement.clientHeight),s=15/a;n.scale.set(s,s,s)}this.light.position.copy(this.camera.position),this.light.lookAt(this.camera.getWorldDirection().add(this.camera.position))},this.render=function(){this.update(),i.render(this.sceneProfile,this.camera)},this.domElement.addEventListener("click",o,!1),this.domElement.addEventListener("dblclick",s,!1),this.domElement.addEventListener("mousemove",n,!1),this.domElement.addEventListener("mousedown",a,!1),this.domElement.addEventListener("mouseup",l,!0)},Potree.ProfileTool.prototype=Object.create(THREE.EventDispatcher.prototype),Potree.TransformationTool=function(e,t,i){function o(e){if(s.mouse.x=e.clientX/s.domElement.clientWidth*2-1,s.mouse.y=2*-(e.clientY/s.domElement.clientHeight)+1,s.dragstart)s.dragstart.object.dispatchEvent({type:"mousedrag",event:e});else{var t=a();if(t){var i=t.object;i.dispatchEvent({type:"mousemove",event:e}),s.hoveredElement&&s.hoveredElement!==i&&s.hoveredElement.dispatchEvent({type:"mouseleave",event:e}),s.hoveredElement=i}else s.hoveredElement&&s.hoveredElement.dispatchEvent({type:"mouseleave",event:e}),s.hoveredElement=null}}function n(e){if(1===e.which){var t=a();if(t){for(var i=[],o=[],n=0;n<s.targets.length;n++)i.push(s.targets[n].scale.clone()),o.push(s.targets[n].rotation.clone());s.dragstart={object:t.object,sceneClickPos:t.point,sceneStartPos:s.sceneRoot.position.clone(),mousePos:{x:s.mouse.x,y:s.mouse.y},scales:i,rotations:o},e.stopImmediatePropagation()}}else 3===e.which&&s.setTargets([])}function r(e){s.dragstart&&(s.dragstart.object.dispatchEvent({type:"drop",event:e}),s.dragstart=null)}function a(){if(0!==s.targets.length){var e=new THREE.Vector3(s.mouse.x,s.mouse.y,.5);e.unproject(s.camera);var t=new THREE.Raycaster;t.ray.set(s.camera.position,e.sub(s.camera.position).normalize()),t.linePrecision=.2;var i=[];s.translationNode.visible?i.push(s.translationNode):s.scaleNode.visible?i.push(s.scaleNode):s.rotationNode.visible&&(i.push(s.rotationNode),i.push(s.sceneRotation));for(var o=t.intersectObjects(i,!0),n=0;n<o.length;n++){var r=o[n];r.distance=s.camera.position.distanceTo(r.point)}return o.sort(function(e,t){return e.distance-t.distance}),o.length>0?o[0]:!1}}var s=this;this.enabled=!1,this.scene=e,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0},this.dragstart=null,this.sceneTransformation=new THREE.Scene,this.sceneRoot=new THREE.Object3D,this.sceneTransformation.add(this.sceneRoot),this.sceneRotation=new THREE.Scene,this.translationNode=new THREE.Object3D,this.rotationNode=new THREE.Object3D,this.scaleNode=new THREE.Object3D,this.sceneRoot.add(this.translationNode),this.sceneRoot.add(this.rotationNode),this.sceneRoot.add(this.scaleNode),this.sceneRoot.visible=!1,this.hoveredElement=null,this.STATE={DEFAULT:0,TRANSLATE_X:1,TRANSLATE_Y:2,TRANSLATE_Z:3,SCALE_X:1,SCALE_Y:2,SCALE_Z:3},this.parts={ARROW_X:{name:"arrow_x",object:void 0,color:new THREE.Color(16711680),state:this.STATE.TRANSLATE_X},ARROW_Z:{name:"arrow_z",object:void 0,color:new THREE.Color(255),state:this.STATE.TRANSLATE_Z},ARROW_Y:{name:"arrow_y",object:void 0,color:new THREE.Color(65280),state:this.STATE.TRANSLATE_Y},SCALE_X:{name:"scale_x",object:void 0,color:new THREE.Color(16711680),state:this.STATE.SCALE_X},SCALE_Z:{name:"scale_z",object:void 0,color:new THREE.Color(255),state:this.STATE.SCALE_Z},SCALE_Y:{name:"scale_y",object:void 0,color:new THREE.Color(65280),state:this.STATE.SCALE_Y},ROTATE_X:{name:"rotate_x",object:void 0,color:new THREE.Color(16711680),state:this.STATE.ROTATE_X},ROTATE_Z:{name:"rotate_z",object:void 0,color:new THREE.Color(255),state:this.STATE.ROTATE_Z},ROTATE_Y:{name:"rotate_y",object:void 0,color:new THREE.Color(65280),state:this.STATE.ROTATE_Y}},this.buildTranslationNode=function(){var e=s.createArrow(s.parts.ARROW_X,s.parts.ARROW_X.color);e.rotation.z=-Math.PI/2;var t=s.createArrow(s.parts.ARROW_Y,s.parts.ARROW_Y.color),i=s.createArrow(s.parts.ARROW_Z,s.parts.ARROW_Z.color);i.rotation.x=-Math.PI/2,this.translationNode.add(e),this.translationNode.add(t),this.translationNode.add(i)},this.buildScaleNode=function(){var e=this.createScaleHandle(s.parts.SCALE_X,16711680);e.rotation.z=-Math.PI/2;var t=this.createScaleHandle(s.parts.SCALE_Y,65280),i=this.createScaleHandle(s.parts.SCALE_Z,255);i.rotation.x=-Math.PI/2,this.scaleNode.add(e),this.scaleNode.add(t),this.scaleNode.add(i)},this.buildRotationNode=function(){var e=this.createRotationCircle(s.parts.ROTATE_X,16711680);e.rotation.y=-Math.PI/2;var t=this.createRotationCircle(s.parts.ROTATE_Y,65280),i=this.createRotationCircle(s.parts.ROTATE_Z,255);t.rotation.x=-Math.PI/2,this.rotationNode.add(e),this.rotationNode.add(t),this.rotationNode.add(i);var o=new THREE.SphereGeometry(2.9,24,24),n=new THREE.Mesh(o,new THREE.MeshBasicMaterial({color:11184810,transparent:!0,opacity:.4}));this.sceneRotation.add(n);var r=function(e){n.material.color.setHex(5592405)},a=function(e){n.material.color.setHex(11184810)},l=function(e){e.event.stopImmediatePropagation();for(var t=new THREE.Vector3(s.dragstart.mousePos.x,s.dragstart.mousePos.y,.1),i=new THREE.Vector3(s.mouse.x,s.mouse.y,.1),o=(new THREE.Vector3).subVectors(i,t),n=t.clone().unproject(s.camera),r=i.clone().unproject(s.camera),a=(new THREE.Vector3).subVectors(r,n),l=a.clone().normalize(),d=(new THREE.Vector3).subVectors(s.camera.position,n).normalize(),c=d.clone().cross(l),u=6*o.length(),h=0;h<s.targets.length;h++){var p=s.targets[h],m=s.dragstart.rotations[h];p.rotation.copy(m);var f=new THREE.Quaternion;f.setFromAxisAngle(c,u),p.quaternion.multiplyQuaternions(f,p.quaternion)}},d=function(e){};n.addEventListener("mousemove",r),n.addEventListener("mouseleave",a),n.addEventListener("mousedrag",l),n.addEventListener("drop",d)},this.createBox=function(e){var t=new THREE.BoxGeometry(1,1,1),i=new THREE.MeshBasicMaterial({color:e,transparent:!0,opacity:.5}),o=new THREE.Mesh(t,i);return o};this.createRotationCircle=function(e,t){for(var i=[],o=128,n=0;o>=n;n++){var r=2*Math.PI*n/o,a=3*Math.cos(r),l=3*Math.sin(r);i.push(new THREE.Vector3(a,l,0))}for(var d=new THREE.Geometry,n=0;n<i.length;n++)d.vertices.push(i[n]);var c=new THREE.LineBasicMaterial({color:t}),u=new THREE.Line(d,c);u.mode=THREE.LineStrip,u.scale.set(1,1,1);var h=function(e){c.color.setRGB(1,1,0)},p=function(e){c.color.setHex(t)},m=function(t){t.event.stopImmediatePropagation();var i=new THREE.Vector3;e===s.parts.ROTATE_X?i.x=1:e===s.parts.ROTATE_Y?i.y=1:e===s.parts.ROTATE_Z&&(i.z=-1);var o=s.dragstart.sceneClickPos.clone(),n=s.sceneRoot.position.clone(),r=o.clone().sub(n).normalize(),a=o.clone().project(s.camera),l=n.clone().project(s.camera),d=a.clone().sub(l).normalize(),c=(new THREE.Vector3(d.y,d.x,0),new THREE.Vector3(s.dragstart.mousePos.x,s.dragstart.mousePos.y,0),new THREE.Vector3(s.mouse.x,s.mouse.y,0)),u=(new THREE.Plane).setFromNormalAndCoplanarPoint(i,s.sceneRoot.position),h=s.camera.position,p=(new THREE.Vector3(0,0,-1).applyQuaternion(s.camera.quaternion),new THREE.Vector3(c.x,c.y,.5).unproject(s.camera).sub(s.camera.position).normalize()),m=new THREE.Ray(h,p),f=m.intersectPlane(u);if(f){sceneTargetNormal=f.clone().sub(n).normalize();var v,g;e===s.parts.ROTATE_X?(v=2*Math.PI+Math.atan2(r.y,-r.z),g=4*Math.PI+Math.atan2(sceneTargetNormal.y,-sceneTargetNormal.z)):e===s.parts.ROTATE_Y?(v=2*Math.PI+Math.atan2(-r.z,r.x),g=4*Math.PI+Math.atan2(-sceneTargetNormal.z,sceneTargetNormal.x)):e===s.parts.ROTATE_Z&&(v=2*Math.PI+Math.atan2(r.x,r.y),g=4*Math.PI+Math.atan2(sceneTargetNormal.x,sceneTargetNormal.y));for(var E=g-v,y=0;y<s.targets.length;y++){var b=s.targets[y],T=s.dragstart.rotations[y];b.rotation.copy(T);var P=new THREE.Quaternion;P.setFromAxisAngle(i,E),b.quaternion.multiplyQuaternions(P,b.quaternion)}}},f=function(e){};return u.addEventListener("mousemove",h),u.addEventListener("mouseleave",p),u.addEventListener("mousedrag",m),u.addEventListener("drop",f),u},this.createScaleHandle=function(e,t){var i=new THREE.BoxGeometry(1,1,1),o=new THREE.MeshBasicMaterial({color:t,depthTest:!1,depthWrite:!1}),n=new THREE.Mesh(i,o);n.scale.set(.3,.3,.3),n.position.set(0,3,0);var r=new THREE.Geometry;r.vertices.push(new THREE.Vector3(0,0,0)),r.vertices.push(new THREE.Vector3(0,3,0));var a=new THREE.LineBasicMaterial({color:t,depthTest:!1,depthWrite:!1}),l=new THREE.Line(r,a),d=new THREE.Object3D;d.add(n),d.add(l),d.partID=e;var c=function(e){a.color.setRGB(1,1,0),o.color.setRGB(1,1,0)},u=function(e){a.color.setHex(t),o.color.setHex(t)},h=function(t){var i=new THREE.Vector3;e===s.parts.SCALE_X?i.x=1:e===s.parts.SCALE_Y?i.y=1:e===s.parts.SCALE_Z&&(i.z=-1);var o=s.dragstart.sceneClickPos.clone();o.multiply(i),o.z*=-1;var n=s.dragstart.sceneStartPos.clone().project(s.camera),r=s.dragstart.sceneStartPos.clone().add(i).project(s.camera),a=n.clone(),l=r.clone().sub(n);l.normalize();var d=new THREE.Vector3(s.dragstart.mousePos.x,s.dragstart.mousePos.y,0),c=new THREE.Vector3(s.mouse.x,s.mouse.y,0),u=(new THREE.Vector3).subVectors(c,d).dot(l),h=l.clone().multiplyScalar(u).add(a);h.unproject(s.camera);var p=s.sceneRoot.position.clone().sub(h);p.multiply(new THREE.Vector3(-1,-1,1));for(var m=0;m<s.targets.length;m++){var f=s.targets[m],v=s.dragstart.scales[m];f.scale.copy(v).add(p),f.scale.x=Math.max(f.scale.x,.01),f.scale.y=Math.max(f.scale.y,.01),f.scale.z=Math.max(f.scale.z,.01)}t.event.stopImmediatePropagation()},p=function(e){o.color.set(t)};return n.addEventListener("mousemove",c),n.addEventListener("mouseleave",u),n.addEventListener("mousedrag",h),n.addEventListener("drop",p),l.addEventListener("mousemove",c),l.addEventListener("mouseleave",u),l.addEventListener("mousedrag",h),l.addEventListener("drop",p),d},this.createArrow=function(e,t){var i=new THREE.MeshBasicMaterial({color:t,depthTest:!1,depthWrite:!1}),o=new THREE.Geometry;o.vertices.push(new THREE.Vector3(0,0,0)),o.vertices.push(new THREE.Vector3(0,3,0));var n=new THREE.LineBasicMaterial({color:t,depthTest:!1,depthWrite:!1}),r=new THREE.Line(o,n),a=new THREE.CylinderGeometry(0,.2,.5,10,1,!1),l=i,d=new THREE.Mesh(a,l);d.position.y=3;var c=new THREE.Object3D;c.add(r),c.add(d),c.partID=e,c.material=i;var u=function(e){l.color.setRGB(1,1,0),n.color.setRGB(1,1,0)},h=function(e){l.color.set(t),n.color.set(t)},p=function(t){var i=new THREE.Vector3;e===s.parts.ARROW_X?i.x=1:e===s.parts.ARROW_Y?i.y=1:e===s.parts.ARROW_Z&&(i.z=-1);var o=s.dragstart.sceneClickPos.clone();o.multiply(i),o.z*=-1;var n=s.dragstart.sceneStartPos.clone().project(s.camera),r=s.dragstart.sceneStartPos.clone().add(i).project(s.camera),a=n.clone(),l=r.clone().sub(n);l.normalize();var d=new THREE.Vector3(s.dragstart.mousePos.x,s.dragstart.mousePos.y,0),c=new THREE.Vector3(s.mouse.x,s.mouse.y,0),u=(new THREE.Vector3).subVectors(c,d).dot(l),h=l.clone().multiplyScalar(u).add(a);h.unproject(s.camera);var p=s.sceneRoot.position.clone();o.clone().sub(s.dragstart.sceneStartPos);s.sceneRoot.position.copy(h),p.sub(s.sceneRoot.position);for(var m=0;m<s.targets.length;m++){var f=s.targets[m];f.position.sub(p)}t.event.stopImmediatePropagation()},m=function(e){n.color.set(t)};return r.addEventListener("mousemove",u),d.addEventListener("mousemove",u),r.addEventListener("mouseleave",h),d.addEventListener("mouseleave",h),r.addEventListener("mousedrag",p),d.addEventListener("mousedrag",p),r.addEventListener("drop",m),d.addEventListener("drop",m),c},this.setTargets=function(e){if(s.targets=e,0===s.targets.length)return this.sceneRoot.visible=!1,void(this.sceneRotation.visible=!1);this.sceneRoot.visible=!0;var t,i=e[0];if(t=i.geometry&&i.geometry.boundingBox?i.geometry.boundingBox:i.boundingBox){var o=t.clone().applyMatrix4(i.matrixWorld).center();s.sceneRoot.position.copy(o)}},this.update=function(){var e=this.sceneRoot,i=e.getWorldPosition().applyMatrix4(this.camera.matrixWorldInverse),o=(new THREE.Vector4(i.x,i.y,i.z).applyMatrix4(t.projectionMatrix),Math.abs(i.z/20));e.scale.set(o,o,o),this.targets&&1===this.targets.length&&this.scaleNode.rotation.copy(this.targets[0].rotation),this.sceneRotation.scale.set(o,o,o)},this.render=function(){this.update(),this.sceneRotation.position.copy(this.sceneRoot.position),this.sceneRotation.visible=this.rotationNode.visible&&this.sceneRoot.visible,i.render(this.sceneRotation,this.camera),i.render(this.sceneTransformation,this.camera)},this.translate=function(){this.translationNode.visible=!0,this.scaleNode.visible=!1,this.rotationNode.visible=!1},this.scale=function(){this.translationNode.visible=!1,this.scaleNode.visible=!0,this.rotationNode.visible=!1},this.rotate=function(){this.translationNode.visible=!1,this.scaleNode.visible=!1,this.rotationNode.visible=!0},this.buildTranslationNode(),this.buildScaleNode(),this.buildRotationNode(),this.rotate(),this.setTargets([]),this.domElement.addEventListener("mousemove",o,!0),this.domElement.addEventListener("mousedown",n,!0),this.domElement.addEventListener("mouseup",r,!0)},Potree.Volume=function(e){THREE.Object3D.call(this),e=e||{},this._clip=e.clip||!1,this._modifiable=e.modifiable||!0;var t=new THREE.BoxGeometry(1,1,1);t.computeBoundingBox();var i=new THREE.Geometry;i.vertices.push(new THREE.Vector3(-.5,-.5,.5)),i.vertices.push(new THREE.Vector3(.5,-.5,.5)),i.vertices.push(new THREE.Vector3(.5,-.5,.5)),i.vertices.push(new THREE.Vector3(.5,-.5,-.5)),i.vertices.push(new THREE.Vector3(.5,-.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,-.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,-.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,-.5,.5)),i.vertices.push(new THREE.Vector3(-.5,.5,.5)),i.vertices.push(new THREE.Vector3(.5,.5,.5)),i.vertices.push(new THREE.Vector3(.5,.5,.5)),i.vertices.push(new THREE.Vector3(.5,.5,-.5)),i.vertices.push(new THREE.Vector3(.5,.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,.5,.5)),i.vertices.push(new THREE.Vector3(-.5,-.5,.5)),i.vertices.push(new THREE.Vector3(-.5,.5,.5)),i.vertices.push(new THREE.Vector3(.5,-.5,.5)),i.vertices.push(new THREE.Vector3(.5,.5,.5)),i.vertices.push(new THREE.Vector3(.5,-.5,-.5)),i.vertices.push(new THREE.Vector3(.5,.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,-.5,-.5)),i.vertices.push(new THREE.Vector3(-.5,.5,-.5)),this.dimension=new THREE.Vector3(1,1,1);var o=new THREE.MeshBasicMaterial({color:65280,transparent:!0,opacity:.3});this.box=new THREE.Mesh(t,o),this.box.geometry.computeBoundingBox(),this.boundingBox=this.box.geometry.boundingBox,this.add(this.box),this.frame=new THREE.Line(i,new THREE.LineBasicMaterial({color:0})),this.frame.mode=THREE.LinePieces,this.add(this.frame),this.label=new Potree.TextSprite("0"),this.label.setBorderColor({r:0,g:255,b:0,a:0}),this.label.setBackgroundColor({r:0,g:255,b:0,a:0}),this.label.material.depthTest=!1,this.label.position.y-=.5,this.add(this.label);var n=this;this.label.updateMatrixWorld=function(){var e=new THREE.Vector3;e.setFromMatrixPosition(n.matrixWorld),n.label.position.copy(e),n.label.updateMatrix(),n.label.matrixWorld.copy(n.label.matrix),n.label.matrixWorldNeedsUpdate=!1;for(var t=0,i=n.label.children.length;i>t;t++)n.label.children[t].updateMatrixWorld(!0)},this.setDimension=function(e,t,i){this.dimension.set(e,t,i),this.box.scale.set(e,t,i),this.frame.scale.set(e,t,i)},this.volume=function(){return Math.abs(this.scale.x*this.scale.y*this.scale.z)},this.update=function(){this.boundingBox=this.box.geometry.boundingBox,this._clip?(this.box.visible=!1,this.label.visible=!1):(this.box.visible=!0,this.label.visible=!0)},this.raycast=function(e,t){var i=[];if(this.box.raycast(e,i),i.length>0){var o=i[0];t.push({distance:o.distance,object:this,point:o.point.clone()})}},this.update()},Potree.Volume.prototype=Object.create(THREE.Object3D.prototype),Object.defineProperty(Potree.Volume.prototype,"clip",{get:function(){return this._clip},set:function(e){this._clip=e,this.update()}}),Object.defineProperty(Potree.Volume.prototype,"modifiable",{get:function(){return this._modifiable},set:function(e){this._modifiable=e,this.update()}}),Potree.VolumeTool=function(e,t,i){function o(e){var t=d.domElement.getBoundingClientRect();d.mouse.x=(e.clientX-t.left)/d.domElement.clientWidth*2-1,d.mouse.y=2*-((e.clientY-t.top)/d.domElement.clientHeight)+1}function n(e){}function r(e){if(u!==c.DEFAULT&&e.stopImmediatePropagation(),u===c.INSERT_VOLUME)d.finishInsertion();else if(1===e.which){var t=s();t&&t.object.modifiable&&transformationTool.setTargets([t.object])}3===e.which}function a(e){return e.preventDefault(),!1}function s(){var e=new THREE.Vector3(d.mouse.x,d.mouse.y,.5);e.unproject(d.camera);var t=new THREE.Raycaster;t.ray.set(d.camera.position,e.sub(d.camera.position).normalize());for(var i=[],o=0;o<d.volumes.length;o++){var n=d.volumes[o];i.push(n)}var r=t.intersectObjects(i,!1);return r.length>0?r[0]:!1}function l(){var e=new THREE.Vector3(d.mouse.x,d.mouse.y,.5);e.unproject(d.camera);var t=e.sub(d.camera.position).normalize(),i=new THREE.Ray(d.camera.position,t),o=[];d.scene.traverse(function(e){(e instanceof Potree.PointCloudOctree||e instanceof Potree.PointCloudArena4D)&&o.push(e)});for(var n=null,r=null,a=0;a<o.length;a++){var s=o[a],l=s.pick(d.renderer,d.camera,i);if(l){var c=d.camera.position.distanceTo(l.position);(!n||r>c)&&(n=l,r=c)}}return n?n.position:null}var d=this;this.enabled=!1,this.scene=e,this.sceneVolume=new THREE.Scene,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0},this.volumes=[];var c={DEFAULT:0,INSERT_VOLUME:1},u=c.DEFAULT;this.update=function(e){if(u===c.INSERT_VOLUME){var t=l();if(t){this.activeVolume.position.copy(t);var o=this.activeVolume.getWorldPosition().applyMatrix4(this.camera.matrixWorldInverse),n=(new THREE.Vector4(o.x,o.y,o.z).applyMatrix4(this.camera.projectionMatrix),Math.abs(o.z/10));this.activeVolume.scale.set(n,n,n)}}for(var r=[],a=0;a<this.volumes.length;a++)r.push(this.volumes[a]);this.activeVolume&&r.push(this.activeVolume);for(var a=0;a<r.length;a++){var s=r[a],h=(s.box,s.label),p=s.volume(),m=Potree.utils.addCommas(p.toFixed(1))+"³";h.setText(m);var f=d.camera.position.distanceTo(h.getWorldPosition()),v=projectedRadius(1,d.camera.fov*Math.PI/180,f,i.domElement.clientHeight),g=70/v;h.scale.set(g,g,g)}},this.startInsertion=function(e){u=c.INSERT_VOLUME;var e=e||{},t=e.clip||!1;this.activeVolume=new Potree.Volume,this.activeVolume.clip=t,this.sceneVolume.add(this.activeVolume),this.volumes.push(this.activeVolume)},this.finishInsertion=function(){transformationTool.setTargets([this.activeVolume]);var e={type:"insertion_finished",volume:this.activeVolume};this.dispatchEvent(e),this.activeVolume=null,u=c.DEFAULT},this.addVolume=function(e){this.sceneVolume.add(e),this.volumes.push(e)},this.removeVolume=function(e){this.sceneVolume.remove(e);var t=this.volumes.indexOf(e);t>=0&&this.volumes.splice(t,1)},this.reset=function(){for(var e=this.volumes.length-1;e>=0;e--){var t=this.volumes[e];this.removeVolume(t)}},this.render=function(){i.render(this.sceneVolume,this.camera)},this.domElement.addEventListener("click",n,!1),this.domElement.addEventListener("mousedown",r,!1),this.domElement.addEventListener("mousemove",o,!1),this.domElement.addEventListener("contextmenu",a,!1)},Potree.VolumeTool.prototype=Object.create(THREE.EventDispatcher.prototype),Potree.PointCloudArena4DProxyNode=function(e){THREE.Object3D.call(this),this.geometryNode=e,this.pcoGeometry=e,this.boundingBox=e.boundingBox,this.boundingSphere=e.boundingSphere,this.number=e.name,this.numPoints=e.numPoints,this.level=e.level},Potree.PointCloudArena4DProxyNode.prototype=Object.create(THREE.Object3D.prototype),Potree.PointCloudArena4D=function(e){THREE.Object3D.call(this),this.root=null,this.visiblePointsTarget=2e6,this.minimumNodePixelSize=150,this.position.sub(e.offset),this.updateMatrix(),this.numVisibleNodes=0,this.numVisiblePoints=0,this.boundingBoxNodes=[],this.loadQueue=[],this.visibleNodes=[],this.pcoGeometry=e,this.boundingBox=this.pcoGeometry.boundingBox,this.boundingSphere=this.pcoGeometry.boundingSphere,this.material=new Potree.PointCloudMaterial({vertexColors:THREE.VertexColors,size:.05,treeType:Potree.TreeType.KDTREE}),this.material.sizeType=Potree.PointSizeType.ATTENUATED,this.material.size=.05,this.pickTarget,this.pickMaterial,this.updateMatrixWorld()},Potree.PointCloudArena4D.prototype=Object.create(THREE.Object3D.prototype),Potree.PointCloudArena4D.prototype.updateMaterial=function(e,t){this.material.fov=e.fov*(Math.PI/180),this.material.screenWidth=t.domElement.clientWidth,this.material.screenHeight=t.domElement.clientHeight,this.material.spacing=this.pcoGeometry.spacing,this.material.near=e.near,this.material.far=e.far,this.maxLevel>this.material.levels&&(this.material.levels=this.maxLevel+2),this.material.minSize=3;var i=this.boundingBox.size();this.material.bbSize=[i.x,i.y,i.z]},Potree.PointCloudArena4D.prototype.hideDescendants=function(e){for(var t=[],i=0;i<e.children.length;i++){var o=e.children[i];o.visible&&t.push(o)}for(;t.length>0;){var e=t.shift();e.visible=!1,e.boundingBoxNode&&(e.boundingBoxNode.visible=!1);for(var i=0;i<e.children.length;i++){var o=e.children[i];o.visible&&t.push(o)}}},Potree.PointCloudArena4D.prototype.updateMatrixWorld=function(e){this.matrixAutoUpdate===!0&&this.updateMatrix(),(this.matrixWorldNeedsUpdate===!0||e===!0)&&(void 0===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0)};var dbgFullyInside=0;Potree.PointCloudArena4D.prototype.update=function(e,t){var i=this.pcoGeometry;if(i.root){if(!this.rootProxyGenerated){var o=new Potree.PointCloudArena4DProxyNode(this.pcoGeometry.root);this.add(o),this.rootProxyGenerated=!0}if(this.updateMatrixWorld(!0),this.loadQueue=[],this.visibleNodes=[],this.numVisibleNodes=0,this.numVisiblePoints=0,dbgFullyInside=0,!this.showBoundingBox)for(var n=0;n<this.boundingBoxNodes.length;n++){var r=this.boundingBoxNodes[n];this.remove(r),r.geometry.dispose()}this.updateMaterial(e,t),this.hideDescendants(this.children[0]),e.updateMatrixWorld();var a=new THREE.Frustum,s=e.matrixWorldInverse,l=this.matrixWorld,d=e.projectionMatrix,c=(new THREE.Matrix4).multiply(d).multiply(s).multiply(l);a.setFromMatrix(c);var u=e.matrixWorld,h=(new THREE.Matrix4).getInverse(l),p=(new THREE.Matrix4).multiply(h).multiply(u),m=(new THREE.Vector3).setFromMatrixPosition(p),f=[];for(f.push({node:this.children[0],weight:1});f.length>0;){var v=f.shift(),g=v.node,E=v.weight;g.matrixWorld.multiplyMatrices(this.matrixWorld,g.matrix);var y=g.boundingBox.clone(),b=a.intersectsBox(y),T=b;if(g.visible=T,T){var P=0;if(8===P&&dbgFullyInside++,g instanceof Potree.PointCloudArena4DProxyNode){var R=g.geometryNode;R.loaded===!0?this.replaceProxy(g):this.loadQueue.push(v)}else if(g instanceof THREE.PointCloud){if(this.numVisiblePoints+g.pcoGeometry.numPoints>pointcloud.visiblePointsTarget)break;if(this.numVisibleNodes++,this.numVisiblePoints+=g.pcoGeometry.numPoints,this.visibleNodes.push({node:g,weight:E}),this.showBoundingBox&&!g.boundingBoxNode){var C=new THREE.BoxHelper(g);this.add(C),this.boundingBoxNodes.push(C),g.boundingBoxNode=C,g.boundingBoxNode.matrixWorld.copy(g.matrixWorld)}else this.showBoundingBox&&g.boundingBoxNode?g.boundingBoxNode.visible=!0:this.showBoundingBox||delete g.boundingBoxNode;for(var n=0;n<g.children.length;n++){var x=g.children[n],w=x.boundingSphere,H=w.center.distanceTo(m),S=y.size().length()/2,B=e.fov/2*Math.PI/180,V=1/Math.tan(B)*S/Math.sqrt(H*H-S*S);S>H&&(V=Number.MAX_VALUE);var A=t.domElement.clientHeight*V;if(!(A<this.minimumNodePixelSize)){var E=V;if(0===f.length)f.push({node:x,weight:E});else{for(var M=0,I=0;I<f.length;I++){if(E>f[I].weight){var M=I;break}if(I==f.length-1){M=f.length;break}}f.splice(M,0,{node:x,weight:E})}}}}}}this.updateLoadQueue(),this.maxLevel=0;for(var n=0;n<this.visibleNodes.length;n++)this.maxLevel=Math.max(this.visibleNodes[n].node.pcoGeometry.level,this.maxLevel);for(var L=[],n=0;n<this.visibleNodes.length;n++)L.push(this.visibleNodes[n].node);this.updateVisibilityTexture(this.material,L)}},Potree.PointCloudArena4D.prototype.replaceProxy=function(e){var t=e.geometryNode;if(t.loaded===!0){var i=t.geometry,o=new THREE.PointCloud(i,this.material);o.number=e.number,o.numPoints=e.numPoints,o.boundingBox=t.boundingBox,o.boundingSphere=t.boundingSphere,o.pcoGeometry=t;var n=e.parent;if(n.remove(e),n.add(o),o.updateMatrix(),o.matrixWorld.multiplyMatrices(this.matrixWorld,o.matrix),t.left){var r=t.left,a=new Potree.PointCloudArena4DProxyNode(r);o.add(a)}if(t.right){var r=t.right,a=new Potree.PointCloudArena4DProxyNode(r);o.add(a)}return o}},Potree.PointCloudArena4D.prototype.updateLoadQueue=function(e){if(this.loadQueue.length>0){this.loadQueue.length>=2&&this.loadQueue.sort(function(e,t){return t.weight-e.weight});for(var t=0;t<Math.min(5,this.loadQueue.length);t++)this.loadQueue[t].node.geometryNode.load()}},Potree.PointCloudArena4D.prototype.getVisibleGeometry=function(e){var t=[];e.updateMatrixWorld();var i=new THREE.Frustum,o=e.matrixWorldInverse,n=this.matrixWorld,r=e.projectionMatrix,a=(new THREE.Matrix4).multiply(r).multiply(o).multiply(n);i.setFromMatrix(a);var s=[],l=0;for(s.push(this.pcoGeometry.root);s.length>0&&!(t.length>12);){var d=s.shift(),c=d.boundingBox.clone();c.max.sub(c.min),c.min.sub(c.min);var u=i.intersectsBox(c),h=u;if(h){if(l+d.numPoints>this.visiblePointsTarget)break;l+=d.numPoints,t.push(d),d.loaded&&(d.left&&s.push(d.left),d.right&&s.push(d.right))}}return t},Potree.PointCloudArena4D.prototype.nodesOnRay=function(e,t){for(var i=[],o=t.clone(),n=0;n<e.length;n++){var r=e[n].node,a=(r.boundingSphere.clone().applyMatrix4(r.matrixWorld),r.boundingBox.clone().applyMatrix4(r.matrixWorld));o.isIntersectionBox(a)&&i.push(r)}return i},Potree.PointCloudArena4D.prototype.pick=function(e,t,i,o){var o=o||{},n=o.pickWindowSize||17,r=this.nodesOnRay(this.visibleNodes,i);if(0===r.length)return null;var a=Math.ceil(e.domElement.clientWidth),s=Math.ceil(e.domElement.clientHeight),l=(new THREE.Vector3).addVectors(t.position,i.direction).project(t);l.addScalar(1).multiplyScalar(.5),l.x*=a,l.y*=s,this.pickTarget?(this.pickTarget.width!=a||this.pickTarget.height!=s)&&(this.pickTarget.dispose(),this.pickTarget=new THREE.WebGLRenderTarget(1,1,{minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat})):this.pickTarget=new THREE.WebGLRenderTarget(1,1,{minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat}),this.pickTarget.setSize(a,s),this.pickMaterial||(this.pickMaterial=new Potree.PointCloudMaterial({treeType:Potree.TreeType.KDTREE}),this.pickMaterial.pointColorType=Potree.PointColorType.POINT_INDEX,this.pickMaterial.pointSizeType=Potree.PointSizeType.FIXED),this.pickMaterial.pointSizeType=this.material.pointSizeType,this.pickMaterial.size=this.material.size,this.pickMaterial.pointSizeType===Potree.PointSizeType.ADAPTIVE&&this.updateVisibilityTexture(this.pickMaterial,r),this.pickMaterial.fov=this.material.fov,this.pickMaterial.screenWidth=this.material.screenWidth,this.pickMaterial.screenHeight=this.material.screenHeight,this.pickMaterial.spacing=this.material.spacing,this.pickMaterial.near=this.material.near,this.pickMaterial.far=this.material.far,this.pickMaterial.levels=this.material.levels,this.pickMaterial.pointShape=this.material.pointShape;var d=e.context;d.enable(d.SCISSOR_TEST),d.scissor(l.x-(n-1)/2,l.y-(n-1)/2,n,n),d.disable(d.SCISSOR_TEST);var c=this.pickMaterial;e.setRenderTarget(this.pickTarget),e.state.setDepthTest(c.depthTest),e.state.setDepthWrite(c.depthWrite),e.state.setBlending(THREE.NoBlending),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),r.length>0&&r.push(r[0]);for(var u=0;u<r.length;u++){var h=r[u],p=h.geometry;if(p.attributes.indices.buffer){if(c.pcIndex=u,c.program){var m=c.program.program;d.useProgram(m);var f=d.getAttribLocation(m,"indices"),v=4;d.bindBuffer(d.ARRAY_BUFFER,p.attributes.indices.buffer),d.enableVertexAttribArray(f),
d.vertexAttribPointer(f,v,d.UNSIGNED_BYTE,!0,0,0),d.uniform1f(c.program.uniforms.pcIndex,c.pcIndex)}e.renderBufferDirect(t,[],null,c,p,h)}}var n=17,g=n*n,E=new ArrayBuffer(4*g),y=new Uint8Array(E),b=new Uint32Array(E);e.context.readPixels(l.x-(n-1)/2,l.y-(n-1)/2,n,n,e.context.RGBA,e.context.UNSIGNED_BYTE,y);for(var T=Number.MAX_VALUE,P=null,R=0;n>R;R++)for(var C=0;n>C;C++){var x=R+C*n,w=Math.pow(R-(n-1)/2,2)+Math.pow(C-(n-1)/2,2),H=y[4*x+3];y[4*x+3]=0;var S=b[x];(0!==S||0!==H)&&T>w&&(P={pIndex:S,pcIndex:H},T=w)}if(P){var B={},V=r[P.pcIndex],A=V.geometry.attributes;for(var M in A)if(A.hasOwnProperty(M)){var I=p.attributes[M];if("position"===M){var L=V.geometry.attributes.position.array,W=L[3*P.pIndex+0],N=L[3*P.pIndex+1],G=L[3*P.pIndex+2],X=new THREE.Vector3(W,N,G);X.applyMatrix4(this.matrixWorld),B[M]=X}else if("indices"===M);else if(1===I.itemSize)B[M]=I.array[u+O];else{for(var D=[],O=0;O<I.itemSize;O++)D.push(I.array[u*I.itemSize+O]);B[M]=D}}return B}return null},Potree.PointCloudArena4D.prototype.updateVisibilityTexture=function(e,t){if(e){var i=e.visibleNodesTexture,o=i.image.data;t=t.slice();var n=function(e,t){var i=e.pcoGeometry.level,o=t.pcoGeometry.level,n=e.pcoGeometry.number,r=t.pcoGeometry.number;return i!=o?i-o:r>n?-1:n>r?1:0};t.sort(n);for(var r=[],a=0;a<t.length;a++)r.push(t[a].pcoGeometry.number);for(var a=0;a<t.length;a++){var s=t[a],l=0,d=0,c=0;s.pcoGeometry.left&&r.indexOf(s.pcoGeometry.left.number)>0&&(l+=1,d=r.indexOf(s.pcoGeometry.left.number)-a),s.pcoGeometry.right&&r.indexOf(s.pcoGeometry.right.number)>0&&(l+=2,d=0===d?r.indexOf(s.pcoGeometry.right.number)-a:d),"X"===s.pcoGeometry.split?c=1:"Y"===s.pcoGeometry.split?c=2:"Z"===s.pcoGeometry.split&&(c=4),o[3*a+0]=l,o[3*a+1]=d,o[3*a+2]=c}i.needsUpdate=!0}},Object.defineProperty(Potree.PointCloudArena4D.prototype,"progress",{get:function(){return this.pcoGeometry.root?Potree.PointCloudArena4DGeometryNode.nodesLoading>0?0:1:0}}),Potree.PointCloudArena4DGeometryNode=function(){this.left=null,this.right=null,this.boundingBox=null,this.number=null,this.pcoGeometry=null,this.loaded=!1,this.numPoints=0,this.level=0},Potree.PointCloudArena4DGeometryNode.nodesLoading=0,Potree.PointCloudArena4DGeometryNode.prototype.load=function(){if(!(this.loaded||this.loading||Potree.PointCloudArena4DGeometryNode.nodesLoading>=5)){Potree.PointCloudArena4DGeometryNode.nodesLoading++;var e=this.pcoGeometry.url+"?node="+this.number,t=new XMLHttpRequest;t.open("GET",e,!0),t.responseType="arraybuffer";var i=this;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status){for(var e=t.response,o=new DataView(e),n=e.byteLength/17,r=new Float32Array(3*n),a=new Float32Array(3*n),s=new Uint32Array(n),l=0;n>l;l++){var d=o.getFloat32(17*l+0,!0)+i.boundingBox.min.x,c=o.getFloat32(17*l+4,!0)+i.boundingBox.min.y,u=o.getFloat32(17*l+8,!0)+i.boundingBox.min.z,h=o.getUint8(17*l+12,!0)/256,p=o.getUint8(17*l+13,!0)/256,m=o.getUint8(17*l+14,!0)/256;r[3*l+0]=d,r[3*l+1]=c,r[3*l+2]=u,a[3*l+0]=h,a[3*l+1]=p,a[3*l+2]=m,s[l]=l}var f=new THREE.BufferGeometry;f.addAttribute("position",new THREE.BufferAttribute(r,3)),f.addAttribute("color",new THREE.BufferAttribute(a,3)),f.addAttribute("indices",new THREE.BufferAttribute(s,1)),f.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(3*n),3)),i.geometry=f,i.loaded=!0,Potree.PointCloudArena4DGeometryNode.nodesLoading--,f.boundingBox=i.boundingBox,f.boundingSphere=i.boundingSphere,i.numPoints=n}},t.send(null)}},Potree.PointCloudArena4DGeometry=function(){this.numPoints=0,this.version=0,this.boundingBox=null,this.numNodes=0,this.name=null,this.provider=null,this.url=null,this.root=null,this.levels=0,this._spacing=null,this.pointAttributes=new Potree.PointAttributes(["POSITION_CARTESIAN","COLOR_PACKED"])},Potree.PointCloudArena4DGeometry.load=function(e,t){var i=new XMLHttpRequest;i.open("GET",e+"?info",!0),i.onreadystatechange=function(){try{if(4===i.readyState&&200===i.status){var o=JSON.parse(i.responseText),n=new Potree.PointCloudArena4DGeometry;n.url=e,n.name=o.Name,n.provider=o.Provider,n.numNodes=o.Nodes,n.numPoints=o.Points,n.version=o.Version,n.boundingBox=new THREE.Box3((new THREE.Vector3).fromArray(o.BoundingBox.slice(0,3)),(new THREE.Vector3).fromArray(o.BoundingBox.slice(3,6))),o.Spacing&&(n.spacing=o.Spacing);var r=n.boundingBox.min.clone().multiplyScalar(-1);n.boundingBox.min.add(r),n.boundingBox.max.add(r),n.offset=r;var a=n.boundingBox.center(),s=n.boundingBox.size().length()/2;n.boundingSphere=new THREE.Sphere(a,s),n.loadHierarchy(),t(n)}else 4===i.readyState&&t(null)}catch(l){t(null)}},i.send(null)},Potree.PointCloudArena4DGeometry.prototype.loadHierarchy=function(){var e=this.url+"?tree",t=new XMLHttpRequest;t.open("GET",e,!0),t.responseType="arraybuffer";var i=this;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status){for(var e=t.response,o=e.byteLength/3,n=new DataView(e),r=[],a=null,s=0,l=((new Date).getTime(),0);o>l;l++){var d=n.getUint8(3*l+0,!0),c=(n.getUint16(3*l+1,!0),(1&d)>0),u=(2&d)>0,h=(4&d)>0,p=(8&d)>0,m=(16&d)>0,f=null;h?f="X":p&&(f="Y"),m&&(f="Z");var v=new Potree.PointCloudArena4DGeometryNode;if(v.hasLeft=c,v.hasRight=u,v.split=f,v.isLeaf=!c&&!u,v.number=l,v.left=null,v.right=null,v.pcoGeometry=i,v.level=r.length,s=Math.max(s,v.level),r.length>0){var g=r[r.length-1];v.boundingBox=g.boundingBox.clone();var E=g.boundingBox.size();if(g.hasLeft&&!g.left){g.left=v,"X"===g.split?v.boundingBox.max.x=v.boundingBox.min.x+E.x/2:"Y"===g.split?v.boundingBox.max.y=v.boundingBox.min.y+E.y/2:"Z"===g.split&&(v.boundingBox.max.z=v.boundingBox.min.z+E.z/2);var y=v.boundingBox.center(),b=v.boundingBox.size().length()/2;v.boundingSphere=new THREE.Sphere(y,b)}else{g.right=v,"X"===g.split?v.boundingBox.min.x=v.boundingBox.min.x+E.x/2:"Y"===g.split?v.boundingBox.min.y=v.boundingBox.min.y+E.y/2:"Z"===g.split&&(v.boundingBox.min.z=v.boundingBox.min.z+E.z/2);var y=v.boundingBox.center(),b=v.boundingBox.size().length()/2;v.boundingSphere=new THREE.Sphere(y,b)}}else{a=v,a.boundingBox=i.boundingBox.clone();var y=a.boundingBox.center(),b=a.boundingBox.size().length()/2;a.boundingSphere=new THREE.Sphere(y,b)}var T=v.boundingBox.size();if(v.spacing=(T.x+T.y+T.z)/3/75,r.push(v),v.isLeaf)for(var P=!1;!P&&r.length>0;){r.pop();var R=r[r.length-1];P=r.length>0&&R.hasRight&&null==R.right}}(new Date).getTime();i.root=a,i.levels=s}},t.send(null)},Object.defineProperty(Potree.PointCloudArena4DGeometry.prototype,"spacing",{get:function(){return this._spacing?this._spacing:this.root?this.root.spacing:void 0},set:function(e){this._spacing=e}});