Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

three-pathfinding

Package Overview
Dependencies
Maintainers
1
Versions
30
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

three-pathfinding - npm Package Compare versions

Comparing version 0.11.1 to 0.12.0

2

dist/three-pathfinding.js

@@ -1,2 +0,2 @@

var e=function(){};e.roundNumber=function(e,t){var r=Math.pow(10,t);return Math.round(e*r)/r},e.sample=function(e){return e[Math.floor(Math.random()*e.length)]},e.distanceToSquared=function(e,t){var r=e.x-t.x,n=e.y-t.y,o=e.z-t.z;return r*r+n*n+o*o},e.isPointInPoly=function(e,t){for(var r=!1,n=-1,o=e.length,i=o-1;++n<o;i=n)(e[n].z<=t.z&&t.z<e[i].z||e[i].z<=t.z&&t.z<e[n].z)&&t.x<(e[i].x-e[n].x)*(t.z-e[n].z)/(e[i].z-e[n].z)+e[n].x&&(r=!r);return r},e.isVectorInPolygon=function(e,t,r){var n=1e5,o=-1e5,i=[];return t.vertexIds.forEach(function(e){n=Math.min(r[e].y,n),o=Math.max(r[e].y,o),i.push(r[e])}),!!(e.y<o+.5&&e.y>n-.5&&this.isPointInPoly(i,e))},e.triarea2=function(e,t,r){return(r.x-e.x)*(t.z-e.z)-(t.x-e.x)*(r.z-e.z)},e.vequal=function(e,t){return this.distanceToSquared(e,t)<1e-5};var t=function(e){this.content=[],this.scoreFunction=e};t.prototype.push=function(e){this.content.push(e),this.sinkDown(this.content.length-1)},t.prototype.pop=function(){var e=this.content[0],t=this.content.pop();return this.content.length>0&&(this.content[0]=t,this.bubbleUp(0)),e},t.prototype.remove=function(e){var t=this.content.indexOf(e),r=this.content.pop();t!==this.content.length-1&&(this.content[t]=r,this.scoreFunction(r)<this.scoreFunction(e)?this.sinkDown(t):this.bubbleUp(t))},t.prototype.size=function(){return this.content.length},t.prototype.rescoreElement=function(e){this.sinkDown(this.content.indexOf(e))},t.prototype.sinkDown=function(e){for(var t=this.content[e];e>0;){var r=(e+1>>1)-1,n=this.content[r];if(!(this.scoreFunction(t)<this.scoreFunction(n)))break;this.content[r]=t,this.content[e]=n,e=r}},t.prototype.bubbleUp=function(e){for(var t=this.content.length,r=this.content[e],n=this.scoreFunction(r);;){var o=e+1<<1,i=o-1,s=null,a=void 0;if(i<t)(a=this.scoreFunction(this.content[i]))<n&&(s=i);if(o<t)this.scoreFunction(this.content[o])<(null===s?n:a)&&(s=o);if(null===s)break;this.content[e]=this.content[s],this.content[s]=r,e=s}};var r=function(){};r.init=function(e){for(var t=0;t<e.length;t++){var r=e[t];r.f=0,r.g=0,r.h=0,r.cost=1,r.visited=!1,r.closed=!1,r.parent=null}},r.cleanUp=function(e){for(var t=0;t<e.length;t++){var r=e[t];delete r.f,delete r.g,delete r.h,delete r.cost,delete r.visited,delete r.closed,delete r.parent}},r.heap=function(){return new t(function(e){return e.f})},r.search=function(e,t,r){this.init(e);var n=this.heap();for(n.push(t);n.size()>0;){var o=n.pop();if(o===r){for(var i=o,s=[];i.parent;)s.push(i),i=i.parent;return this.cleanUp(s),s.reverse()}o.closed=!0;for(var a=this.neighbours(e,o),h=0,c=a.length;h<c;h++){var u=a[h];if(!u.closed){var p=o.g+u.cost,l=u.visited;if(!l||p<u.g){if(u.visited=!0,u.parent=o,!u.centroid||!r.centroid)throw new Error("Unexpected state");u.h=u.h||this.heuristic(u.centroid,r.centroid),u.g=p,u.f=u.g+u.h,l?n.rescoreElement(u):n.push(u)}}}}return[]},r.heuristic=function(t,r){return e.distanceToSquared(t,r)},r.neighbours=function(e,t){for(var r=[],n=0;n<t.neighbours.length;n++)r.push(e[t.neighbours[n]]);return r};var n=function(){};n.buildZone=function(t){var r=this,n=this._buildNavigationMesh(t),o={};n.vertices.forEach(function(t){t.x=e.roundNumber(t.x,2),t.y=e.roundNumber(t.y,2),t.z=e.roundNumber(t.z,2)}),o.vertices=n.vertices;var i=this._buildPolygonGroups(n);return o.groups=new Array(i.length),i.forEach(function(t,n){var i=new Map;t.forEach(function(e,t){i.set(e,t)});var s=new Array(t.length);t.forEach(function(t,n){var a=[];t.neighbours.forEach(function(e){return a.push(i.get(e))});var h=[];t.neighbours.forEach(function(e){return h.push(r._getSharedVerticesInOrder(t,e))});var c=new THREE.Vector3(0,0,0);c.add(o.vertices[t.vertexIds[0]]),c.add(o.vertices[t.vertexIds[1]]),c.add(o.vertices[t.vertexIds[2]]),c.divideScalar(3),c.x=e.roundNumber(c.x,2),c.y=e.roundNumber(c.y,2),c.z=e.roundNumber(c.z,2),s[n]={id:n,neighbours:a,vertexIds:t.vertexIds,centroid:c,portals:h}}),o.groups[n]=s}),o},n._buildNavigationMesh=function(e){return e.mergeVertices(),this._buildPolygonsFromGeometry(e)},n._buildPolygonGroups=function(e){var t=[],r=function(e){e.neighbours.forEach(function(t){void 0===t.group&&(t.group=e.group,r(t))})};return e.polygons.forEach(function(e){void 0!==e.group?t[e.group].push(e):(e.group=t.length,r(e),t.push([e]))}),t},n._buildPolygonNeighbours=function(e,t){var r=new Set,n=t[e.vertexIds[1]],o=t[e.vertexIds[2]];return t[e.vertexIds[0]].forEach(function(t){t!==e&&(n.includes(t)||o.includes(t))&&r.add(t)}),n.forEach(function(t){t!==e&&o.includes(t)&&r.add(t)}),r},n._buildPolygonsFromGeometry=function(e){for(var t=this,r=[],n=e.vertices,o=new Array(n.length),i=0;i<n.length;i++)o[i]=[];return e.faces.forEach(function(e){var t={vertexIds:[e.a,e.b,e.c],neighbours:null};r.push(t),o[e.a].push(t),o[e.b].push(t),o[e.c].push(t)}),r.forEach(function(e){e.neighbours=t._buildPolygonNeighbours(e,o)}),{polygons:r,vertices:n}},n._getSharedVerticesInOrder=function(e,t){var r=e.vertexIds,n=r[0],o=r[1],i=r[2],s=t.vertexIds,a=s.includes(n),h=s.includes(o),c=s.includes(i);return a&&h&&c?Array.from(r):a&&h?[n,o]:h&&c?[o,i]:a&&c?[i,n]:(console.warn("Error processing navigation mesh neighbors; neighbors with <2 shared vertices found."),[])};var o=function(){this.portals=[]};o.prototype.push=function(e,t){void 0===t&&(t=e),this.portals.push({left:e,right:t})},o.prototype.stringPull=function(){var t,r,n,o=this.portals,i=[],s=0,a=0,h=0;r=o[0].left,n=o[0].right,i.push(t=o[0].left);for(var c=1;c<o.length;c++){var u=o[c].left,p=o[c].right;if(e.triarea2(t,n,p)<=0){if(!(e.vequal(t,n)||e.triarea2(t,r,p)>0)){i.push(r),r=t=r,n=t,a=s=a,h=s,c=s;continue}n=p,h=c}if(e.triarea2(t,r,u)>=0){if(!(e.vequal(t,r)||e.triarea2(t,n,u)<0)){i.push(n),r=t=n,n=t,a=s=h,h=s,c=s;continue}r=u,a=c}}return 0!==i.length&&e.vequal(i[i.length-1],o[o.length-1].left)||i.push(o[o.length-1].left),this.path=i,i};var i,s=function(){this.zones={}};s.createZone=function(e){return e.isGeometry?console.warn("[three-pathfinding]: Use THREE.BufferGeometry, not THREE.Geometry, to create zone."):e=(new THREE.Geometry).fromBufferGeometry(e),n.buildZone(e)},s.prototype.setZoneData=function(e,t){this.zones[e]=t},s.prototype.getRandomNode=function(t,r,n,o){if(!this.zones[t])return new THREE.Vector3;n=n||null,o=o||0;var i=[];return this.zones[t].groups[r].forEach(function(t){n&&o?e.distanceToSquared(n,t.centroid)<o*o&&i.push(t.centroid):i.push(t.centroid)}),e.sample(i)||new THREE.Vector3},s.prototype.getClosestNode=function(t,r,n,o){void 0===o&&(o=!1);var i=this.zones[r].vertices,s=null,a=Infinity;return this.zones[r].groups[n].forEach(function(r){var n=e.distanceToSquared(r.centroid,t);n<a&&(!o||e.isVectorInPolygon(t,r,i))&&(s=r,a=n)}),s},s.prototype.findPath=function(e,t,n,i){var s=this.zones[n].groups[i],a=this.zones[n].vertices,h=this.getClosestNode(e,n,i,!0),c=this.getClosestNode(t,n,i,!0);if(!h||!c)return null;var u=r.search(s,h,c),p=function(e,t){for(var r=0;r<e.neighbours.length;r++)if(e.neighbours[r]===t.id)return e.portals[r]},l=new o;l.push(e);for(var f=0;f<u.length;f++){var d=u[f+1];if(d){var v=p(u[f],d);l.push(a[v[0]],a[v[1]])}}l.push(t),l.stringPull();var E=l.path.map(function(e){return new THREE.Vector3(e.x,e.y,e.z)});return E.shift(),E},s.prototype.getGroup=(i=new THREE.Plane,function(t,r,n){if(void 0===n&&(n=!1),!this.zones[t])return null;for(var o=null,s=Math.pow(50,2),a=this.zones[t],h=0;h<a.groups.length;h++)for(var c=0,u=a.groups[h];c<u.length;c+=1){var p=u[c];if(n&&(i.setFromCoplanarPoints(a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]),Math.abs(i.distanceToPoint(r))<.01&&e.isPointInPoly([a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]],r)))return h;var l=e.distanceToSquared(p.centroid,r);l<s&&(o=h,s=l)}return o}),s.prototype.clampStep=function(){var e,t,r=new THREE.Vector3,n=new THREE.Plane,o=new THREE.Triangle,i=new THREE.Vector3,s=new THREE.Vector3;return function(a,h,c,u,p,l){var f=this.zones[u].vertices,d=this.zones[u].groups[p],v=[c],E={};E[c.id]=0,e=void 0,s.set(0,0,0),t=Infinity,n.setFromCoplanarPoints(f[c.vertexIds[0]],f[c.vertexIds[1]],f[c.vertexIds[2]]),n.projectPoint(h,r),i.copy(r);for(var g=v.pop();g;g=v.pop()){o.set(f[g.vertexIds[0]],f[g.vertexIds[1]],f[g.vertexIds[2]]),o.closestPointToPoint(i,r),r.distanceToSquared(i)<t&&(e=g,s.copy(r),t=r.distanceToSquared(i));var y=E[g.id];if(!(y>2))for(var T=0;T<g.neighbours.length;T++){var M=d[g.neighbours[T]];M.id in E||(v.push(M),E[M.id]=y+1)}}return l.copy(s),e}}();var a={PLAYER:new THREE.Color(15631215).convertGammaToLinear(2.2).getHex(),TARGET:new THREE.Color(14469912).convertGammaToLinear(2.2).getHex(),PATH:new THREE.Color(41903).convertGammaToLinear(2.2).getHex(),WAYPOINT:new THREE.Color(41903).convertGammaToLinear(2.2).getHex(),CLAMPED_STEP:new THREE.Color(14472114).convertGammaToLinear(2.2).getHex(),CLOSEST_NODE:new THREE.Color(4417387).convertGammaToLinear(2.2).getHex()},h=function(e){function t(){var t=this;e.call(this),this._playerMarker=new THREE.Mesh(new THREE.SphereGeometry(.25,32,32),new THREE.MeshBasicMaterial({color:a.PLAYER})),this._targetMarker=new THREE.Mesh(new THREE.BoxGeometry(.3,.3,.3),new THREE.MeshBasicMaterial({color:a.TARGET})),this._nodeMarker=new THREE.Mesh(new THREE.BoxGeometry(.1,.8,.1),new THREE.MeshBasicMaterial({color:a.CLOSEST_NODE})),this._stepMarker=new THREE.Mesh(new THREE.BoxGeometry(.1,1,.1),new THREE.MeshBasicMaterial({color:a.CLAMPED_STEP})),this._pathMarker=new THREE.Object3D,this._pathLineMaterial=new THREE.LineBasicMaterial({color:a.PATH,linewidth:2}),this._pathPointMaterial=new THREE.MeshBasicMaterial({color:a.WAYPOINT}),this._pathPointGeometry=new THREE.SphereBufferGeometry(.08),this._markers=[this._playerMarker,this._targetMarker,this._nodeMarker,this._stepMarker,this._pathMarker],this._markers.forEach(function(e){e.visible=!1,t.add(e)})}return e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t,t.prototype.setPath=function(e){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);e=[this._playerMarker.position].concat(e);for(var t=new THREE.Geometry,r=0;r<e.length;r++)t.vertices.push(e[r].clone().add(new THREE.Vector3(0,.2,0)));this._pathMarker.add(new THREE.Line(t,this._pathLineMaterial));for(var n=0;n<e.length-1;n++){var o=new THREE.Mesh(this._pathPointGeometry,this._pathPointMaterial);o.position.copy(e[n]),o.position.y+=.2,this._pathMarker.add(o)}return this._pathMarker.visible=!0,this},t.prototype.setPlayerPosition=function(e){return this._playerMarker.position.copy(e),this._playerMarker.visible=!0,this},t.prototype.setTargetPosition=function(e){return this._targetMarker.position.copy(e),this._targetMarker.visible=!0,this},t.prototype.setNodePosition=function(e){return this._nodeMarker.position.copy(e),this._nodeMarker.visible=!0,this},t.prototype.setStepPosition=function(e){return this._stepMarker.position.copy(e),this._stepMarker.visible=!0,this},t.prototype.reset=function(){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);return this._markers.forEach(function(e){e.visible=!1}),this},t}(THREE.Object3D);exports.Pathfinding=s,exports.PathfindingHelper=h;
var e=require("three"),t=function(){};t.roundNumber=function(e,t){var r=Math.pow(10,t);return Math.round(e*r)/r},t.sample=function(e){return e[Math.floor(Math.random()*e.length)]},t.distanceToSquared=function(e,t){var r=e.x-t.x,n=e.y-t.y,o=e.z-t.z;return r*r+n*n+o*o},t.isPointInPoly=function(e,t){for(var r=!1,n=-1,o=e.length,i=o-1;++n<o;i=n)(e[n].z<=t.z&&t.z<e[i].z||e[i].z<=t.z&&t.z<e[n].z)&&t.x<(e[i].x-e[n].x)*(t.z-e[n].z)/(e[i].z-e[n].z)+e[n].x&&(r=!r);return r},t.isVectorInPolygon=function(e,t,r){var n=1e5,o=-1e5,i=[];return t.vertexIds.forEach(function(e){n=Math.min(r[e].y,n),o=Math.max(r[e].y,o),i.push(r[e])}),!!(e.y<o+.5&&e.y>n-.5&&this.isPointInPoly(i,e))},t.triarea2=function(e,t,r){return(r.x-e.x)*(t.z-e.z)-(t.x-e.x)*(r.z-e.z)},t.vequal=function(e,t){return this.distanceToSquared(e,t)<1e-5};var r=function(e){this.content=[],this.scoreFunction=e};r.prototype.push=function(e){this.content.push(e),this.sinkDown(this.content.length-1)},r.prototype.pop=function(){var e=this.content[0],t=this.content.pop();return this.content.length>0&&(this.content[0]=t,this.bubbleUp(0)),e},r.prototype.remove=function(e){var t=this.content.indexOf(e),r=this.content.pop();t!==this.content.length-1&&(this.content[t]=r,this.scoreFunction(r)<this.scoreFunction(e)?this.sinkDown(t):this.bubbleUp(t))},r.prototype.size=function(){return this.content.length},r.prototype.rescoreElement=function(e){this.sinkDown(this.content.indexOf(e))},r.prototype.sinkDown=function(e){for(var t=this.content[e];e>0;){var r=(e+1>>1)-1,n=this.content[r];if(!(this.scoreFunction(t)<this.scoreFunction(n)))break;this.content[r]=t,this.content[e]=n,e=r}},r.prototype.bubbleUp=function(e){for(var t=this.content.length,r=this.content[e],n=this.scoreFunction(r);;){var o=e+1<<1,i=o-1,s=null,a=void 0;if(i<t&&(a=this.scoreFunction(this.content[i]))<n&&(s=i),o<t&&this.scoreFunction(this.content[o])<(null===s?n:a)&&(s=o),null===s)break;this.content[e]=this.content[s],this.content[s]=r,e=s}};var n=function(){};n.init=function(e){for(var t=0;t<e.length;t++){var r=e[t];r.f=0,r.g=0,r.h=0,r.cost=1,r.visited=!1,r.closed=!1,r.parent=null}},n.cleanUp=function(e){for(var t=0;t<e.length;t++){var r=e[t];delete r.f,delete r.g,delete r.h,delete r.cost,delete r.visited,delete r.closed,delete r.parent}},n.heap=function(){return new r(function(e){return e.f})},n.search=function(e,t,r){this.init(e);var n=this.heap();for(n.push(t);n.size()>0;){var o=n.pop();if(o===r){for(var i=o,s=[];i.parent;)s.push(i),i=i.parent;return this.cleanUp(s),s.reverse()}o.closed=!0;for(var a=this.neighbours(e,o),h=0,c=a.length;h<c;h++){var u=a[h];if(!u.closed){var p=o.g+u.cost,l=u.visited;if(!l||p<u.g){if(u.visited=!0,u.parent=o,!u.centroid||!r.centroid)throw new Error("Unexpected state");u.h=u.h||this.heuristic(u.centroid,r.centroid),u.g=p,u.f=u.g+u.h,l?n.rescoreElement(u):n.push(u)}}}}return[]},n.heuristic=function(e,r){return t.distanceToSquared(e,r)},n.neighbours=function(e,t){for(var r=[],n=0;n<t.neighbours.length;n++)r.push(e[t.neighbours[n]]);return r};var o=function(){};o.buildZone=function(r){var n=this,o=this._buildNavigationMesh(r),i={};o.vertices.forEach(function(e){e.x=t.roundNumber(e.x,2),e.y=t.roundNumber(e.y,2),e.z=t.roundNumber(e.z,2)}),i.vertices=o.vertices;var s=this._buildPolygonGroups(o);return i.groups=new Array(s.length),s.forEach(function(r,o){var s=new Map;r.forEach(function(e,t){s.set(e,t)});var a=new Array(r.length);r.forEach(function(r,o){var h=[];r.neighbours.forEach(function(e){return h.push(s.get(e))});var c=[];r.neighbours.forEach(function(e){return c.push(n._getSharedVerticesInOrder(r,e))});var u=new e.Vector3(0,0,0);u.add(i.vertices[r.vertexIds[0]]),u.add(i.vertices[r.vertexIds[1]]),u.add(i.vertices[r.vertexIds[2]]),u.divideScalar(3),u.x=t.roundNumber(u.x,2),u.y=t.roundNumber(u.y,2),u.z=t.roundNumber(u.z,2),a[o]={id:o,neighbours:h,vertexIds:r.vertexIds,centroid:u,portals:c}}),i.groups[o]=a}),i},o._buildNavigationMesh=function(e){return e.mergeVertices(),this._buildPolygonsFromGeometry(e)},o._buildPolygonGroups=function(e){var t=[],r=function(e){e.neighbours.forEach(function(t){void 0===t.group&&(t.group=e.group,r(t))})};return e.polygons.forEach(function(e){void 0!==e.group?t[e.group].push(e):(e.group=t.length,r(e),t.push([e]))}),t},o._buildPolygonNeighbours=function(e,t){var r=new Set,n=t[e.vertexIds[1]],o=t[e.vertexIds[2]];return t[e.vertexIds[0]].forEach(function(t){t!==e&&(n.includes(t)||o.includes(t))&&r.add(t)}),n.forEach(function(t){t!==e&&o.includes(t)&&r.add(t)}),r},o._buildPolygonsFromGeometry=function(e){for(var t=this,r=[],n=e.vertices,o=new Array(n.length),i=0;i<n.length;i++)o[i]=[];return e.faces.forEach(function(e){var t={vertexIds:[e.a,e.b,e.c],neighbours:null};r.push(t),o[e.a].push(t),o[e.b].push(t),o[e.c].push(t)}),r.forEach(function(e){e.neighbours=t._buildPolygonNeighbours(e,o)}),{polygons:r,vertices:n}},o._getSharedVerticesInOrder=function(e,t){var r=e.vertexIds,n=r[0],o=r[1],i=r[2],s=t.vertexIds,a=s.includes(n),h=s.includes(o),c=s.includes(i);return a&&h&&c?Array.from(r):a&&h?[n,o]:h&&c?[o,i]:a&&c?[i,n]:(console.warn("Error processing navigation mesh neighbors; neighbors with <2 shared vertices found."),[])};var i=function(){this.portals=[]};i.prototype.push=function(e,t){void 0===t&&(t=e),this.portals.push({left:e,right:t})},i.prototype.stringPull=function(){var e,r,n,o=this.portals,i=[],s=0,a=0,h=0;r=o[0].left,n=o[0].right,i.push(e=o[0].left);for(var c=1;c<o.length;c++){var u=o[c].left,p=o[c].right;if(t.triarea2(e,n,p)<=0){if(!(t.vequal(e,n)||t.triarea2(e,r,p)>0)){i.push(r),r=e=r,n=e,a=s=a,h=s,c=s;continue}n=p,h=c}if(t.triarea2(e,r,u)>=0){if(!(t.vequal(e,r)||t.triarea2(e,n,u)<0)){i.push(n),r=e=n,n=e,a=s=h,h=s,c=s;continue}r=u,a=c}}return 0!==i.length&&t.vequal(i[i.length-1],o[o.length-1].left)||i.push(o[o.length-1].left),this.path=i,i};var s,a=function(){this.zones={}};a.createZone=function(t){return t.isGeometry?console.warn("[three-pathfinding]: Use BufferGeometry, not Geometry, to create zone."):t=(new e.Geometry).fromBufferGeometry(t),o.buildZone(t)},a.prototype.setZoneData=function(e,t){this.zones[e]=t},a.prototype.getRandomNode=function(r,n,o,i){if(!this.zones[r])return new e.Vector3;o=o||null,i=i||0;var s=[];return this.zones[r].groups[n].forEach(function(e){o&&i?t.distanceToSquared(o,e.centroid)<i*i&&s.push(e.centroid):s.push(e.centroid)}),t.sample(s)||new e.Vector3},a.prototype.getClosestNode=function(e,r,n,o){void 0===o&&(o=!1);var i=this.zones[r].vertices,s=null,a=Infinity;return this.zones[r].groups[n].forEach(function(r){var n=t.distanceToSquared(r.centroid,e);n<a&&(!o||t.isVectorInPolygon(e,r,i))&&(s=r,a=n)}),s},a.prototype.findPath=function(t,r,o,s){var a=this.zones[o].groups[s],h=this.zones[o].vertices,c=this.getClosestNode(t,o,s,!0),u=this.getClosestNode(r,o,s,!0);if(!c||!u)return null;var p=n.search(a,c,u),l=function(e,t){for(var r=0;r<e.neighbours.length;r++)if(e.neighbours[r]===t.id)return e.portals[r]},f=new i;f.push(t);for(var d=0;d<p.length;d++){var v=p[d+1];if(v){var g=l(p[d],v);f.push(h[g[0]],h[g[1]])}}f.push(r),f.stringPull();var y=f.path.map(function(t){return new e.Vector3(t.x,t.y,t.z)});return y.shift(),y},a.prototype.getGroup=(s=new e.Plane,function(e,r,n){if(void 0===n&&(n=!1),!this.zones[e])return null;for(var o=null,i=Math.pow(50,2),a=this.zones[e],h=0;h<a.groups.length;h++)for(var c=0,u=a.groups[h];c<u.length;c+=1){var p=u[c];if(n&&(s.setFromCoplanarPoints(a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]),Math.abs(s.distanceToPoint(r))<.01&&t.isPointInPoly([a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]],r)))return h;var l=t.distanceToSquared(p.centroid,r);l<i&&(o=h,i=l)}return o}),a.prototype.clampStep=function(){var t,r,n=new e.Vector3,o=new e.Plane,i=new e.Triangle,s=new e.Vector3,a=new e.Vector3;return function(e,h,c,u,p,l){var f=this.zones[u].vertices,d=this.zones[u].groups[p],v=[c],g={};g[c.id]=0,t=void 0,a.set(0,0,0),r=Infinity,o.setFromCoplanarPoints(f[c.vertexIds[0]],f[c.vertexIds[1]],f[c.vertexIds[2]]),o.projectPoint(h,n),s.copy(n);for(var y=v.pop();y;y=v.pop()){i.set(f[y.vertexIds[0]],f[y.vertexIds[1]],f[y.vertexIds[2]]),i.closestPointToPoint(s,n),n.distanceToSquared(s)<r&&(t=y,a.copy(n),r=n.distanceToSquared(s));var M=g[y.id];if(!(M>2))for(var b=0;b<y.neighbours.length;b++){var m=d[y.neighbours[b]];m.id in g||(v.push(m),g[m.id]=M+1)}}return l.copy(a),t}}();var h={PLAYER:new e.Color(15631215).convertGammaToLinear(2.2).getHex(),TARGET:new e.Color(14469912).convertGammaToLinear(2.2).getHex(),PATH:new e.Color(41903).convertGammaToLinear(2.2).getHex(),WAYPOINT:new e.Color(41903).convertGammaToLinear(2.2).getHex(),CLAMPED_STEP:new e.Color(14472114).convertGammaToLinear(2.2).getHex(),CLOSEST_NODE:new e.Color(4417387).convertGammaToLinear(2.2).getHex()},c=function(t){function r(){var r=this;t.call(this),this._playerMarker=new e.Mesh(new e.SphereGeometry(.25,32,32),new e.MeshBasicMaterial({color:h.PLAYER})),this._targetMarker=new e.Mesh(new e.BoxGeometry(.3,.3,.3),new e.MeshBasicMaterial({color:h.TARGET})),this._nodeMarker=new e.Mesh(new e.BoxGeometry(.1,.8,.1),new e.MeshBasicMaterial({color:h.CLOSEST_NODE})),this._stepMarker=new e.Mesh(new e.BoxGeometry(.1,1,.1),new e.MeshBasicMaterial({color:h.CLAMPED_STEP})),this._pathMarker=new t,this._pathLineMaterial=new e.LineBasicMaterial({color:h.PATH,linewidth:2}),this._pathPointMaterial=new e.MeshBasicMaterial({color:h.WAYPOINT}),this._pathPointGeometry=new e.SphereBufferGeometry(.08),this._markers=[this._playerMarker,this._targetMarker,this._nodeMarker,this._stepMarker,this._pathMarker],this._markers.forEach(function(e){e.visible=!1,r.add(e)})}return t&&(r.__proto__=t),(r.prototype=Object.create(t&&t.prototype)).constructor=r,r.prototype.setPath=function(t){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);t=[this._playerMarker.position].concat(t);for(var r=new e.Geometry,n=0;n<t.length;n++)r.vertices.push(t[n].clone().add(new e.Vector3(0,.2,0)));this._pathMarker.add(new e.Line(r,this._pathLineMaterial));for(var o=0;o<t.length-1;o++){var i=new e.Mesh(this._pathPointGeometry,this._pathPointMaterial);i.position.copy(t[o]),i.position.y+=.2,this._pathMarker.add(i)}return this._pathMarker.visible=!0,this},r.prototype.setPlayerPosition=function(e){return this._playerMarker.position.copy(e),this._playerMarker.visible=!0,this},r.prototype.setTargetPosition=function(e){return this._targetMarker.position.copy(e),this._targetMarker.visible=!0,this},r.prototype.setNodePosition=function(e){return this._nodeMarker.position.copy(e),this._nodeMarker.visible=!0,this},r.prototype.setStepPosition=function(e){return this._stepMarker.position.copy(e),this._stepMarker.visible=!0,this},r.prototype.reset=function(){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);return this._markers.forEach(function(e){e.visible=!1}),this},r}(e.Object3D);exports.Pathfinding=a,exports.PathfindingHelper=c;
//# sourceMappingURL=three-pathfinding.js.map

@@ -1,2 +0,2 @@

var e=function(){};e.roundNumber=function(e,t){var r=Math.pow(10,t);return Math.round(e*r)/r},e.sample=function(e){return e[Math.floor(Math.random()*e.length)]},e.distanceToSquared=function(e,t){var r=e.x-t.x,n=e.y-t.y,o=e.z-t.z;return r*r+n*n+o*o},e.isPointInPoly=function(e,t){for(var r=!1,n=-1,o=e.length,i=o-1;++n<o;i=n)(e[n].z<=t.z&&t.z<e[i].z||e[i].z<=t.z&&t.z<e[n].z)&&t.x<(e[i].x-e[n].x)*(t.z-e[n].z)/(e[i].z-e[n].z)+e[n].x&&(r=!r);return r},e.isVectorInPolygon=function(e,t,r){var n=1e5,o=-1e5,i=[];return t.vertexIds.forEach(function(e){n=Math.min(r[e].y,n),o=Math.max(r[e].y,o),i.push(r[e])}),!!(e.y<o+.5&&e.y>n-.5&&this.isPointInPoly(i,e))},e.triarea2=function(e,t,r){return(r.x-e.x)*(t.z-e.z)-(t.x-e.x)*(r.z-e.z)},e.vequal=function(e,t){return this.distanceToSquared(e,t)<1e-5};var t=function(e){this.content=[],this.scoreFunction=e};t.prototype.push=function(e){this.content.push(e),this.sinkDown(this.content.length-1)},t.prototype.pop=function(){var e=this.content[0],t=this.content.pop();return this.content.length>0&&(this.content[0]=t,this.bubbleUp(0)),e},t.prototype.remove=function(e){var t=this.content.indexOf(e),r=this.content.pop();t!==this.content.length-1&&(this.content[t]=r,this.scoreFunction(r)<this.scoreFunction(e)?this.sinkDown(t):this.bubbleUp(t))},t.prototype.size=function(){return this.content.length},t.prototype.rescoreElement=function(e){this.sinkDown(this.content.indexOf(e))},t.prototype.sinkDown=function(e){for(var t=this.content[e];e>0;){var r=(e+1>>1)-1,n=this.content[r];if(!(this.scoreFunction(t)<this.scoreFunction(n)))break;this.content[r]=t,this.content[e]=n,e=r}},t.prototype.bubbleUp=function(e){for(var t=this.content.length,r=this.content[e],n=this.scoreFunction(r);;){var o=e+1<<1,i=o-1,s=null,a=void 0;if(i<t)(a=this.scoreFunction(this.content[i]))<n&&(s=i);if(o<t)this.scoreFunction(this.content[o])<(null===s?n:a)&&(s=o);if(null===s)break;this.content[e]=this.content[s],this.content[s]=r,e=s}};var r=function(){};r.init=function(e){for(var t=0;t<e.length;t++){var r=e[t];r.f=0,r.g=0,r.h=0,r.cost=1,r.visited=!1,r.closed=!1,r.parent=null}},r.cleanUp=function(e){for(var t=0;t<e.length;t++){var r=e[t];delete r.f,delete r.g,delete r.h,delete r.cost,delete r.visited,delete r.closed,delete r.parent}},r.heap=function(){return new t(function(e){return e.f})},r.search=function(e,t,r){this.init(e);var n=this.heap();for(n.push(t);n.size()>0;){var o=n.pop();if(o===r){for(var i=o,s=[];i.parent;)s.push(i),i=i.parent;return this.cleanUp(s),s.reverse()}o.closed=!0;for(var a=this.neighbours(e,o),h=0,c=a.length;h<c;h++){var u=a[h];if(!u.closed){var p=o.g+u.cost,l=u.visited;if(!l||p<u.g){if(u.visited=!0,u.parent=o,!u.centroid||!r.centroid)throw new Error("Unexpected state");u.h=u.h||this.heuristic(u.centroid,r.centroid),u.g=p,u.f=u.g+u.h,l?n.rescoreElement(u):n.push(u)}}}}return[]},r.heuristic=function(t,r){return e.distanceToSquared(t,r)},r.neighbours=function(e,t){for(var r=[],n=0;n<t.neighbours.length;n++)r.push(e[t.neighbours[n]]);return r};var n=function(){};n.buildZone=function(t){var r=this,n=this._buildNavigationMesh(t),o={};n.vertices.forEach(function(t){t.x=e.roundNumber(t.x,2),t.y=e.roundNumber(t.y,2),t.z=e.roundNumber(t.z,2)}),o.vertices=n.vertices;var i=this._buildPolygonGroups(n);return o.groups=new Array(i.length),i.forEach(function(t,n){var i=new Map;t.forEach(function(e,t){i.set(e,t)});var s=new Array(t.length);t.forEach(function(t,n){var a=[];t.neighbours.forEach(function(e){return a.push(i.get(e))});var h=[];t.neighbours.forEach(function(e){return h.push(r._getSharedVerticesInOrder(t,e))});var c=new THREE.Vector3(0,0,0);c.add(o.vertices[t.vertexIds[0]]),c.add(o.vertices[t.vertexIds[1]]),c.add(o.vertices[t.vertexIds[2]]),c.divideScalar(3),c.x=e.roundNumber(c.x,2),c.y=e.roundNumber(c.y,2),c.z=e.roundNumber(c.z,2),s[n]={id:n,neighbours:a,vertexIds:t.vertexIds,centroid:c,portals:h}}),o.groups[n]=s}),o},n._buildNavigationMesh=function(e){return e.mergeVertices(),this._buildPolygonsFromGeometry(e)},n._buildPolygonGroups=function(e){var t=[],r=function(e){e.neighbours.forEach(function(t){void 0===t.group&&(t.group=e.group,r(t))})};return e.polygons.forEach(function(e){void 0!==e.group?t[e.group].push(e):(e.group=t.length,r(e),t.push([e]))}),t},n._buildPolygonNeighbours=function(e,t){var r=new Set,n=t[e.vertexIds[1]],o=t[e.vertexIds[2]];return t[e.vertexIds[0]].forEach(function(t){t!==e&&(n.includes(t)||o.includes(t))&&r.add(t)}),n.forEach(function(t){t!==e&&o.includes(t)&&r.add(t)}),r},n._buildPolygonsFromGeometry=function(e){for(var t=this,r=[],n=e.vertices,o=new Array(n.length),i=0;i<n.length;i++)o[i]=[];return e.faces.forEach(function(e){var t={vertexIds:[e.a,e.b,e.c],neighbours:null};r.push(t),o[e.a].push(t),o[e.b].push(t),o[e.c].push(t)}),r.forEach(function(e){e.neighbours=t._buildPolygonNeighbours(e,o)}),{polygons:r,vertices:n}},n._getSharedVerticesInOrder=function(e,t){var r=e.vertexIds,n=r[0],o=r[1],i=r[2],s=t.vertexIds,a=s.includes(n),h=s.includes(o),c=s.includes(i);return a&&h&&c?Array.from(r):a&&h?[n,o]:h&&c?[o,i]:a&&c?[i,n]:(console.warn("Error processing navigation mesh neighbors; neighbors with <2 shared vertices found."),[])};var o=function(){this.portals=[]};o.prototype.push=function(e,t){void 0===t&&(t=e),this.portals.push({left:e,right:t})},o.prototype.stringPull=function(){var t,r,n,o=this.portals,i=[],s=0,a=0,h=0;r=o[0].left,n=o[0].right,i.push(t=o[0].left);for(var c=1;c<o.length;c++){var u=o[c].left,p=o[c].right;if(e.triarea2(t,n,p)<=0){if(!(e.vequal(t,n)||e.triarea2(t,r,p)>0)){i.push(r),r=t=r,n=t,a=s=a,h=s,c=s;continue}n=p,h=c}if(e.triarea2(t,r,u)>=0){if(!(e.vequal(t,r)||e.triarea2(t,n,u)<0)){i.push(n),r=t=n,n=t,a=s=h,h=s,c=s;continue}r=u,a=c}}return 0!==i.length&&e.vequal(i[i.length-1],o[o.length-1].left)||i.push(o[o.length-1].left),this.path=i,i};var i,s=function(){this.zones={}};s.createZone=function(e){return e.isGeometry?console.warn("[three-pathfinding]: Use THREE.BufferGeometry, not THREE.Geometry, to create zone."):e=(new THREE.Geometry).fromBufferGeometry(e),n.buildZone(e)},s.prototype.setZoneData=function(e,t){this.zones[e]=t},s.prototype.getRandomNode=function(t,r,n,o){if(!this.zones[t])return new THREE.Vector3;n=n||null,o=o||0;var i=[];return this.zones[t].groups[r].forEach(function(t){n&&o?e.distanceToSquared(n,t.centroid)<o*o&&i.push(t.centroid):i.push(t.centroid)}),e.sample(i)||new THREE.Vector3},s.prototype.getClosestNode=function(t,r,n,o){void 0===o&&(o=!1);var i=this.zones[r].vertices,s=null,a=Infinity;return this.zones[r].groups[n].forEach(function(r){var n=e.distanceToSquared(r.centroid,t);n<a&&(!o||e.isVectorInPolygon(t,r,i))&&(s=r,a=n)}),s},s.prototype.findPath=function(e,t,n,i){var s=this.zones[n].groups[i],a=this.zones[n].vertices,h=this.getClosestNode(e,n,i,!0),c=this.getClosestNode(t,n,i,!0);if(!h||!c)return null;var u=r.search(s,h,c),p=function(e,t){for(var r=0;r<e.neighbours.length;r++)if(e.neighbours[r]===t.id)return e.portals[r]},l=new o;l.push(e);for(var f=0;f<u.length;f++){var d=u[f+1];if(d){var v=p(u[f],d);l.push(a[v[0]],a[v[1]])}}l.push(t),l.stringPull();var E=l.path.map(function(e){return new THREE.Vector3(e.x,e.y,e.z)});return E.shift(),E},s.prototype.getGroup=(i=new THREE.Plane,function(t,r,n){if(void 0===n&&(n=!1),!this.zones[t])return null;for(var o=null,s=Math.pow(50,2),a=this.zones[t],h=0;h<a.groups.length;h++)for(var c=0,u=a.groups[h];c<u.length;c+=1){var p=u[c];if(n&&(i.setFromCoplanarPoints(a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]),Math.abs(i.distanceToPoint(r))<.01&&e.isPointInPoly([a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]],r)))return h;var l=e.distanceToSquared(p.centroid,r);l<s&&(o=h,s=l)}return o}),s.prototype.clampStep=function(){var e,t,r=new THREE.Vector3,n=new THREE.Plane,o=new THREE.Triangle,i=new THREE.Vector3,s=new THREE.Vector3;return function(a,h,c,u,p,l){var f=this.zones[u].vertices,d=this.zones[u].groups[p],v=[c],E={};E[c.id]=0,e=void 0,s.set(0,0,0),t=Infinity,n.setFromCoplanarPoints(f[c.vertexIds[0]],f[c.vertexIds[1]],f[c.vertexIds[2]]),n.projectPoint(h,r),i.copy(r);for(var g=v.pop();g;g=v.pop()){o.set(f[g.vertexIds[0]],f[g.vertexIds[1]],f[g.vertexIds[2]]),o.closestPointToPoint(i,r),r.distanceToSquared(i)<t&&(e=g,s.copy(r),t=r.distanceToSquared(i));var y=E[g.id];if(!(y>2))for(var T=0;T<g.neighbours.length;T++){var M=d[g.neighbours[T]];M.id in E||(v.push(M),E[M.id]=y+1)}}return l.copy(s),e}}();var a={PLAYER:new THREE.Color(15631215).convertGammaToLinear(2.2).getHex(),TARGET:new THREE.Color(14469912).convertGammaToLinear(2.2).getHex(),PATH:new THREE.Color(41903).convertGammaToLinear(2.2).getHex(),WAYPOINT:new THREE.Color(41903).convertGammaToLinear(2.2).getHex(),CLAMPED_STEP:new THREE.Color(14472114).convertGammaToLinear(2.2).getHex(),CLOSEST_NODE:new THREE.Color(4417387).convertGammaToLinear(2.2).getHex()},h=function(e){function t(){var t=this;e.call(this),this._playerMarker=new THREE.Mesh(new THREE.SphereGeometry(.25,32,32),new THREE.MeshBasicMaterial({color:a.PLAYER})),this._targetMarker=new THREE.Mesh(new THREE.BoxGeometry(.3,.3,.3),new THREE.MeshBasicMaterial({color:a.TARGET})),this._nodeMarker=new THREE.Mesh(new THREE.BoxGeometry(.1,.8,.1),new THREE.MeshBasicMaterial({color:a.CLOSEST_NODE})),this._stepMarker=new THREE.Mesh(new THREE.BoxGeometry(.1,1,.1),new THREE.MeshBasicMaterial({color:a.CLAMPED_STEP})),this._pathMarker=new THREE.Object3D,this._pathLineMaterial=new THREE.LineBasicMaterial({color:a.PATH,linewidth:2}),this._pathPointMaterial=new THREE.MeshBasicMaterial({color:a.WAYPOINT}),this._pathPointGeometry=new THREE.SphereBufferGeometry(.08),this._markers=[this._playerMarker,this._targetMarker,this._nodeMarker,this._stepMarker,this._pathMarker],this._markers.forEach(function(e){e.visible=!1,t.add(e)})}return e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t,t.prototype.setPath=function(e){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);e=[this._playerMarker.position].concat(e);for(var t=new THREE.Geometry,r=0;r<e.length;r++)t.vertices.push(e[r].clone().add(new THREE.Vector3(0,.2,0)));this._pathMarker.add(new THREE.Line(t,this._pathLineMaterial));for(var n=0;n<e.length-1;n++){var o=new THREE.Mesh(this._pathPointGeometry,this._pathPointMaterial);o.position.copy(e[n]),o.position.y+=.2,this._pathMarker.add(o)}return this._pathMarker.visible=!0,this},t.prototype.setPlayerPosition=function(e){return this._playerMarker.position.copy(e),this._playerMarker.visible=!0,this},t.prototype.setTargetPosition=function(e){return this._targetMarker.position.copy(e),this._targetMarker.visible=!0,this},t.prototype.setNodePosition=function(e){return this._nodeMarker.position.copy(e),this._nodeMarker.visible=!0,this},t.prototype.setStepPosition=function(e){return this._stepMarker.position.copy(e),this._stepMarker.visible=!0,this},t.prototype.reset=function(){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);return this._markers.forEach(function(e){e.visible=!1}),this},t}(THREE.Object3D);export{s as Pathfinding,h as PathfindingHelper};
import{Vector3 as t,Plane as e,Geometry as r,Triangle as n,Color as o,Object3D as i,LineBasicMaterial as s,MeshBasicMaterial as a,SphereBufferGeometry as h,BoxGeometry as u,Mesh as c,SphereGeometry as p,Line as l}from"three";var f=function(){};f.roundNumber=function(t,e){var r=Math.pow(10,e);return Math.round(t*r)/r},f.sample=function(t){return t[Math.floor(Math.random()*t.length)]},f.distanceToSquared=function(t,e){var r=t.x-e.x,n=t.y-e.y,o=t.z-e.z;return r*r+n*n+o*o},f.isPointInPoly=function(t,e){for(var r=!1,n=-1,o=t.length,i=o-1;++n<o;i=n)(t[n].z<=e.z&&e.z<t[i].z||t[i].z<=e.z&&e.z<t[n].z)&&e.x<(t[i].x-t[n].x)*(e.z-t[n].z)/(t[i].z-t[n].z)+t[n].x&&(r=!r);return r},f.isVectorInPolygon=function(t,e,r){var n=1e5,o=-1e5,i=[];return e.vertexIds.forEach(function(t){n=Math.min(r[t].y,n),o=Math.max(r[t].y,o),i.push(r[t])}),!!(t.y<o+.5&&t.y>n-.5&&this.isPointInPoly(i,t))},f.triarea2=function(t,e,r){return(r.x-t.x)*(e.z-t.z)-(e.x-t.x)*(r.z-t.z)},f.vequal=function(t,e){return this.distanceToSquared(t,e)<1e-5};var d=function(t){this.content=[],this.scoreFunction=t};d.prototype.push=function(t){this.content.push(t),this.sinkDown(this.content.length-1)},d.prototype.pop=function(){var t=this.content[0],e=this.content.pop();return this.content.length>0&&(this.content[0]=e,this.bubbleUp(0)),t},d.prototype.remove=function(t){var e=this.content.indexOf(t),r=this.content.pop();e!==this.content.length-1&&(this.content[e]=r,this.scoreFunction(r)<this.scoreFunction(t)?this.sinkDown(e):this.bubbleUp(e))},d.prototype.size=function(){return this.content.length},d.prototype.rescoreElement=function(t){this.sinkDown(this.content.indexOf(t))},d.prototype.sinkDown=function(t){for(var e=this.content[t];t>0;){var r=(t+1>>1)-1,n=this.content[r];if(!(this.scoreFunction(e)<this.scoreFunction(n)))break;this.content[r]=e,this.content[t]=n,t=r}},d.prototype.bubbleUp=function(t){for(var e=this.content.length,r=this.content[t],n=this.scoreFunction(r);;){var o=t+1<<1,i=o-1,s=null,a=void 0;if(i<e&&(a=this.scoreFunction(this.content[i]))<n&&(s=i),o<e&&this.scoreFunction(this.content[o])<(null===s?n:a)&&(s=o),null===s)break;this.content[t]=this.content[s],this.content[s]=r,t=s}};var v=function(){};v.init=function(t){for(var e=0;e<t.length;e++){var r=t[e];r.f=0,r.g=0,r.h=0,r.cost=1,r.visited=!1,r.closed=!1,r.parent=null}},v.cleanUp=function(t){for(var e=0;e<t.length;e++){var r=t[e];delete r.f,delete r.g,delete r.h,delete r.cost,delete r.visited,delete r.closed,delete r.parent}},v.heap=function(){return new d(function(t){return t.f})},v.search=function(t,e,r){this.init(t);var n=this.heap();for(n.push(e);n.size()>0;){var o=n.pop();if(o===r){for(var i=o,s=[];i.parent;)s.push(i),i=i.parent;return this.cleanUp(s),s.reverse()}o.closed=!0;for(var a=this.neighbours(t,o),h=0,u=a.length;h<u;h++){var c=a[h];if(!c.closed){var p=o.g+c.cost,l=c.visited;if(!l||p<c.g){if(c.visited=!0,c.parent=o,!c.centroid||!r.centroid)throw new Error("Unexpected state");c.h=c.h||this.heuristic(c.centroid,r.centroid),c.g=p,c.f=c.g+c.h,l?n.rescoreElement(c):n.push(c)}}}}return[]},v.heuristic=function(t,e){return f.distanceToSquared(t,e)},v.neighbours=function(t,e){for(var r=[],n=0;n<e.neighbours.length;n++)r.push(t[e.neighbours[n]]);return r};var g=function(){};g.buildZone=function(e){var r=this,n=this._buildNavigationMesh(e),o={};n.vertices.forEach(function(t){t.x=f.roundNumber(t.x,2),t.y=f.roundNumber(t.y,2),t.z=f.roundNumber(t.z,2)}),o.vertices=n.vertices;var i=this._buildPolygonGroups(n);return o.groups=new Array(i.length),i.forEach(function(e,n){var i=new Map;e.forEach(function(t,e){i.set(t,e)});var s=new Array(e.length);e.forEach(function(e,n){var a=[];e.neighbours.forEach(function(t){return a.push(i.get(t))});var h=[];e.neighbours.forEach(function(t){return h.push(r._getSharedVerticesInOrder(e,t))});var u=new t(0,0,0);u.add(o.vertices[e.vertexIds[0]]),u.add(o.vertices[e.vertexIds[1]]),u.add(o.vertices[e.vertexIds[2]]),u.divideScalar(3),u.x=f.roundNumber(u.x,2),u.y=f.roundNumber(u.y,2),u.z=f.roundNumber(u.z,2),s[n]={id:n,neighbours:a,vertexIds:e.vertexIds,centroid:u,portals:h}}),o.groups[n]=s}),o},g._buildNavigationMesh=function(t){return t.mergeVertices(),this._buildPolygonsFromGeometry(t)},g._buildPolygonGroups=function(t){var e=[],r=function(t){t.neighbours.forEach(function(e){void 0===e.group&&(e.group=t.group,r(e))})};return t.polygons.forEach(function(t){void 0!==t.group?e[t.group].push(t):(t.group=e.length,r(t),e.push([t]))}),e},g._buildPolygonNeighbours=function(t,e){var r=new Set,n=e[t.vertexIds[1]],o=e[t.vertexIds[2]];return e[t.vertexIds[0]].forEach(function(e){e!==t&&(n.includes(e)||o.includes(e))&&r.add(e)}),n.forEach(function(e){e!==t&&o.includes(e)&&r.add(e)}),r},g._buildPolygonsFromGeometry=function(t){for(var e=this,r=[],n=t.vertices,o=new Array(n.length),i=0;i<n.length;i++)o[i]=[];return t.faces.forEach(function(t){var e={vertexIds:[t.a,t.b,t.c],neighbours:null};r.push(e),o[t.a].push(e),o[t.b].push(e),o[t.c].push(e)}),r.forEach(function(t){t.neighbours=e._buildPolygonNeighbours(t,o)}),{polygons:r,vertices:n}},g._getSharedVerticesInOrder=function(t,e){var r=t.vertexIds,n=r[0],o=r[1],i=r[2],s=e.vertexIds,a=s.includes(n),h=s.includes(o),u=s.includes(i);return a&&h&&u?Array.from(r):a&&h?[n,o]:h&&u?[o,i]:a&&u?[i,n]:(console.warn("Error processing navigation mesh neighbors; neighbors with <2 shared vertices found."),[])};var y=function(){this.portals=[]};y.prototype.push=function(t,e){void 0===e&&(e=t),this.portals.push({left:t,right:e})},y.prototype.stringPull=function(){var t,e,r,n=this.portals,o=[],i=0,s=0,a=0;e=n[0].left,r=n[0].right,o.push(t=n[0].left);for(var h=1;h<n.length;h++){var u=n[h].left,c=n[h].right;if(f.triarea2(t,r,c)<=0){if(!(f.vequal(t,r)||f.triarea2(t,e,c)>0)){o.push(e),e=t=e,r=t,s=i=s,a=i,h=i;continue}r=c,a=h}if(f.triarea2(t,e,u)>=0){if(!(f.vequal(t,e)||f.triarea2(t,r,u)<0)){o.push(r),e=t=r,r=t,s=i=a,a=i,h=i;continue}e=u,s=h}}return 0!==o.length&&f.vequal(o[o.length-1],n[n.length-1].left)||o.push(n[n.length-1].left),this.path=o,o};var b,_=function(){this.zones={}};_.createZone=function(t){return t.isGeometry?console.warn("[three-pathfinding]: Use BufferGeometry, not Geometry, to create zone."):t=(new r).fromBufferGeometry(t),g.buildZone(t)},_.prototype.setZoneData=function(t,e){this.zones[t]=e},_.prototype.getRandomNode=function(e,r,n,o){if(!this.zones[e])return new t;n=n||null,o=o||0;var i=[];return this.zones[e].groups[r].forEach(function(t){n&&o?f.distanceToSquared(n,t.centroid)<o*o&&i.push(t.centroid):i.push(t.centroid)}),f.sample(i)||new t},_.prototype.getClosestNode=function(t,e,r,n){void 0===n&&(n=!1);var o=this.zones[e].vertices,i=null,s=Infinity;return this.zones[e].groups[r].forEach(function(e){var r=f.distanceToSquared(e.centroid,t);r<s&&(!n||f.isVectorInPolygon(t,e,o))&&(i=e,s=r)}),i},_.prototype.findPath=function(e,r,n,o){var i=this.zones[n].groups[o],s=this.zones[n].vertices,a=this.getClosestNode(e,n,o,!0),h=this.getClosestNode(r,n,o,!0);if(!a||!h)return null;var u=v.search(i,a,h),c=function(t,e){for(var r=0;r<t.neighbours.length;r++)if(t.neighbours[r]===e.id)return t.portals[r]},p=new y;p.push(e);for(var l=0;l<u.length;l++){var f=u[l+1];if(f){var d=c(u[l],f);p.push(s[d[0]],s[d[1]])}}p.push(r),p.stringPull();var g=p.path.map(function(e){return new t(e.x,e.y,e.z)});return g.shift(),g},_.prototype.getGroup=(b=new e,function(t,e,r){if(void 0===r&&(r=!1),!this.zones[t])return null;for(var n=null,o=Math.pow(50,2),i=this.zones[t],s=0;s<i.groups.length;s++)for(var a=0,h=i.groups[s];a<h.length;a+=1){var u=h[a];if(r&&(b.setFromCoplanarPoints(i.vertices[u.vertexIds[0]],i.vertices[u.vertexIds[1]],i.vertices[u.vertexIds[2]]),Math.abs(b.distanceToPoint(e))<.01&&f.isPointInPoly([i.vertices[u.vertexIds[0]],i.vertices[u.vertexIds[1]],i.vertices[u.vertexIds[2]]],e)))return s;var c=f.distanceToSquared(u.centroid,e);c<o&&(n=s,o=c)}return n}),_.prototype.clampStep=function(){var r,o,i=new t,s=new e,a=new n,h=new t,u=new t;return function(t,e,n,c,p,l){var f=this.zones[c].vertices,d=this.zones[c].groups[p],v=[n],g={};g[n.id]=0,r=void 0,u.set(0,0,0),o=Infinity,s.setFromCoplanarPoints(f[n.vertexIds[0]],f[n.vertexIds[1]],f[n.vertexIds[2]]),s.projectPoint(e,i),h.copy(i);for(var y=v.pop();y;y=v.pop()){a.set(f[y.vertexIds[0]],f[y.vertexIds[1]],f[y.vertexIds[2]]),a.closestPointToPoint(h,i),i.distanceToSquared(h)<o&&(r=y,u.copy(i),o=i.distanceToSquared(h));var b=g[y.id];if(!(b>2))for(var _=0;_<y.neighbours.length;_++){var w=d[y.neighbours[_]];w.id in g||(v.push(w),g[w.id]=b+1)}}return l.copy(u),r}}();var w={PLAYER:new o(15631215).convertGammaToLinear(2.2).getHex(),TARGET:new o(14469912).convertGammaToLinear(2.2).getHex(),PATH:new o(41903).convertGammaToLinear(2.2).getHex(),WAYPOINT:new o(41903).convertGammaToLinear(2.2).getHex(),CLAMPED_STEP:new o(14472114).convertGammaToLinear(2.2).getHex(),CLOSEST_NODE:new o(4417387).convertGammaToLinear(2.2).getHex()},m=function(e){function n(){var t=this;e.call(this),this._playerMarker=new c(new p(.25,32,32),new a({color:w.PLAYER})),this._targetMarker=new c(new u(.3,.3,.3),new a({color:w.TARGET})),this._nodeMarker=new c(new u(.1,.8,.1),new a({color:w.CLOSEST_NODE})),this._stepMarker=new c(new u(.1,1,.1),new a({color:w.CLAMPED_STEP})),this._pathMarker=new e,this._pathLineMaterial=new s({color:w.PATH,linewidth:2}),this._pathPointMaterial=new a({color:w.WAYPOINT}),this._pathPointGeometry=new h(.08),this._markers=[this._playerMarker,this._targetMarker,this._nodeMarker,this._stepMarker,this._pathMarker],this._markers.forEach(function(e){e.visible=!1,t.add(e)})}return e&&(n.__proto__=e),(n.prototype=Object.create(e&&e.prototype)).constructor=n,n.prototype.setPath=function(e){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);e=[this._playerMarker.position].concat(e);for(var n=new r,o=0;o<e.length;o++)n.vertices.push(e[o].clone().add(new t(0,.2,0)));this._pathMarker.add(new l(n,this._pathLineMaterial));for(var i=0;i<e.length-1;i++){var s=new c(this._pathPointGeometry,this._pathPointMaterial);s.position.copy(e[i]),s.position.y+=.2,this._pathMarker.add(s)}return this._pathMarker.visible=!0,this},n.prototype.setPlayerPosition=function(t){return this._playerMarker.position.copy(t),this._playerMarker.visible=!0,this},n.prototype.setTargetPosition=function(t){return this._targetMarker.position.copy(t),this._targetMarker.visible=!0,this},n.prototype.setNodePosition=function(t){return this._nodeMarker.position.copy(t),this._nodeMarker.visible=!0,this},n.prototype.setStepPosition=function(t){return this._stepMarker.position.copy(t),this._stepMarker.visible=!0,this},n.prototype.reset=function(){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);return this._markers.forEach(function(t){t.visible=!1}),this},n}(i);export{_ as Pathfinding,m as PathfindingHelper};
//# sourceMappingURL=three-pathfinding.module.js.map

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.threePathfinding={})}(this,function(e){var t=function(){};t.roundNumber=function(e,t){var r=Math.pow(10,t);return Math.round(e*r)/r},t.sample=function(e){return e[Math.floor(Math.random()*e.length)]},t.distanceToSquared=function(e,t){var r=e.x-t.x,n=e.y-t.y,o=e.z-t.z;return r*r+n*n+o*o},t.isPointInPoly=function(e,t){for(var r=!1,n=-1,o=e.length,i=o-1;++n<o;i=n)(e[n].z<=t.z&&t.z<e[i].z||e[i].z<=t.z&&t.z<e[n].z)&&t.x<(e[i].x-e[n].x)*(t.z-e[n].z)/(e[i].z-e[n].z)+e[n].x&&(r=!r);return r},t.isVectorInPolygon=function(e,t,r){var n=1e5,o=-1e5,i=[];return t.vertexIds.forEach(function(e){n=Math.min(r[e].y,n),o=Math.max(r[e].y,o),i.push(r[e])}),!!(e.y<o+.5&&e.y>n-.5&&this.isPointInPoly(i,e))},t.triarea2=function(e,t,r){return(r.x-e.x)*(t.z-e.z)-(t.x-e.x)*(r.z-e.z)},t.vequal=function(e,t){return this.distanceToSquared(e,t)<1e-5};var r=function(e){this.content=[],this.scoreFunction=e};r.prototype.push=function(e){this.content.push(e),this.sinkDown(this.content.length-1)},r.prototype.pop=function(){var e=this.content[0],t=this.content.pop();return this.content.length>0&&(this.content[0]=t,this.bubbleUp(0)),e},r.prototype.remove=function(e){var t=this.content.indexOf(e),r=this.content.pop();t!==this.content.length-1&&(this.content[t]=r,this.scoreFunction(r)<this.scoreFunction(e)?this.sinkDown(t):this.bubbleUp(t))},r.prototype.size=function(){return this.content.length},r.prototype.rescoreElement=function(e){this.sinkDown(this.content.indexOf(e))},r.prototype.sinkDown=function(e){for(var t=this.content[e];e>0;){var r=(e+1>>1)-1,n=this.content[r];if(!(this.scoreFunction(t)<this.scoreFunction(n)))break;this.content[r]=t,this.content[e]=n,e=r}},r.prototype.bubbleUp=function(e){for(var t=this.content.length,r=this.content[e],n=this.scoreFunction(r);;){var o=e+1<<1,i=o-1,s=null,a=void 0;if(i<t)(a=this.scoreFunction(this.content[i]))<n&&(s=i);if(o<t)this.scoreFunction(this.content[o])<(null===s?n:a)&&(s=o);if(null===s)break;this.content[e]=this.content[s],this.content[s]=r,e=s}};var n=function(){};n.init=function(e){for(var t=0;t<e.length;t++){var r=e[t];r.f=0,r.g=0,r.h=0,r.cost=1,r.visited=!1,r.closed=!1,r.parent=null}},n.cleanUp=function(e){for(var t=0;t<e.length;t++){var r=e[t];delete r.f,delete r.g,delete r.h,delete r.cost,delete r.visited,delete r.closed,delete r.parent}},n.heap=function(){return new r(function(e){return e.f})},n.search=function(e,t,r){this.init(e);var n=this.heap();for(n.push(t);n.size()>0;){var o=n.pop();if(o===r){for(var i=o,s=[];i.parent;)s.push(i),i=i.parent;return this.cleanUp(s),s.reverse()}o.closed=!0;for(var a=this.neighbours(e,o),h=0,c=a.length;h<c;h++){var u=a[h];if(!u.closed){var p=o.g+u.cost,l=u.visited;if(!l||p<u.g){if(u.visited=!0,u.parent=o,!u.centroid||!r.centroid)throw new Error("Unexpected state");u.h=u.h||this.heuristic(u.centroid,r.centroid),u.g=p,u.f=u.g+u.h,l?n.rescoreElement(u):n.push(u)}}}}return[]},n.heuristic=function(e,r){return t.distanceToSquared(e,r)},n.neighbours=function(e,t){for(var r=[],n=0;n<t.neighbours.length;n++)r.push(e[t.neighbours[n]]);return r};var o=function(){};o.buildZone=function(e){var r=this,n=this._buildNavigationMesh(e),o={};n.vertices.forEach(function(e){e.x=t.roundNumber(e.x,2),e.y=t.roundNumber(e.y,2),e.z=t.roundNumber(e.z,2)}),o.vertices=n.vertices;var i=this._buildPolygonGroups(n);return o.groups=new Array(i.length),i.forEach(function(e,n){var i=new Map;e.forEach(function(e,t){i.set(e,t)});var s=new Array(e.length);e.forEach(function(e,n){var a=[];e.neighbours.forEach(function(e){return a.push(i.get(e))});var h=[];e.neighbours.forEach(function(t){return h.push(r._getSharedVerticesInOrder(e,t))});var c=new THREE.Vector3(0,0,0);c.add(o.vertices[e.vertexIds[0]]),c.add(o.vertices[e.vertexIds[1]]),c.add(o.vertices[e.vertexIds[2]]),c.divideScalar(3),c.x=t.roundNumber(c.x,2),c.y=t.roundNumber(c.y,2),c.z=t.roundNumber(c.z,2),s[n]={id:n,neighbours:a,vertexIds:e.vertexIds,centroid:c,portals:h}}),o.groups[n]=s}),o},o._buildNavigationMesh=function(e){return e.mergeVertices(),this._buildPolygonsFromGeometry(e)},o._buildPolygonGroups=function(e){var t=[],r=function(e){e.neighbours.forEach(function(t){void 0===t.group&&(t.group=e.group,r(t))})};return e.polygons.forEach(function(e){void 0!==e.group?t[e.group].push(e):(e.group=t.length,r(e),t.push([e]))}),t},o._buildPolygonNeighbours=function(e,t){var r=new Set,n=t[e.vertexIds[1]],o=t[e.vertexIds[2]];return t[e.vertexIds[0]].forEach(function(t){t!==e&&(n.includes(t)||o.includes(t))&&r.add(t)}),n.forEach(function(t){t!==e&&o.includes(t)&&r.add(t)}),r},o._buildPolygonsFromGeometry=function(e){for(var t=this,r=[],n=e.vertices,o=new Array(n.length),i=0;i<n.length;i++)o[i]=[];return e.faces.forEach(function(e){var t={vertexIds:[e.a,e.b,e.c],neighbours:null};r.push(t),o[e.a].push(t),o[e.b].push(t),o[e.c].push(t)}),r.forEach(function(e){e.neighbours=t._buildPolygonNeighbours(e,o)}),{polygons:r,vertices:n}},o._getSharedVerticesInOrder=function(e,t){var r=e.vertexIds,n=r[0],o=r[1],i=r[2],s=t.vertexIds,a=s.includes(n),h=s.includes(o),c=s.includes(i);return a&&h&&c?Array.from(r):a&&h?[n,o]:h&&c?[o,i]:a&&c?[i,n]:(console.warn("Error processing navigation mesh neighbors; neighbors with <2 shared vertices found."),[])};var i=function(){this.portals=[]};i.prototype.push=function(e,t){void 0===t&&(t=e),this.portals.push({left:e,right:t})},i.prototype.stringPull=function(){var e,r,n,o=this.portals,i=[],s=0,a=0,h=0;r=o[0].left,n=o[0].right,i.push(e=o[0].left);for(var c=1;c<o.length;c++){var u=o[c].left,p=o[c].right;if(t.triarea2(e,n,p)<=0){if(!(t.vequal(e,n)||t.triarea2(e,r,p)>0)){i.push(r),r=e=r,n=e,a=s=a,h=s,c=s;continue}n=p,h=c}if(t.triarea2(e,r,u)>=0){if(!(t.vequal(e,r)||t.triarea2(e,n,u)<0)){i.push(n),r=e=n,n=e,a=s=h,h=s,c=s;continue}r=u,a=c}}return 0!==i.length&&t.vequal(i[i.length-1],o[o.length-1].left)||i.push(o[o.length-1].left),this.path=i,i};var s,a=function(){this.zones={}};a.createZone=function(e){return e.isGeometry?console.warn("[three-pathfinding]: Use THREE.BufferGeometry, not THREE.Geometry, to create zone."):e=(new THREE.Geometry).fromBufferGeometry(e),o.buildZone(e)},a.prototype.setZoneData=function(e,t){this.zones[e]=t},a.prototype.getRandomNode=function(e,r,n,o){if(!this.zones[e])return new THREE.Vector3;n=n||null,o=o||0;var i=[];return this.zones[e].groups[r].forEach(function(e){n&&o?t.distanceToSquared(n,e.centroid)<o*o&&i.push(e.centroid):i.push(e.centroid)}),t.sample(i)||new THREE.Vector3},a.prototype.getClosestNode=function(e,r,n,o){void 0===o&&(o=!1);var i=this.zones[r].vertices,s=null,a=Infinity;return this.zones[r].groups[n].forEach(function(r){var n=t.distanceToSquared(r.centroid,e);n<a&&(!o||t.isVectorInPolygon(e,r,i))&&(s=r,a=n)}),s},a.prototype.findPath=function(e,t,r,o){var s=this.zones[r].groups[o],a=this.zones[r].vertices,h=this.getClosestNode(e,r,o,!0),c=this.getClosestNode(t,r,o,!0);if(!h||!c)return null;var u=n.search(s,h,c),p=function(e,t){for(var r=0;r<e.neighbours.length;r++)if(e.neighbours[r]===t.id)return e.portals[r]},l=new i;l.push(e);for(var f=0;f<u.length;f++){var d=u[f+1];if(d){var v=p(u[f],d);l.push(a[v[0]],a[v[1]])}}l.push(t),l.stringPull();var E=l.path.map(function(e){return new THREE.Vector3(e.x,e.y,e.z)});return E.shift(),E},a.prototype.getGroup=(s=new THREE.Plane,function(e,r,n){if(void 0===n&&(n=!1),!this.zones[e])return null;for(var o=null,i=Math.pow(50,2),a=this.zones[e],h=0;h<a.groups.length;h++)for(var c=0,u=a.groups[h];c<u.length;c+=1){var p=u[c];if(n&&(s.setFromCoplanarPoints(a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]),Math.abs(s.distanceToPoint(r))<.01&&t.isPointInPoly([a.vertices[p.vertexIds[0]],a.vertices[p.vertexIds[1]],a.vertices[p.vertexIds[2]]],r)))return h;var l=t.distanceToSquared(p.centroid,r);l<i&&(o=h,i=l)}return o}),a.prototype.clampStep=function(){var e,t,r=new THREE.Vector3,n=new THREE.Plane,o=new THREE.Triangle,i=new THREE.Vector3,s=new THREE.Vector3;return function(a,h,c,u,p,l){var f=this.zones[u].vertices,d=this.zones[u].groups[p],v=[c],E={};E[c.id]=0,e=void 0,s.set(0,0,0),t=Infinity,n.setFromCoplanarPoints(f[c.vertexIds[0]],f[c.vertexIds[1]],f[c.vertexIds[2]]),n.projectPoint(h,r),i.copy(r);for(var g=v.pop();g;g=v.pop()){o.set(f[g.vertexIds[0]],f[g.vertexIds[1]],f[g.vertexIds[2]]),o.closestPointToPoint(i,r),r.distanceToSquared(i)<t&&(e=g,s.copy(r),t=r.distanceToSquared(i));var y=E[g.id];if(!(y>2))for(var T=0;T<g.neighbours.length;T++){var M=d[g.neighbours[T]];M.id in E||(v.push(M),E[M.id]=y+1)}}return l.copy(s),e}}();var h={PLAYER:new THREE.Color(15631215).convertGammaToLinear(2.2).getHex(),TARGET:new THREE.Color(14469912).convertGammaToLinear(2.2).getHex(),PATH:new THREE.Color(41903).convertGammaToLinear(2.2).getHex(),WAYPOINT:new THREE.Color(41903).convertGammaToLinear(2.2).getHex(),CLAMPED_STEP:new THREE.Color(14472114).convertGammaToLinear(2.2).getHex(),CLOSEST_NODE:new THREE.Color(4417387).convertGammaToLinear(2.2).getHex()},c=function(e){function t(){var t=this;e.call(this),this._playerMarker=new THREE.Mesh(new THREE.SphereGeometry(.25,32,32),new THREE.MeshBasicMaterial({color:h.PLAYER})),this._targetMarker=new THREE.Mesh(new THREE.BoxGeometry(.3,.3,.3),new THREE.MeshBasicMaterial({color:h.TARGET})),this._nodeMarker=new THREE.Mesh(new THREE.BoxGeometry(.1,.8,.1),new THREE.MeshBasicMaterial({color:h.CLOSEST_NODE})),this._stepMarker=new THREE.Mesh(new THREE.BoxGeometry(.1,1,.1),new THREE.MeshBasicMaterial({color:h.CLAMPED_STEP})),this._pathMarker=new THREE.Object3D,this._pathLineMaterial=new THREE.LineBasicMaterial({color:h.PATH,linewidth:2}),this._pathPointMaterial=new THREE.MeshBasicMaterial({color:h.WAYPOINT}),this._pathPointGeometry=new THREE.SphereBufferGeometry(.08),this._markers=[this._playerMarker,this._targetMarker,this._nodeMarker,this._stepMarker,this._pathMarker],this._markers.forEach(function(e){e.visible=!1,t.add(e)})}return e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t,t.prototype.setPath=function(e){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);e=[this._playerMarker.position].concat(e);for(var t=new THREE.Geometry,r=0;r<e.length;r++)t.vertices.push(e[r].clone().add(new THREE.Vector3(0,.2,0)));this._pathMarker.add(new THREE.Line(t,this._pathLineMaterial));for(var n=0;n<e.length-1;n++){var o=new THREE.Mesh(this._pathPointGeometry,this._pathPointMaterial);o.position.copy(e[n]),o.position.y+=.2,this._pathMarker.add(o)}return this._pathMarker.visible=!0,this},t.prototype.setPlayerPosition=function(e){return this._playerMarker.position.copy(e),this._playerMarker.visible=!0,this},t.prototype.setTargetPosition=function(e){return this._targetMarker.position.copy(e),this._targetMarker.visible=!0,this},t.prototype.setNodePosition=function(e){return this._nodeMarker.position.copy(e),this._nodeMarker.visible=!0,this},t.prototype.setStepPosition=function(e){return this._stepMarker.position.copy(e),this._stepMarker.visible=!0,this},t.prototype.reset=function(){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);return this._markers.forEach(function(e){e.visible=!1}),this},t}(THREE.Object3D);e.Pathfinding=a,e.PathfindingHelper=c});
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("three")):"function"==typeof define&&define.amd?define(["exports","three"],t):t(e.threePathfinding={},e.THREE)}(this,function(e,t){var r=function(){};r.roundNumber=function(e,t){var r=Math.pow(10,t);return Math.round(e*r)/r},r.sample=function(e){return e[Math.floor(Math.random()*e.length)]},r.distanceToSquared=function(e,t){var r=e.x-t.x,n=e.y-t.y,o=e.z-t.z;return r*r+n*n+o*o},r.isPointInPoly=function(e,t){for(var r=!1,n=-1,o=e.length,i=o-1;++n<o;i=n)(e[n].z<=t.z&&t.z<e[i].z||e[i].z<=t.z&&t.z<e[n].z)&&t.x<(e[i].x-e[n].x)*(t.z-e[n].z)/(e[i].z-e[n].z)+e[n].x&&(r=!r);return r},r.isVectorInPolygon=function(e,t,r){var n=1e5,o=-1e5,i=[];return t.vertexIds.forEach(function(e){n=Math.min(r[e].y,n),o=Math.max(r[e].y,o),i.push(r[e])}),!!(e.y<o+.5&&e.y>n-.5&&this.isPointInPoly(i,e))},r.triarea2=function(e,t,r){return(r.x-e.x)*(t.z-e.z)-(t.x-e.x)*(r.z-e.z)},r.vequal=function(e,t){return this.distanceToSquared(e,t)<1e-5};var n=function(e){this.content=[],this.scoreFunction=e};n.prototype.push=function(e){this.content.push(e),this.sinkDown(this.content.length-1)},n.prototype.pop=function(){var e=this.content[0],t=this.content.pop();return this.content.length>0&&(this.content[0]=t,this.bubbleUp(0)),e},n.prototype.remove=function(e){var t=this.content.indexOf(e),r=this.content.pop();t!==this.content.length-1&&(this.content[t]=r,this.scoreFunction(r)<this.scoreFunction(e)?this.sinkDown(t):this.bubbleUp(t))},n.prototype.size=function(){return this.content.length},n.prototype.rescoreElement=function(e){this.sinkDown(this.content.indexOf(e))},n.prototype.sinkDown=function(e){for(var t=this.content[e];e>0;){var r=(e+1>>1)-1,n=this.content[r];if(!(this.scoreFunction(t)<this.scoreFunction(n)))break;this.content[r]=t,this.content[e]=n,e=r}},n.prototype.bubbleUp=function(e){for(var t=this.content.length,r=this.content[e],n=this.scoreFunction(r);;){var o=e+1<<1,i=o-1,s=null,a=void 0;if(i<t&&(a=this.scoreFunction(this.content[i]))<n&&(s=i),o<t&&this.scoreFunction(this.content[o])<(null===s?n:a)&&(s=o),null===s)break;this.content[e]=this.content[s],this.content[s]=r,e=s}};var o=function(){};o.init=function(e){for(var t=0;t<e.length;t++){var r=e[t];r.f=0,r.g=0,r.h=0,r.cost=1,r.visited=!1,r.closed=!1,r.parent=null}},o.cleanUp=function(e){for(var t=0;t<e.length;t++){var r=e[t];delete r.f,delete r.g,delete r.h,delete r.cost,delete r.visited,delete r.closed,delete r.parent}},o.heap=function(){return new n(function(e){return e.f})},o.search=function(e,t,r){this.init(e);var n=this.heap();for(n.push(t);n.size()>0;){var o=n.pop();if(o===r){for(var i=o,s=[];i.parent;)s.push(i),i=i.parent;return this.cleanUp(s),s.reverse()}o.closed=!0;for(var a=this.neighbours(e,o),h=0,c=a.length;h<c;h++){var u=a[h];if(!u.closed){var p=o.g+u.cost,l=u.visited;if(!l||p<u.g){if(u.visited=!0,u.parent=o,!u.centroid||!r.centroid)throw new Error("Unexpected state");u.h=u.h||this.heuristic(u.centroid,r.centroid),u.g=p,u.f=u.g+u.h,l?n.rescoreElement(u):n.push(u)}}}}return[]},o.heuristic=function(e,t){return r.distanceToSquared(e,t)},o.neighbours=function(e,t){for(var r=[],n=0;n<t.neighbours.length;n++)r.push(e[t.neighbours[n]]);return r};var i=function(){};i.buildZone=function(e){var n=this,o=this._buildNavigationMesh(e),i={};o.vertices.forEach(function(e){e.x=r.roundNumber(e.x,2),e.y=r.roundNumber(e.y,2),e.z=r.roundNumber(e.z,2)}),i.vertices=o.vertices;var s=this._buildPolygonGroups(o);return i.groups=new Array(s.length),s.forEach(function(e,o){var s=new Map;e.forEach(function(e,t){s.set(e,t)});var a=new Array(e.length);e.forEach(function(e,o){var h=[];e.neighbours.forEach(function(e){return h.push(s.get(e))});var c=[];e.neighbours.forEach(function(t){return c.push(n._getSharedVerticesInOrder(e,t))});var u=new t.Vector3(0,0,0);u.add(i.vertices[e.vertexIds[0]]),u.add(i.vertices[e.vertexIds[1]]),u.add(i.vertices[e.vertexIds[2]]),u.divideScalar(3),u.x=r.roundNumber(u.x,2),u.y=r.roundNumber(u.y,2),u.z=r.roundNumber(u.z,2),a[o]={id:o,neighbours:h,vertexIds:e.vertexIds,centroid:u,portals:c}}),i.groups[o]=a}),i},i._buildNavigationMesh=function(e){return e.mergeVertices(),this._buildPolygonsFromGeometry(e)},i._buildPolygonGroups=function(e){var t=[],r=function(e){e.neighbours.forEach(function(t){void 0===t.group&&(t.group=e.group,r(t))})};return e.polygons.forEach(function(e){void 0!==e.group?t[e.group].push(e):(e.group=t.length,r(e),t.push([e]))}),t},i._buildPolygonNeighbours=function(e,t){var r=new Set,n=t[e.vertexIds[1]],o=t[e.vertexIds[2]];return t[e.vertexIds[0]].forEach(function(t){t!==e&&(n.includes(t)||o.includes(t))&&r.add(t)}),n.forEach(function(t){t!==e&&o.includes(t)&&r.add(t)}),r},i._buildPolygonsFromGeometry=function(e){for(var t=this,r=[],n=e.vertices,o=new Array(n.length),i=0;i<n.length;i++)o[i]=[];return e.faces.forEach(function(e){var t={vertexIds:[e.a,e.b,e.c],neighbours:null};r.push(t),o[e.a].push(t),o[e.b].push(t),o[e.c].push(t)}),r.forEach(function(e){e.neighbours=t._buildPolygonNeighbours(e,o)}),{polygons:r,vertices:n}},i._getSharedVerticesInOrder=function(e,t){var r=e.vertexIds,n=r[0],o=r[1],i=r[2],s=t.vertexIds,a=s.includes(n),h=s.includes(o),c=s.includes(i);return a&&h&&c?Array.from(r):a&&h?[n,o]:h&&c?[o,i]:a&&c?[i,n]:(console.warn("Error processing navigation mesh neighbors; neighbors with <2 shared vertices found."),[])};var s=function(){this.portals=[]};s.prototype.push=function(e,t){void 0===t&&(t=e),this.portals.push({left:e,right:t})},s.prototype.stringPull=function(){var e,t,n,o=this.portals,i=[],s=0,a=0,h=0;t=o[0].left,n=o[0].right,i.push(e=o[0].left);for(var c=1;c<o.length;c++){var u=o[c].left,p=o[c].right;if(r.triarea2(e,n,p)<=0){if(!(r.vequal(e,n)||r.triarea2(e,t,p)>0)){i.push(t),t=e=t,n=e,a=s=a,h=s,c=s;continue}n=p,h=c}if(r.triarea2(e,t,u)>=0){if(!(r.vequal(e,t)||r.triarea2(e,n,u)<0)){i.push(n),t=e=n,n=e,a=s=h,h=s,c=s;continue}t=u,a=c}}return 0!==i.length&&r.vequal(i[i.length-1],o[o.length-1].left)||i.push(o[o.length-1].left),this.path=i,i};var a,h=function(){this.zones={}};h.createZone=function(e){return e.isGeometry?console.warn("[three-pathfinding]: Use BufferGeometry, not Geometry, to create zone."):e=(new t.Geometry).fromBufferGeometry(e),i.buildZone(e)},h.prototype.setZoneData=function(e,t){this.zones[e]=t},h.prototype.getRandomNode=function(e,n,o,i){if(!this.zones[e])return new t.Vector3;o=o||null,i=i||0;var s=[];return this.zones[e].groups[n].forEach(function(e){o&&i?r.distanceToSquared(o,e.centroid)<i*i&&s.push(e.centroid):s.push(e.centroid)}),r.sample(s)||new t.Vector3},h.prototype.getClosestNode=function(e,t,n,o){void 0===o&&(o=!1);var i=this.zones[t].vertices,s=null,a=Infinity;return this.zones[t].groups[n].forEach(function(t){var n=r.distanceToSquared(t.centroid,e);n<a&&(!o||r.isVectorInPolygon(e,t,i))&&(s=t,a=n)}),s},h.prototype.findPath=function(e,r,n,i){var a=this.zones[n].groups[i],h=this.zones[n].vertices,c=this.getClosestNode(e,n,i,!0),u=this.getClosestNode(r,n,i,!0);if(!c||!u)return null;var p=o.search(a,c,u),l=function(e,t){for(var r=0;r<e.neighbours.length;r++)if(e.neighbours[r]===t.id)return e.portals[r]},f=new s;f.push(e);for(var d=0;d<p.length;d++){var v=p[d+1];if(v){var g=l(p[d],v);f.push(h[g[0]],h[g[1]])}}f.push(r),f.stringPull();var y=f.path.map(function(e){return new t.Vector3(e.x,e.y,e.z)});return y.shift(),y},h.prototype.getGroup=(a=new t.Plane,function(e,t,n){if(void 0===n&&(n=!1),!this.zones[e])return null;for(var o=null,i=Math.pow(50,2),s=this.zones[e],h=0;h<s.groups.length;h++)for(var c=0,u=s.groups[h];c<u.length;c+=1){var p=u[c];if(n&&(a.setFromCoplanarPoints(s.vertices[p.vertexIds[0]],s.vertices[p.vertexIds[1]],s.vertices[p.vertexIds[2]]),Math.abs(a.distanceToPoint(t))<.01&&r.isPointInPoly([s.vertices[p.vertexIds[0]],s.vertices[p.vertexIds[1]],s.vertices[p.vertexIds[2]]],t)))return h;var l=r.distanceToSquared(p.centroid,t);l<i&&(o=h,i=l)}return o}),h.prototype.clampStep=function(){var e,r,n=new t.Vector3,o=new t.Plane,i=new t.Triangle,s=new t.Vector3,a=new t.Vector3;return function(t,h,c,u,p,l){var f=this.zones[u].vertices,d=this.zones[u].groups[p],v=[c],g={};g[c.id]=0,e=void 0,a.set(0,0,0),r=Infinity,o.setFromCoplanarPoints(f[c.vertexIds[0]],f[c.vertexIds[1]],f[c.vertexIds[2]]),o.projectPoint(h,n),s.copy(n);for(var y=v.pop();y;y=v.pop()){i.set(f[y.vertexIds[0]],f[y.vertexIds[1]],f[y.vertexIds[2]]),i.closestPointToPoint(s,n),n.distanceToSquared(s)<r&&(e=y,a.copy(n),r=n.distanceToSquared(s));var M=g[y.id];if(!(M>2))for(var b=0;b<y.neighbours.length;b++){var m=d[y.neighbours[b]];m.id in g||(v.push(m),g[m.id]=M+1)}}return l.copy(a),e}}();var c={PLAYER:new t.Color(15631215).convertGammaToLinear(2.2).getHex(),TARGET:new t.Color(14469912).convertGammaToLinear(2.2).getHex(),PATH:new t.Color(41903).convertGammaToLinear(2.2).getHex(),WAYPOINT:new t.Color(41903).convertGammaToLinear(2.2).getHex(),CLAMPED_STEP:new t.Color(14472114).convertGammaToLinear(2.2).getHex(),CLOSEST_NODE:new t.Color(4417387).convertGammaToLinear(2.2).getHex()},u=function(e){function r(){var r=this;e.call(this),this._playerMarker=new t.Mesh(new t.SphereGeometry(.25,32,32),new t.MeshBasicMaterial({color:c.PLAYER})),this._targetMarker=new t.Mesh(new t.BoxGeometry(.3,.3,.3),new t.MeshBasicMaterial({color:c.TARGET})),this._nodeMarker=new t.Mesh(new t.BoxGeometry(.1,.8,.1),new t.MeshBasicMaterial({color:c.CLOSEST_NODE})),this._stepMarker=new t.Mesh(new t.BoxGeometry(.1,1,.1),new t.MeshBasicMaterial({color:c.CLAMPED_STEP})),this._pathMarker=new e,this._pathLineMaterial=new t.LineBasicMaterial({color:c.PATH,linewidth:2}),this._pathPointMaterial=new t.MeshBasicMaterial({color:c.WAYPOINT}),this._pathPointGeometry=new t.SphereBufferGeometry(.08),this._markers=[this._playerMarker,this._targetMarker,this._nodeMarker,this._stepMarker,this._pathMarker],this._markers.forEach(function(e){e.visible=!1,r.add(e)})}return e&&(r.__proto__=e),(r.prototype=Object.create(e&&e.prototype)).constructor=r,r.prototype.setPath=function(e){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);e=[this._playerMarker.position].concat(e);for(var r=new t.Geometry,n=0;n<e.length;n++)r.vertices.push(e[n].clone().add(new t.Vector3(0,.2,0)));this._pathMarker.add(new t.Line(r,this._pathLineMaterial));for(var o=0;o<e.length-1;o++){var i=new t.Mesh(this._pathPointGeometry,this._pathPointMaterial);i.position.copy(e[o]),i.position.y+=.2,this._pathMarker.add(i)}return this._pathMarker.visible=!0,this},r.prototype.setPlayerPosition=function(e){return this._playerMarker.position.copy(e),this._playerMarker.visible=!0,this},r.prototype.setTargetPosition=function(e){return this._targetMarker.position.copy(e),this._targetMarker.visible=!0,this},r.prototype.setNodePosition=function(e){return this._nodeMarker.position.copy(e),this._nodeMarker.visible=!0,this},r.prototype.setStepPosition=function(e){return this._stepMarker.position.copy(e),this._stepMarker.visible=!0,this},r.prototype.reset=function(){for(;this._pathMarker.children.length;)this._pathMarker.children[0].visible=!1,this._pathMarker.remove(this._pathMarker.children[0]);return this._markers.forEach(function(e){e.visible=!1}),this},r}(t.Object3D);e.Pathfinding=h,e.PathfindingHelper=u});
//# sourceMappingURL=three-pathfinding.umd.js.map
{
"name": "three-pathfinding",
"version": "0.11.1",
"version": "0.12.0",
"description": "Navigation mesh toolkit for three.js, based on PatrolJS",
"author": "Don McCurdy <dm@donmccurdy.com>",
"contributors": [
"Don McCurdy <dm@donmccurdy.com>",
"Uwe Sölen Flaig <uwe.soelen.flaig@gmail.com>"
],
"license": "MIT",

@@ -15,5 +19,5 @@ "repository": {

"scripts": {
"dev": "concurrently \"microbundle watch --target browser\" \"serve --listen 5000\"",
"dev": "concurrently \"microbundle watch --target web --globals three=THREE --external three\" \"serve --listen 5000\"",
"docs": "documentation build src/Pathfinding.js src/PathfindingHelper.js --shallow -f md | replace-between --target README.md --token API",
"dist": "microbundle --target browser",
"dist": "microbundle --target web --globals three=THREE --external three",
"version": "npm run dist && npm test && git add -A dist",

@@ -46,3 +50,3 @@ "postversion": "git push && git push --tags && npm publish",

"documentation": "^5.3.3",
"microbundle": "^0.5.1",
"microbundle": "^0.11.0",
"replace-between": "0.0.8",

@@ -49,0 +53,0 @@ "serve": "^9.2.0",

@@ -0,1 +1,5 @@

import {
Vector3,
} from 'three';
import { Utils } from './Utils';

@@ -6,3 +10,3 @@

* Constructs groups from the given navigation mesh.
* @param {THREE.Geometry} geometry
* @param {Geometry} geometry
* @return {Zone}

@@ -45,3 +49,3 @@ */

const centroid = new THREE.Vector3( 0, 0, 0 );
const centroid = new Vector3( 0, 0, 0 );
centroid.add( zone.vertices[ poly.vertexIds[0] ] );

@@ -72,3 +76,3 @@ centroid.add( zone.vertices[ poly.vertexIds[1] ] );

* Constructs a navigation mesh from the given geometry.
* @param {THREE.Geometry} geometry
* @param {Geometry} geometry
* @return {Object}

@@ -75,0 +79,0 @@ */

@@ -1,2 +0,7 @@

/* global THREE */
import {
Vector3,
Plane,
Geometry,
Triangle,
} from 'three';

@@ -18,3 +23,3 @@ import { Utils } from './Utils';

* (Static) Builds a zone/node set from navigation mesh geometry.
* @param {THREE.BufferGeometry} geometry
* @param {BufferGeometry} geometry
* @return {Zone}

@@ -26,5 +31,5 @@ */

// not-recommended these days, so go ahead and start warning.
console.warn('[three-pathfinding]: Use THREE.BufferGeometry, not THREE.Geometry, to create zone.');
console.warn('[three-pathfinding]: Use BufferGeometry, not Geometry, to create zone.');
} else {
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
geometry = new Geometry().fromBufferGeometry(geometry);
}

@@ -48,3 +53,3 @@

* @param {number} groupID
* @param {THREE.Vector3} nearPosition
* @param {Vector3} nearPosition
* @param {number} nearRange

@@ -55,3 +60,3 @@ * @return {Node}

if (!this.zones[zoneID]) return new THREE.Vector3();
if (!this.zones[zoneID]) return new Vector3();

@@ -74,3 +79,3 @@ nearPosition = nearPosition || null;

return Utils.sample(candidates) || new THREE.Vector3();
return Utils.sample(candidates) || new Vector3();
}

@@ -80,3 +85,3 @@

* Returns the closest node to the target position.
* @param {THREE.Vector3} position
* @param {Vector3} position
* @param {string} zoneID

@@ -109,7 +114,7 @@ * @param {number} groupID

*
* @param {THREE.Vector3} startPosition Start position.
* @param {THREE.Vector3} targetPosition Destination.
* @param {Vector3} startPosition Start position.
* @param {Vector3} targetPosition Destination.
* @param {string} zoneID ID of current zone.
* @param {number} groupID Current group ID.
* @return {Array<THREE.Vector3>} Array of points defining the path.
* @return {Array<Vector3>} Array of points defining the path.
*/

@@ -157,3 +162,3 @@ findPath (startPosition, targetPosition, zoneID, groupID) {

// Return the path, omitting first position (which is already known).
const path = channel.path.map((c) => new THREE.Vector3(c.x, c.y, c.z));
const path = channel.path.map((c) => new Vector3(c.x, c.y, c.z));
path.shift();

@@ -167,7 +172,7 @@ return path;

* @param {string} zoneID
* @param {THREE.Vector3} position
* @param {Vector3} position
* @return {number}
*/
Pathfinding.prototype.getGroup = (function() {
const plane = new THREE.Plane();
const plane = new Plane();
return function (zoneID, position, checkPolygon = false) {

@@ -216,19 +221,19 @@ if (!this.zones[zoneID]) return null;

*
* @param {THREE.Vector3} start
* @param {THREE.Vector3} end Desired endpoint.
* @param {Vector3} start
* @param {Vector3} end Desired endpoint.
* @param {Node} node
* @param {string} zoneID
* @param {number} groupID
* @param {THREE.Vector3} endTarget Updated endpoint.
* @param {Vector3} endTarget Updated endpoint.
* @return {Node} Updated node.
*/
Pathfinding.prototype.clampStep = (function () {
const point = new THREE.Vector3();
const plane = new THREE.Plane();
const triangle = new THREE.Triangle();
const point = new Vector3();
const plane = new Plane();
const triangle = new Triangle();
const endPoint = new THREE.Vector3();
const endPoint = new Vector3();
let closestNode;
let closestPoint = new THREE.Vector3();
let closestPoint = new Vector3();
let closestDistance;

@@ -295,3 +300,3 @@

* @property {Array<Group>} groups
* @property {Array<THREE.Vector3} vertices
* @property {Array<Vector3>} vertices
*/

@@ -313,4 +318,4 @@ const Zone = {}; // jshint ignore:line

* @property {Array<number>} neighbours IDs of neighboring nodes.
* @property {Array<number} vertexIds
* @property {THREE.Vector3} centroid
* @property {Array<number>} vertexIds
* @property {Vector3} centroid
* @property {Array<Array<number>>} portals Array of portals, each defined by two vertex IDs.

@@ -317,0 +322,0 @@ * @property {boolean} closed

@@ -1,10 +0,22 @@

/* global THREE */
import {
Color,
Object3D,
LineBasicMaterial,
MeshBasicMaterial,
SphereBufferGeometry,
BoxGeometry,
Mesh,
SphereGeometry,
Geometry,
Vector3,
Line,
} from 'three';
const Color = {
PLAYER: new THREE.Color( 0xEE836F ).convertGammaToLinear( 2.2 ).getHex(),
TARGET: new THREE.Color( 0xDCCB18 ).convertGammaToLinear( 2.2 ).getHex(),
PATH: new THREE.Color( 0x00A3AF ).convertGammaToLinear( 2.2 ).getHex(),
WAYPOINT: new THREE.Color( 0x00A3AF ).convertGammaToLinear( 2.2 ).getHex(),
CLAMPED_STEP: new THREE.Color( 0xDCD3B2 ).convertGammaToLinear( 2.2 ).getHex(),
CLOSEST_NODE: new THREE.Color( 0x43676B ).convertGammaToLinear( 2.2 ).getHex(),
const colors = {
PLAYER: new Color( 0xee836f ).convertGammaToLinear( 2.2 ).getHex(),
TARGET: new Color( 0xdccb18 ).convertGammaToLinear( 2.2 ).getHex(),
PATH: new Color( 0x00a3af ).convertGammaToLinear( 2.2 ).getHex(),
WAYPOINT: new Color( 0x00a3af ).convertGammaToLinear( 2.2 ).getHex(),
CLAMPED_STEP: new Color( 0xdcd3b2 ).convertGammaToLinear( 2.2 ).getHex(),
CLOSEST_NODE: new Color( 0x43676b ).convertGammaToLinear( 2.2 ).getHex(),
};

@@ -17,33 +29,33 @@

*/
class PathfindingHelper extends THREE.Object3D {
class PathfindingHelper extends Object3D {
constructor () {
super();
this._playerMarker = new THREE.Mesh(
new THREE.SphereGeometry( 0.25, 32, 32 ),
new THREE.MeshBasicMaterial( {color: Color.PLAYER} )
this._playerMarker = new Mesh(
new SphereGeometry( 0.25, 32, 32 ),
new MeshBasicMaterial( { color: colors.PLAYER } )
);
this._targetMarker = new THREE.Mesh(
new THREE.BoxGeometry( 0.3, 0.3, 0.3 ),
new THREE.MeshBasicMaterial( {color: Color.TARGET} )
this._targetMarker = new Mesh(
new BoxGeometry( 0.3, 0.3, 0.3 ),
new MeshBasicMaterial( { color: colors.TARGET } )
);
this._nodeMarker = new THREE.Mesh(
new THREE.BoxGeometry( 0.1, 0.8, 0.1 ),
new THREE.MeshBasicMaterial( { color: Color.CLOSEST_NODE } )
this._nodeMarker = new Mesh(
new BoxGeometry( 0.1, 0.8, 0.1 ),
new MeshBasicMaterial( { color: colors.CLOSEST_NODE } )
);
this._stepMarker = new THREE.Mesh(
new THREE.BoxGeometry( 0.1, 1, 0.1 ),
new THREE.MeshBasicMaterial( { color: Color.CLAMPED_STEP } )
this._stepMarker = new Mesh(
new BoxGeometry( 0.1, 1, 0.1 ),
new MeshBasicMaterial( { color: colors.CLAMPED_STEP } )
);
this._pathMarker = new THREE.Object3D();
this._pathMarker = new Object3D();
this._pathLineMaterial = new THREE.LineBasicMaterial( { color: Color.PATH, linewidth: 2 } ) ;
this._pathPointMaterial = new THREE.MeshBasicMaterial( { color: Color.WAYPOINT } );
this._pathPointGeometry = new THREE.SphereBufferGeometry( 0.08 );
this._pathLineMaterial = new LineBasicMaterial( { color: colors.PATH, linewidth: 2 } ) ;
this._pathPointMaterial = new MeshBasicMaterial( { color: colors.WAYPOINT } );
this._pathPointGeometry = new SphereBufferGeometry( 0.08 );

@@ -69,3 +81,3 @@ this._markers = [

/**
* @param {Array<THREE.Vector3} path
* @param {Array<Vector3>} path
* @return {this}

@@ -85,11 +97,11 @@ */

// Draw debug lines
const geometry = new THREE.Geometry();
const geometry = new Geometry();
for (let i = 0; i < path.length; i++) {
geometry.vertices.push( path[ i ].clone().add( new THREE.Vector3( 0, OFFSET, 0 ) ) );
geometry.vertices.push( path[ i ].clone().add( new Vector3( 0, OFFSET, 0 ) ) );
}
this._pathMarker.add( new THREE.Line( geometry, this._pathLineMaterial ) );
this._pathMarker.add( new Line( geometry, this._pathLineMaterial ) );
for ( let i = 0; i < path.length - 1; i++ ) {
const node = new THREE.Mesh( this._pathPointGeometry, this._pathPointMaterial );
const node = new Mesh( this._pathPointGeometry, this._pathPointMaterial );
node.position.copy( path[ i ] );

@@ -108,3 +120,3 @@ node.position.y += OFFSET;

/**
* @param {THREE.Vector3} position
* @param {Vector3} position
* @return {this}

@@ -121,3 +133,3 @@ */

/**
* @param {THREE.Vector3} position
* @param {Vector3} position
* @return {this}

@@ -134,3 +146,3 @@ */

/**
* @param {THREE.Vector3} position
* @param {Vector3} position
* @return {this}

@@ -147,3 +159,3 @@ */

/**
* @param {THREE.Vector3} position
* @param {Vector3} position
* @return {this}

@@ -150,0 +162,0 @@ */

@@ -154,2 +154,2 @@ const THREE = global.THREE = require('three');

return v;
}
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc