UNPKG

@three3d/tools

Version:

@three3d/tools 提供了 ThreeJS 常用的工具库

2 lines (1 loc) 28 kB
var Tools=function(l,m){"use strict";var Xt=Object.defineProperty;var Yt=(l,m,I)=>m in l?Xt(l,m,{enumerable:!0,configurable:!0,writable:!0,value:I}):l[m]=I;var W=(l,m,I)=>(Yt(l,typeof m!="symbol"?m+"":m,I),I);function I(n){const e=n.curves[0].getPoint(0),t=n.curves[n.curves.length-1].getPoint(1);if(!e.equals(t)){const o=e.isVector3&&t.isVector3?m.LineCurve3:m.LineCurve;n.curves.push(new o(t,e))}return n}function vn(){m.CurvePath.prototype.closePath=function(){I(this)}}function nt(n){var e=typeof n;return n==null||e!=="object"&&e!=="function"}function tt(n){return n&&typeof n[Symbol.iterator]=="function"}l.Axis=(n=>(n[n.x=0]="x",n[n.y=1]="y",n[n.z=2]="z",n))(l.Axis||{}),(n=>{function e(c){return n[c]}n.toKey=e;function t(c){return n[c]}n.toIndex=t;function o(c){const s=(c+1)%3,i=(c+2)%3;return[s,i]}n.getCrossAxiss=o})(l.Axis||(l.Axis={})),l.Axis4=(n=>(n[n.x=0]="x",n[n.y=1]="y",n[n.z=2]="z",n[n.w=3]="w",n))(l.Axis4||{}),(n=>{function e(c){return n[c]}n.toKey=e;function t(c){return n[c]}n.toIndex=t;function o(c){const s=(c+1)%4,i=(c+2)%4;return[s,i]}n.getCrossAxiss=o})(l.Axis4||(l.Axis4={}));function cn(n){return n.w!==void 0?[m.Vector4,4]:n.z!==void 0?[m.Vector3,3]:[m.Vector2,2]}function Ln(n){return n.w!=null?new m.Vector4().copy(n):n.z!=null?new m.Vector3().copy(n):new m.Vector2().copy(n)}function G(n,e,t){t=t??0;const o=t+1;if(nt(n))return n;if(n.x!=null&&n.y!=null)return Ln(n);if(Array.isArray(n))return n.map(s=>G(s,e,o));if(n instanceof Map){const s=new Map;for(const i of n.keys()){const r=n.get(i),a=G(r,e,o);s.set(i,a)}return s}if(tt(n)){const s=[];for(const i of n){const r=G(i,e,o);s.push(r)}return s}if((e||t===0)&&typeof n=="object"){const s={};for(const i of Object.keys(n))s[i]=G(n[i],e,o);return s}return n}function F(n,e,t,o){const c=(o==null?void 0:o.copy(n))||n.clone();return c.cross(e),c.lengthSq()===0&&(t?Math.abs(e.z)===1?n.x-=1e-4:n.z+=1e-4:Math.abs(n.x)===1?e.z-=1e-4:e.x+=1e-4,e.normalize(),c.crossVectors(n,e)),t?n.copy(e).cross(c):e.copy(c).cross(n),c.normalize(),e.normalize(),n.normalize(),{tangent:n,normal:e,binormal:c}}function Cn(n,e,t,o){const{binormal:c}=F(n,e,t,o);return c.negate(),{front:n,up:e,binormal:c}}function et(n){const{tangent:e,normal:t,binormal:o}=n;return{front:e,up:t,binormal:o.clone().negate()}}function ot(n){const{front:e,up:t,binormal:o}=n;return{tangent:e,normal:t,binormal:o.clone().negate()}}function ct(n,e,t,o){const{front:c,up:s,binormal:i}=Cn(n.clone().normalize(),e.clone().normalize(),t),r=o??new m.Matrix3,a=r.elements;return i.toArray(a,0),s.toArray(a,3),c.toArray(a,6),r}function st(n,e,t,o){const c=n.clone().projectOnPlane(t).normalize(),s=e.clone().projectOnPlane(t).normalize();return o=o??new m.Quaternion,o.setFromUnitVectors(c,s),o}function w(n,e){const t=e.toArray(),o=t.findIndex(c=>c!==0);return t[o]/n.toArray()[o]}function H(n,e){const t=n.clone().cross(e);return typeof t=="number"?t===0:t.lengthSq()===0}function it(n){const e=n.length,t=[];if(e===0)return t;const[o,c]=cn(n[0]);for(let s=0;s<e;s++){const i=n[s],r=new o().copy(i),a=i.radius,f=t[s]??(t[s]=[]);for(let u=s+1;u<e;u++){const g=n[u];r.distanceToSquared(g)<=(g.radius+a)**2&&(f.push(u),(t[u]=[]).push(s))}}return t}function rt(n,e,t,o="srgb"){const c=new OffscreenCanvas(e,t).getContext("2d"),s=c.createLinearGradient(0,0,256,1);for(const[i,r]of n)s.addColorStop(Number(i),r);return c.fillStyle=s,c.fillRect(0,0,e,t),c.getImageData(0,0,e,t,{colorSpace:o})}function at(n,e){const{x:t,y:o}=e;return n.z*o*t+n.y*t+n.x}function lt(n,e,t=1){let{x:o,y:c,z:s}=e;const i=n.size;return o=Math.max(0,Math.min(i.x-1,o)),c=Math.max(0,Math.min(i.y-1,c)),s=Math.max(0,Math.min(i.z-1,s)),An(n,{x:o,y:c,z:s},t)}function An(n,e,t=1){const{data:o,size:c}=n,s=at(e,c);let i=[];if(t>0){const r=s*t;for(let a=0;a<t;a++)i.push(o[r+a])}return{index:s,value:i}}function ut(n,e,t,o=1){const{size:c}=n,s=l.Axis.toKey(e),[i,r]=l.Axis.getCrossAxiss(e),a=l.Axis.toKey(i),f=l.Axis.toKey(r),u=c[a],g=c[f],p=[],h=c[s];t=Math.trunc(t),t=Math.max(0,Math.min(h-1,t));let y={x:0,y:0,z:0};y[s]=t;for(let b=0;b<g;b++){y[f]=b;for(let L=0;L<u;L++){y[a]=L;const{value:C}=An(n,y,o);p.push(...C)}}return{data:p,size:{x:u,y:g}}}let wn;function ft(n){if(typeof n=="string")return(wn||(wn=new m.TextureLoader)).load(n);if(n.isTexture)return n;const e=Array.isArray(n)?rt(n,256,1):n,t=new m.Texture(e);return e.colorSpace==="srgb"&&(t.colorSpace="srgb"),t.needsUpdate=!0,t}function On(n,e){const t=Math.sqrt(n.lengthSq()*e.lengthSq());if(t===0)return 0;let o=n.dot(e)/t;return o=Math.max(-1,Math.min(1,o)),Math.acos(o)}function E(n,e,t){let o=On(n,e);return o===0?o:n.clone().cross(e).dot(t)<0?-o:o}function Sn(n,e,t){return n=n.clone().projectOnPlane(t),e=e.clone().projectOnPlane(t),E(n,e,t)}function Tn(n,e,t){const o=e.clone().negate(),c=t.clone().projectOnPlane(e),s=n.clone().projectOnPlane(c),i=E(e,s,c),r=e.clone().cross(c),a=n.clone().projectOnPlane(r),f=E(e,a,r),u=n.clone().projectOnPlane(o),g=E(c,u,o);return{yaw:i,pitch:f,roll:g}}const sn=180/Math.PI,J={yaw:[{name:"前",range:[-15,15]},{name:"左",range:[15,165]},{name:"右",range:[-165,-15]},{name:"后",range:[-180.1,-165]},{name:"后",range:[165,180.1]}],pitch:[{name:"前",range:[-15,15]},{name:"上",range:[15,165]},{name:"下",range:[-165,-15]},{name:"后",range:[-180.1,-165]},{name:"后",range:[165,180.1]}],roll:[{name:"上",range:[-15,15]},{name:"左",range:[15,165]},{name:"右",range:[-165,-15]},{name:"下",range:[-180.1,-165]},{name:"下",range:[165,180.1]}]};function Pn(n){const e={};for(const[t,o]of Object.entries(n))e[t]=Array.isArray(o)?o:Object.entries(o).map(([c,s])=>({name:c,range:s}));return e}const v={degrees:!0,map:J,front:{x:0,y:0,z:1},up:{x:0,y:1,z:0}};class rn{constructor(e){W(this,"_options");W(this,"_listMap");W(this,"_front");W(this,"_up");e&&(this.options=e)}static get options(){return this._options??(this.options=v)}static set options(e){this._options=Object.assign({},structuredClone(J),e)}get defaultOptions(){return this.constructor.options}get options(){return this._options??(this.options=this.defaultOptions)}set options(e){this._options=Object.assign({},structuredClone(this.defaultOptions),e),this._listMap=null,this._front=null,this._up=null}get degrees(){return this.options.degrees??(this.options.degrees=this.defaultOptions.degrees??!0)}set degrees(e){this.options.degrees=e}get map(){return this.options.map||(this.map=this.defaultOptions.map),this.options.map}set map(e){const t=structuredClone(this.defaultOptions.map),o=structuredClone(J);e=e?{yaw:e.yaw??t.yaw??o.yaw,pitch:e.pitch??t.pitch??o.pitch,roll:e.roll??t.roll??o.roll}:t,this.options.map=e,this._listMap=null}get listMap(){return this._listMap??(this._listMap=Pn(this.map??{}))}get front(){return this._front||(this.front=this.options.front??this.defaultOptions.front??v.front),this._front}set front(e){this._front=new m.Vector3().copy(e)}get up(){return this._up||(this.up=this.options.up??this.defaultOptions.up??v.up),this._up}set up(e){this._up=new m.Vector3().copy(e)}computeAzimuth(e,t,o){const c=new m.Vector3().copy(e),s=new m.Vector3().copy(t??this.front),i=new m.Vector3().copy(o??this.up);let{yaw:r,pitch:a,roll:f}=Tn(c,s,i);return this.degrees&&(r*=sn,a*=sn,f*=sn),{yaw:{angle:r,name:this.findAzimuthNames("yaw",r)},pitch:{angle:a,name:this.findAzimuthNames("pitch",a)},roll:{angle:f,name:this.findAzimuthNames("roll",f)}}}findAzimuthNames(e,t){const o=[],c=this.listMap[e];if(!c)return o;for(const{name:s,range:[i,r]}of c)(t>=i&&t<r||t<=i&&t>r)&&o.push(s);return o}}W(rn,"_options");const mt=new rn,gt={[m.AlphaFormat]:1,[m.RedFormat]:1,[m.RedIntegerFormat]:1,[m.RGFormat]:3,[m.RGIntegerFormat]:2,[m.RGBAFormat]:4,[m.RGBAIntegerFormat]:4,[m.LuminanceFormat]:1,[m.LuminanceAlphaFormat]:2,[m.DepthFormat]:1,[m.DepthStencilFormat]:2};function an(n){return gt[n]}function pt(n,e,t){const{data:o,width:c,height:s,depth:i}=n.image,r=an(n.format);return ut({data:o,size:{x:c,y:s,z:i}},e,t,r)}function ht(n,e){const{data:t,width:o,height:c,depth:s}=n.image,i=an(n.format);return lt({data:t,size:{x:o,y:c,z:s}},e,i)}var d=(n=>(n.Dissociation="相离",n.Intersect="相交",n.Tangency="相切",n.Contain="包含",n))(d||{});function dt(n,e){const[t,o]=n,{center:c,radius:s}=e,i=o.clone().sub(t),r=c.clone().sub(t),a=i.lengthSq(),f=i.dot(r)**2,u=a*(r.lengthSq()-s**2),g=f-u;return g<0?d.Dissociation:g===0?d.Tangency:d.Intersect}function D(n,e){const[t,o]=n,{center:c,radius:s}=e,i=o.clone().sub(t),r=t.clone().sub(c),a=i.lengthSq(),f=2*i.dot(r),u=r.lengthSq()-s**2,g=f**2-4*a*u;if(g<0)return[];const p=a*2,h=-f/p;if(g===0)return[h];const b=Math.sqrt(g)/p,L=h-b,C=h+b;return[L,C]}function yt(n,e){const[t,o]=n,c=o.clone().sub(t);return D(n,e).map(i=>c.clone().multiplyScalar(i).add(t))}function Vn(n,e){const t=D(n,e),o=t.length;if(o===0)return d.Dissociation;let c=0,s=0,i=0;for(const a of t)a<0?c++:a>1?s++:(a===0||a===1)&&i++;const r=c+s;return o===1&&r===0?d.Tangency:c===1&&s===1||i===2?d.Contain:c===2||s===2?d.Dissociation:d.Intersect}function In(n,e){const[t,o]=n,c=o.clone().sub(t),s=D(n,e),i=[];for(const r of s){if(r<0||r>1)continue;const a=c.clone().multiplyScalar(r).add(t);i.push(a)}return i}function bt(n,e){const t=D(n,e),o=t.length;if(o===0)return d.Dissociation;let c=0;for(const s of t)s<0&&c++;return o===1&&c===0?d.Tangency:c===2?d.Dissociation:d.Intersect}function Lt(n,e){const[t,o]=n,c=o.clone().sub(t),s=D(n,e),i=[];for(const r of s){if(r<0)continue;const a=c.clone().multiplyScalar(r).add(t);i.push(a)}return i}function ln(n,e){const[t,o]=n,c=o.clone().sub(t),[s,i]=e,r=i.clone().sub(s);if(H(r,c)){const a=s.clone().sub(t);return H(a,c)?d.Tangency:d.Dissociation}return d.Intersect}function K(n,e){const[t,o]=n,c=o.clone().sub(t),[s,i]=e,r=i.clone().sub(s),a=c.clone().cross(r),[f,u]=cn(t);if(u===2?a===0:a.equals(new f))return null;const h=s.clone().sub(t).cross(r),y=u===2?h/a:w(a,h);return c.clone().multiplyScalar(y).add(t)}function Mn(n,e){const[t,o]=e,[c,s]=n,i=s.clone().sub(c),r=ln(n,e);if(r===d.Tangency){let p=0;return w(i,t.clone().sub(c))<0&&p++,w(i,o.clone().sub(c))<0&&p++,p===2?d.Dissociation:p===0?d.Contain:d.Tangency}if(r!==d.Intersect)return r;const a=K(n,e),f=o.clone().sub(t),u=w(f,a.clone().sub(t));return u<0||u>1||w(i,a.clone().sub(c))<0?d.Dissociation:d.Intersect}function Bn(n,e){const t=K(n,e);if(t===null)return null;const[o,c]=e,s=c.clone().sub(o),i=w(s,t.clone().sub(o));if(i<0||i>1)return null;const[r,a]=n,f=a.clone().sub(r);return w(f,t.clone().sub(r))<0?null:t}function Ct(n,e){const[t,o]=n,[c,s]=e,i=o.clone().sub(t),r=ln(n,e);if(r===d.Tangency){let p=0,h=0;const y=w(i,c.clone().sub(t));y<0?p++:y>1&&h++;const b=w(i,s.clone().sub(t));return b<0?p++:b>1&&h++,p===2||h===2?d.Dissociation:p+h===1?d.Tangency:d.Contain}if(r!==d.Intersect)return r;const a=K(n,e),f=s.clone().sub(c),u=w(f,a.clone().sub(c));if(u<0||u>1)return d.Dissociation;const g=w(i,a.clone().sub(t));return g<0||g>1?d.Dissociation:d.Intersect}function At(n,e){const t=K(n,e);if(t===null)return null;const[o,c]=e,s=c.clone().sub(o),i=w(s,t.clone().sub(o));if(i<0||i>1)return null;const[r,a]=n,f=a.clone().sub(r),u=w(f,t.clone().sub(r));return u<0||u>1?null:t}function _n(n,e){const[t,o]=n,c=e.clone().sub(t),s=o.clone().sub(t);if(H(s,c)){const i=w(s,c);return i<0||i>1?d.Tangency:d.Contain}return d.Dissociation}function wt(n,e){const t=e.length;let o,c=!1;for(let s=0;s<t;s++){const i=e[s];let r=s+1;r===t&&(r=0);const a=e[r],f=new m.Vector2().subVectors(a,i),g=new m.Vector2().subVectors(n,i).cross(f);g===0&&(c=!0);const p=Math.sign(g);o!==void 0&&o!==p&&d.Dissociation,o=p}return c?d.Tangency:d.Contain}function zn(n,e){const t=[n,n.clone().add(new m.Vector2(10,0))],o=e.length;let c=0;for(let s=0;s<o;s++){const i=e[s];let r=s+1;r===o&&(r=0);const a=e[r],f=[i,a];if(_n(f,n)===d.Contain)return d.Tangency;const g=Mn(t,f);if(g===d.Contain){c+=2;continue}if(g===d.Intersect){Bn(t,f);let p=0;i.y>n.y&&p++,a.y>n.y&&p++,p===1&&c++}}return c%2===0?d.Dissociation:d.Contain}function Ot(n,e){const t=n.length;let o=0,c=0;for(let a=0;a<t;a++){const f=n[a];let u=a+1;u===t&&(u=0);const g=n[u],h=Vn([f,g],e);if(h===d.Intersect)return d.Intersect;h===d.Contain?o++:h===d.Tangency&&c++}if(o===t)return d.Contain;if(o>0)return d.Intersect;const{center:s,radius:i}=e,r=zn(s,n);return i===0?r:r===d.Contain?d.Contain:c>0?d.Tangency:d.Dissociation}function St(n,e){const t=n.length;let o=[];for(let c=0;c<t;c++){const s=n[c];let i=c+1;i===t&&(i=0);const r=n[i],f=In([s,r],e);o=[...o,...f]}return o}function Tt(n,e){if(e=e??n.arcLengthDivisions,n.cacheArcULengths&&n.cacheArcULengths.length===e+1&&!n.needsUpdate){const s=n.cacheArcULengths;return{lengths:s,length:s[e]}}n.needsUpdate=!1;const t=[0];let o=n.getPoint(0),c=0;for(let s=1;s<=e;s++){const i=n.getPointAt(s/e);c+=i.distanceTo(o),t.push(c),o=i}return n.cacheArcULengths=t,{lengths:t,length:c}}function Pt(n,e,t){const o=t?a=>n.getPointAt(a):a=>n.getPoint(a);let c=o(0),s=0;const i=[],r=e.length;for(let a=0;a<r;a++){const f=e[a],u=o(f);s+=u.distanceTo(c),i.push(s),c=u}return{lengths:i,length:i[r-1]}}function un(n,e){let t=n.sampleLength;if(!t){const o=n.sampleNum;if(o)return o;t=1}return Math.ceil(e/t)}function Vt(n){const{curve:e}=n;let t=e.getLength();const o=un(n,t);return e.arcLengthDivisions<o&&(e.arcLengthDivisions=o,e.updateArcLengths(),t=e.getLength()),{length:t,division:o}}var Rn=(n=>(n.back="back",n.front="front",n))(Rn||{});function It(n){const{curve:e,distance:t,fromU:o=0,side:c,tolerance:s=t*.1}=n,i=n.length??e.getLength(),r=e.getPointAt(o);let a=t/i;const f=c==="front"?-1:1;let u=!0,g=o,p=r,h=0,y=!0;do{g=f*a+o;let b=!1;g>1?(g=1,b=!0):g<0&&(g=0,b=!0),p=e.getPointAt(g),h=p.distanceTo(r),u=Math.abs(t-h)>s;const L=t/h;if(b&&u&&L>1){y=!1;break}a*=L}while(u);return{succeed:y,u:g,point:p,distance:h}}function Mt(n){const{curve:e,distance:t,fromU:o=0,tolerance:c=t*.1,origin:s}=n,i=n.length??e.getLength(),r=e.getPointAt(o),a=r.distanceTo(s),f=t-a;let u=f/i,g=!0,p=o,h=r;do{p=u+o;let y=!1;p>1?(p=1,y=!0):p<0&&(p=0,y=!0),h=e.getPointAt(p);const b=h.distanceTo(s);g=Math.abs(t-b)>c;const L=f/(b-a);if(y&&g&&L>1)return null;u*=L}while(g);return{u:p,point:h}}function Un(n,e,t){const o=[],c=[],s=[],i=[],r=[];let a=n.getTangent(0),f=t.clone(),{binormal:u}=F(a,f);const g=1/e,p=new m.Quaternion;for(let h=0;h<=e;h++){const y=h*g;r.push(y);const b=n.getPoint(y);o.push(b);const L=n.getTangent(y);c.push(L),p.setFromUnitVectors(a,L);const C=f.clone().applyQuaternion(p);s.push(C);const S=u.clone().applyQuaternion(p);i.push(S),a=L,f=C,u=S}return{tangents:c,normals:s,binormals:i,points:o,uts:r}}function Fn(n,e,t,o){const c=[];o=o??n.autoClose;const{tangents:s,normals:i,binormals:r}=n.computeFrenetFrames(e,o),a=Sn(i[0],t,s[0]),f=1/e,u=new m.Quaternion,g=[];for(let p=0;p<=e;p++){const h=p*f;g.push(h);const y=n.getPoint(h);c.push(y);const b=s[p],L=i[p],C=r[p];u.setFromAxisAngle(b,a),L.applyQuaternion(u),C.applyQuaternion(u)}return{tangents:s,normals:i,binormals:r,points:c,uts:g}}function Dn(n,e,t,o){const c=[],s=[],i=[],r=[],a=[],f=o?function(g){return{point:n.getPointAt(g),tangent:n.getTangentAt(g)}}:function(g){return{point:n.getPoint(g),tangent:n.getTangent(g)}},u=1/e;for(let g=0;g<=e;g++){const p=g*u;a.push(p);const{point:h,tangent:y}=f(p);c.push(h),s.push(y);const b=t.clone(),{binormal:L}=F(y,b);i.push(b),r.push(L)}return{tangents:s,normals:i,binormals:r,points:c,uts:a}}function Bt(n,e,t,o){const{useU:c,fixUp:s,closed:i}=o||{},r=i??!!n.autoClose;let a;return s?a=Dn(n,e,t,c):c?a=Fn(n,e,t,r):a=Un(n,e,t),a}function _t(n){const e=n.count,t=[0];let o=new m.Vector3().fromBufferAttribute(n,0),c=new m.Vector3,s=0;for(let i=1;i<e;i++)c.fromBufferAttribute(n,i),s+=c.distanceTo(o),t.push(s),o.copy(c);return{lengths:t,length:s}}function zt(n){const e=n.length,t=[0];let o=n[0],c,s=0;for(let i=1;i<e;i++)c=n[i],s+=c.distanceTo(o),t.push(s),o=c;return{lengths:t,length:s}}function nn(n){const e=qn(n),t=[0],o=e.reduce((c,s)=>(c+=s.distance(),t.push(c),c),0);return{lines:e,lengths:t,length:o}}function qn(n){const e=[];return n.reduce((t,o)=>{const c=new m.Line3(t,o);return e.push(c),o}),e}function Rt(n,e){const t=[];return{lines:e.filter((c,s)=>{const i=c.closestPointToPointParameter(n),r=0<=i||i>=1;return r&&t.push(s),r}),indexs:t}}function Ut(n,e){const{distSortIndexs:t,clampDists:o,clampPoints:c,ts:s,clampTs:i}=Nn(n,e),r=t[0];return{line:e[r],index:r,clampDist:o[r],clampPoint:c[r],t:s[r],clampT:i[r]}}function Nn(n,e){const t={clampDists:[],clampPoints:[],distSortIndexs:[],ts:[],clampTs:[]};return e.forEach((o,c)=>{const s=o.closestPointToPointParameter(n),i=m.MathUtils.clamp(s,0,1),r=o.at(i,new m.Vector3),a=n.distanceTo(r);t.clampDists.push(a),t.clampPoints.push(r),t.distSortIndexs.push(c),t.ts.push(s),t.clampTs.push(i)}),t.distSortIndexs.sort((o,c)=>t.clampDists[o]-t.clampDists[c]),t}function Ft(n){const e=new m.CurvePath,t=n[0].z==null?m.LineCurve:m.LineCurve3;return n.reduce((o,c)=>{const s=new t(o,c);return e.add(s),c}),e}function Dt(n,e){return n.z==null?new m.LineCurve(n,e):new m.LineCurve3(n,e)}function qt(n){const e=n[0].z==null?m.LineCurve:m.LineCurve3,t=[];return n.reduce((o,c)=>{const s=new e(o,c);return t.push(s),c}),t}function Nt(n,e){const t=[],o=[],c=[],{lines:s,lengths:i,length:r}=nn(n),a=s.length;for(let f=0;f<a;f++){const g=s[f].delta(new m.Vector3).normalize();t.push(g);const p=e.clone(),{binormal:h}=F(g,p);o.push(p),c.push(h)}return t.push(t.at(-1).clone()),o.push(o.at(-1).clone()),c.push(c.at(-1).clone()),{tangents:t,normals:o,binormals:c,lengths:i,length:r,lines:s}}function kt(n,e){const t=[],o=[],c=[],{lines:s,lengths:i,length:r}=nn(n),a=s.length-1;let f=s[0].delta(new m.Vector3).normalize(),u=e.clone(),{binormal:g}=F(f,u);const p=new m.Quaternion;for(let h=0;h<=a;h++){const b=s[h].delta(new m.Vector3).normalize();t.push(b),p.setFromUnitVectors(f,b);const L=u.clone().applyQuaternion(p);o.push(L);const C=g.clone().applyQuaternion(p);c.push(C),f=b,u=L,g=C}return t.push(f.clone()),o.push(u.clone()),c.push(g.clone()),{tangents:t,normals:o,binormals:c,lengths:i,length:r}}function kn(n,e){const t=n.getLength(),o=un(e??{},t),c=n.getPoints(o),s=n.getLengths(o);return fn(c,{...e,lengths:s})}function fn(n,e){const{startColor:t,endColor:o,color:c,lengths:s}=e??{},i=c?new m.Color(c):null,r=t?new m.Color(t):i??new m.Color(0,1,0),a=o?new m.Color(o):i??new m.Color(0,0,1),f=[],u=[];n[0].toArray(f,0);const g=f.length,p=s??nn(n).lengths,h=p[p.length-1],y=new m.Color;n.forEach((L,C)=>{L.toArray(f,C*g);const S=p[C]/h;y.lerpColors(r,a,S),y.toArray(u,C*3)});const b=new m.BufferGeometry;return b.setAttribute("position",new m.Float32BufferAttribute(f,g)),b.setAttribute("color",new m.Float32BufferAttribute(u,3)),b}function jt(n,e){e=e??{};let{material:t,linewidth:o}=e;o=o??1,t=t??new m.LineBasicMaterial({vertexColors:!0,linewidth:o});const c=Array.isArray(n)?fn(n,e):kn(n,e);return new m.Line(c,t)}const X=.1;function Qt(n,e=0,t){const o=[];let c=n/2-1;if(t)if(e===1){const s=e-1,i=e,r=i+1;o.push(r,i,s)}else e>1&&(c++,e-=2);for(let s=0;s<c;s++){const i=s*2+e,r=i+1,a=i+2,f=i+3;o.push(i,r,a,f,a,r)}return o}function xt(n,e=0,t){const o=[];let c=n.length/6-1;if(t)if(e===1){const f=e-1,u=e,g=u+1;o.push(g,u,f)}else e>1&&(c++,e-=2);const s=new m.Vector3,i=new m.Vector3,r=new m.Vector3,a=c-1;for(let f=0;f<c;f++){const u=f*2,g=u+1,p=u+2,h=u+3,y=u+e,b=y+1,L=y+2,C=y+3,S=[y,b,L,C,L,b],A=[y,b,C,C,L,y];if(y>=0){s.fromArray(n,u*3),i.fromArray(n,p*3);const P=f===a;if(s.equals(i)){const T=u+4;P||r.fromArray(n,T*3).equals(i)?o.push(...A):o.push(...S);continue}if(s.fromArray(n,g*3),i.fromArray(n,h*3),s.equals(i)){const T=u+5;P||r.fromArray(n,T*3).equals(i)?o.push(...S):o.push(...A);continue}}o.push(...S)}return o}var jn=(n=>(n.bevel="bevel",n.chamfer="chamfer",n.round="round",n.lineSegment="lineSegment",n))(jn||{});function Qn(n,e,t,o,c=X){const{point:s,length:i,width:r}=n,a=r/2,{tangent:f,normal:u,binormal:g}=e,{tangent:p,normal:h,binormal:y}=t,{line:b}=mn(e,t,c);let L;if(!b){L=g.clone().multiplyScalar(a);const V=s.clone().sub(L),gn=s.clone().add(L);L.copy(y).multiplyScalar(a);const $n=s.clone().sub(L),Hn=s.clone().add(L);return{points:[V,gn,$n,Hn],normals:[u,u,h,h],lengths:[i,i,i,i]}}let{tangent:C,normal:S,length:A}=b;L=C.clone().multiplyScalar(A*a);const P=Math.abs(L.dot(p)),T=i-P,N=i+P,k=s.clone().sub(L),j=s.clone().add(L);let Q,M,x,z;const B=g.clone().multiplyScalar(r),Y=y.clone().multiplyScalar(r);if(f.clone().cross(p).dot(u)>0){const V=Q=x=k;M=V.clone().add(B),z=V.clone().add(Y)}else{const V=z=M=j;Q=V.clone().sub(B),x=V.clone().sub(Y)}return o?{points:[Q,M,x,z],normals:[u,u,h,h],lengths:[T,T,N,N]}:{points:[Q,M,k,j,x,z],normals:[u,u,S,S,h,h],lengths:[T,T,i,i,N,N]}}var xn=(n=>(n[n.AllOblique=0]="AllOblique",n[n.TangentSame=1]="TangentSame",n[n.TangentReverse=2]="TangentReverse",n[n.TangentVertical=4]="TangentVertical",n[n.NormalSame=8]="NormalSame",n[n.NormalReverse=16]="NormalReverse",n[n.NormalVertical=32]="NormalVertical",n[n.BinormalSame=64]="BinormalSame",n[n.BinormalReverse=128]="BinormalReverse",n[n.BinormalVertical=256]="BinormalVertical",n))(xn||{});function Wn(n,e,t=X){const{tangent:o,normal:c,binormal:s}=n,{tangent:i,normal:r,binormal:a}=e;let f=0;const u=o.dot(i),g=Math.abs(u);g>1-t?f|=u>0?1:2:g<t&&(f|=4);const p=c.dot(r),h=Math.abs(p);h>1-t?f|=p>0?8:16:h<t&&(f|=32);const y=s.dot(a),b=Math.abs(y);return b>1-t?f|=y>0?64:128:b<t&&(f|=256),f}function mn(n,e,t=X){const{normal:o,binormal:c}=n,{normal:s,binormal:i}=e,r=Wn(n,e,t);let a,f;if(r&8&&!(r&2))f=s,a=c.clone().add(i);else if(r&16)f=s,a=i.clone().negate().add(c);else{if(r&3)return{relation:r};if(r&256)return{relation:r};f=o.clone().add(s).normalize(),a=o.clone().cross(s)}a.normalize();let u=a.dot(c);u<0&&(a.negate(),u=-u);const g=1/u;return{relation:r,line:{tangent:a,normal:f,length:g}}}function Gn(n,e,t,o,c=X){const{point:s,length:i,width:r}=n,a=r/2,{tangent:f,normal:u,binormal:g}=e,{tangent:p,normal:h,binormal:y}=t,{smoothStepAngle:b,smoothStepLength:L}=o||{},{relation:C,line:S}=mn(e,t,c);let A;if(!S){A=g.clone().multiplyScalar(a);const O=s.clone().sub(A),R=s.clone().add(A);A.copy(y).multiplyScalar(a);const U=s.clone().sub(A),Z=s.clone().add(A);return{points:[O,R,U,Z],normals:[u,u,h,h],lengths:[i,i,i,i]}}let{tangent:P,normal:T,length:N}=S;A=P.clone().multiplyScalar(N*a);const k=s.clone().sub(A),j=s.clone().add(A);if(C&64)return{points:[k,j],normals:[T,T],lengths:[i,i]};const Q=g.angleTo(P),M=Math.abs(A.dot(p)),x=i-M,z=1/M;let B=b==null&&L?M/L:Q/(b??.5);B=Math.max(Math.round(B),1);const Y=1/B,Yn=new m.Quaternion().setFromUnitVectors(g,P),Zn=new m.Quaternion().setFromUnitVectors(P,y),V=new m.Quaternion().setFromUnitVectors(u,T),gn=new m.Quaternion().setFromUnitVectors(T,h),Jn=f.clone().cross(p).dot(u)>0?function(O){return{left:k,right:k.clone().add(O)}}:function(O){return{left:j.clone().sub(O),right:j}};A.copy(g).multiplyScalar(r);const on=new m.Quaternion,_=new m.Quaternion,pn=[],hn=[],dn=[];for(let O=0;O<B;O++){const R=O*Y;_.slerpQuaternions(on,Yn,R);const U=O*z+x;dn.push(U,U);const Z=A.clone().applyQuaternion(_),{left:yn,right:bn}=Jn(Z);pn.push(yn,bn),_.slerpQuaternions(on,V,R);const $=u.clone().applyQuaternion(_);hn.push($,$)}A.copy(P).multiplyScalar(r);for(let O=0;O<=B;O++){const R=O*Y;_.slerpQuaternions(on,Zn,R);const U=O*z+i;dn.push(U,U);const Z=A.clone().applyQuaternion(_),{left:yn,right:bn}=Jn(Z);pn.push(yn,bn),_.slerpQuaternions(on,gn,R);const $=T.clone().applyQuaternion(_);hn.push($,$)}return{points:pn,normals:hn,lengths:dn}}function En(n,e,t){const{point:o,length:c,width:s}=n,i=s/2,{normal:r,binormal:a}=e,{normal:f,binormal:u}=t;let g=a.clone().multiplyScalar(i);const p=o.clone().sub(g),h=o.clone().add(g);let y=u.clone().multiplyScalar(i);const b=o.clone().sub(y),L=o.clone().add(y);return{points:[p,h,b,L],normals:[r,r,f,f],lengths:[c,c,c,c]}}function Wt(n,e,t,o){const{connectionType:c}=o||{};switch(c){case"round":return Gn(n,e,t,o);case"lineSegment":return En(n,e,t);default:return Qn(n,e,t,c==="chamfer")}}const q=new m.Matrix3;function tn(n,e){const{wrapS:t,wrapT:o,flipX:c,flipY:s}=e;if(n.x<0||n.x>1)switch(t){case m.RepeatWrapping:n.x=n.x-Math.floor(n.x);break;case m.ClampToEdgeWrapping:n.x=n.x<0?0:1;break;case m.MirroredRepeatWrapping:Math.abs(Math.floor(n.x)%2)===1?n.x=Math.ceil(n.x)-n.x:n.x=n.x-Math.floor(n.x);break}if(n.y<0||n.y>1)switch(o){case m.RepeatWrapping:n.y=n.y-Math.floor(n.y);break;case m.ClampToEdgeWrapping:n.y=n.y<0?0:1;break;case m.MirroredRepeatWrapping:Math.abs(Math.floor(n.y)%2)===1?n.y=Math.ceil(n.y)-n.y:n.y=n.y-Math.floor(n.y);break}return c&&(n.x=1-n.x),s&&(n.y=1-n.y),n}function Kn(n,e){const t=n.count;for(let o=0;o<t;o++){const c=n.getX(o),s=n.getY(o),i=tn({x:c,y:s},e);n.setXY(o,i.x,i.y)}return n}function Xn(n,e){const t=new m.Vector2,o=n.length;for(let c=0;c<o;c++){const s=c*2,i=s+1;t.x=n[s],t.y=n[i],tn(t,e),n[s]=t.x,n[i]=t.y}return n}function en(n,e=new m.Matrix3){const{offset:t={x:0,y:0},repeat:o={x:1,y:1},center:c={x:0,y:0},rotation:s=0}=n;return e.setUvTransform(t.x,t.y,o.x,o.y,s,c.x,c.y),e}function Gt(n,e,t){return en(e,q),n.applyMatrix3(q),t&&tn(n,t),n}function Et(n,e,t){return en(e,q),n.applyMatrix3(q),t&&Kn(n,t),n.needsUpdate=!0,n}function Kt(n,e,t){en(e,q);const o=new m.Vector2,c=n.length;for(let s=0;s<c;s++){const i=s*2,r=i+1;o.x=n[i],o.y=n[r],o.applyMatrix3(q),n[i]=o.x,n[r]=o.y}return t&&Xn(n,t),n}return l.Azimuth=rn,l.DirectionSide=Rn,l.FrenetFrameRelation=xn,l.GeometricRelationship=d,l.LineConnectionType=jn,l.adjustFrenetFrame=F,l.adjustFrontUpFrame=Cn,l.adjustOrientation=ct,l.azimuth=mt,l.closeCurvePath=I,l.computeCurveFrenetFrames=Bt,l.computeCurveFrenetFramesByFixUp=Dn,l.computeCurveFrenetFramesByT=Un,l.computeCurveFrenetFramesByU=Fn,l.computeFrenetFrameRelation=Wn,l.computeIntersectSpheres=it,l.computeIntersectionFactorOfLine_Circle=D,l.computeIntersectionLineOfBands=mn,l.computeIntersectionOfLineSegment_Circle=In,l.computeIntersectionOfLineSegment_LineSegment=At,l.computeIntersectionOfLine_Circle=yt,l.computeIntersectionOfLine_Line=K,l.computeIntersectionOfPolygon_Circle=St,l.computeIntersectionOfRay_Circle=Lt,l.computeIntersectionOfRay_LineSegment=Bn,l.computePolylineFrenetFrames=kt,l.computePolylineFrenetFramesByFixUp=Nt,l.computeVectorScalar=w,l.configUV=tn,l.configUVBufferAttribute=Kn,l.configUVs=Xn,l.createBevelLineConnection=Qn,l.createCurveBufferGeometry=kn,l.createLineConnection=Wt,l.createLineCurve=Dt,l.createLineCurves=qt,l.createLineSegmentConnection=En,l.createLineSegmentsByCurve=jt,l.createLinearGradientTexture=ft,l.createLines=qn,l.createPolylineBufferGeometry=fn,l.createPolylineCurve=Ft,l.createRoundLineConnection=Gn,l.createSymmetricSegmentedTrigonometricIndexs=Qt,l.createSymmetricSegmentedTrigonometricIndexsByVertexs=xt,l.createUVTransformMatrix=en,l.defaultAzimuthOptions=v,l.defaultCourseAzimuthMap=J,l.discriminateRelationshipOfLineSegment_Circle=Vn,l.discriminateRelationshipOfLineSegment_LineSegment=Ct,l.discriminateRelationshipOfLineSegment_Point=_n,l.discriminateRelationshipOfLine_Circle=dt,l.discriminateRelationshipOfLine_Line=ln,l.discriminateRelationshipOfPoint_ConvexPolygon=wt,l.discriminateRelationshipOfPoint_Polygon=zn,l.discriminateRelationshipOfPolygon_Circle=Ot,l.discriminateRelationshipOfRay_Circle=bt,l.discriminateRelationshipOfRay_LineSegment=Mn,l.formatAzimuthDefineMap=Pn,l.frenetFrameToFrontUpFrame=et,l.frontUpFrameToFrenetFrame=ot,l.get3DTextureItem=ht,l.get3DTextureSlice=pt,l.getAxisRotationAngle=Sn,l.getAzimuthAngle=Tn,l.getClosestDistanceInfoOfPointToLines=Ut,l.getCurveDivisionLength=Vt,l.getCurvePointAwayFrom=It,l.getCurvePointAwayFromOrigin=Mt,l.getCurveULengths=Tt,l.getDistanceInfoOfPointToLines=Nn,l.getIncludedAngle=On,l.getLengthsOfPoints=zt,l.getLengthsOfPositionAttribute=_t,l.getLengthsOfTs=Pt,l.getLinesInfo=nn,l.getProjectionLines=Rt,l.getQuaternionBetweenVectorsAroundAxis=st,l.getRotationAngle=E,l.getSampleNum=un,l.getTextureFormatSize=an,l.getVectorClass=cn,l.isCollinear=H,l.ivectorMemberToVector=G,l.ivectorToVector=Ln,l.threeBugPatch=vn,l.transformUV=Gt,l.transformUVBufferAttribute=Et,l.transformUVs=Kt,l.zeroThreshold_Default=X,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}),l}({},three);