UNPKG

@three3d/tools

Version:

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

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