@three3d/effect
Version:
@three3d/effect 提供了 ThreeJS 的特效
49 lines (45 loc) • 31.5 kB
JavaScript
var Effect=function(y,h){"use strict";var Hn=Object.defineProperty;var Kn=(y,h,st)=>h in y?Hn(y,h,{enumerable:!0,configurable:!0,writable:!0,value:st}):y[h]=st;var W=(y,h,st)=>(Kn(y,typeof h!="symbol"?h+"":h,st),st);var st=Object.defineProperty,fn=(n,e,t)=>e in n?st(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,pt=(n,e,t)=>(fn(n,typeof e!="symbol"?e+"":e,t),t);function dn(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?h.LineCurve3:h.LineCurve;n.curves.push(new o(t,e))}return n}function vt(n,e,t,o){const s=(o==null?void 0:o.copy(n))||n.clone();return s.cross(e),s.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(),s.crossVectors(n,e)),t?n.copy(e).cross(s):e.copy(s).cross(n),s.normalize(),e.normalize(),n.normalize(),{tangent:n,normal:e,binormal:s}}function mn(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 Ct(n,e,t){let o=mn(n,e);return o===0?o:n.clone().cross(e).dot(t)<0?-o:o}function bn(n,e,t){return n=n.clone().projectOnPlane(t),e=e.clone().projectOnPlane(t),Ct(n,e,t)}function yn(n,e,t){const o=e.clone().negate(),s=t.clone().projectOnPlane(e),r=n.clone().projectOnPlane(s),i=Ct(e,r,s),a=e.clone().cross(s),l=n.clone().projectOnPlane(a),c=Ct(e,l,a),u=n.clone().projectOnPlane(o),g=Ct(s,u,o);return{yaw:i,pitch:c,roll:g}}const _t=180/Math.PI,xt={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 e={};for(const[t,o]of Object.entries(n))e[t]=Array.isArray(o)?o:Object.entries(o).map(([s,r])=>({name:s,range:r}));return e}const St={degrees:!0,map:xt,front:{x:0,y:0,z:1},up:{x:0,y:1,z:0}};class Wt{constructor(e){pt(this,"_options"),pt(this,"_listMap"),pt(this,"_front"),pt(this,"_up"),e&&(this.options=e)}static get options(){return this._options??(this.options=St)}static set options(e){this._options=Object.assign({},structuredClone(xt),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(xt);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=vn(this.map??{}))}get front(){return this._front||(this.front=this.options.front??this.defaultOptions.front??St.front),this._front}set front(e){this._front=new h.Vector3().copy(e)}get up(){return this._up||(this.up=this.options.up??this.defaultOptions.up??St.up),this._up}set up(e){this._up=new h.Vector3().copy(e)}computeAzimuth(e,t,o){const s=new h.Vector3().copy(e),r=new h.Vector3().copy(t??this.front),i=new h.Vector3().copy(o??this.up);let{yaw:a,pitch:l,roll:c}=yn(s,r,i);return this.degrees&&(a*=_t,l*=_t,c*=_t),{yaw:{angle:a,name:this.findAzimuthNames("yaw",a)},pitch:{angle:l,name:this.findAzimuthNames("pitch",l)},roll:{angle:c,name:this.findAzimuthNames("roll",c)}}}findAzimuthNames(e,t){const o=[],s=this.listMap[e];if(!s)return o;for(const{name:r,range:[i,a]}of s)(t>=i&&t<a||t<=i&&t>a)&&o.push(r);return o}}pt(Wt,"_options"),new Wt;function Cn(n,e){let t=n.sampleLength;if(!t){const o=n.sampleNum;if(o)return o;t=1}return Math.ceil(e/t)}function Mt(n){const{curve:e}=n;let t=e.getLength();const o=Cn(n,t);return e.arcLengthDivisions<o&&(e.arcLengthDivisions=o,e.updateArcLengths(),t=e.getLength()),{length:t,division:o}}function wn(n,e,t){const o=[],s=[],r=[],i=[],a=[];let l=n.getTangent(0),c=t.clone(),{binormal:u}=vt(l,c);const g=1/e,p=new h.Quaternion;for(let f=0;f<=e;f++){const m=f*g;a.push(m);const b=n.getPoint(m);o.push(b);const d=n.getTangent(m);s.push(d),p.setFromUnitVectors(l,d);const v=c.clone().applyQuaternion(p);r.push(v);const D=u.clone().applyQuaternion(p);i.push(D),l=d,c=v,u=D}return{tangents:s,normals:r,binormals:i,points:o,uts:a}}function Dn(n,e,t,o){const s=[];o=o??n.autoClose;const{tangents:r,normals:i,binormals:a}=n.computeFrenetFrames(e,o),l=bn(i[0],t,r[0]),c=1/e,u=new h.Quaternion,g=[];for(let p=0;p<=e;p++){const f=p*c;g.push(f);const m=n.getPoint(f);s.push(m);const b=r[p],d=i[p],v=a[p];u.setFromAxisAngle(b,l),d.applyQuaternion(u),v.applyQuaternion(u)}return{tangents:r,normals:i,binormals:a,points:s,uts:g}}function Ln(n,e,t,o){const s=[],r=[],i=[],a=[],l=[],c=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;l.push(p);const{point:f,tangent:m}=c(p);s.push(f),r.push(m);const b=t.clone(),{binormal:d}=vt(m,b);i.push(b),a.push(d)}return{tangents:r,normals:i,binormals:a,points:s,uts:l}}function Pn(n,e,t,o){const{useU:s,fixUp:r,closed:i}=o||{},a=i??!!n.autoClose;let l;return r?l=Ln(n,e,t,s):s?l=Dn(n,e,t,a):l=wn(n,e,t),l}function Ot(n){const e=An(n),t=[0],o=e.reduce((s,r)=>(s+=r.distance(),t.push(s),s),0);return{lines:e,lengths:t,length:o}}function An(n){const e=[];return n.reduce((t,o)=>{const s=new h.Line3(t,o);return e.push(s),o}),e}function Ut(n,e){return n.z==null?new h.LineCurve(n,e):new h.LineCurve3(n,e)}function It(n){const e=n[0].z==null?h.LineCurve:h.LineCurve3,t=[];return n.reduce((o,s)=>{const r=new e(o,s);return t.push(r),s}),t}function Jt(n,e){const t=[],o=[],s=[],{lines:r,lengths:i,length:a}=Ot(n),l=r.length;for(let c=0;c<l;c++){const u=r[c].delta(new h.Vector3).normalize();t.push(u);const g=e.clone(),{binormal:p}=vt(u,g);o.push(g),s.push(p)}return t.push(t.at(-1).clone()),o.push(o.at(-1).clone()),s.push(s.at(-1).clone()),{tangents:t,normals:o,binormals:s,lengths:i,length:a,lines:r}}function _n(n,e){const t=[],o=[],s=[],{lines:r,lengths:i,length:a}=Ot(n),l=r.length-1;let c=r[0].delta(new h.Vector3).normalize(),u=e.clone(),{binormal:g}=vt(c,u);const p=new h.Quaternion;for(let f=0;f<=l;f++){const m=r[f].delta(new h.Vector3).normalize();t.push(m),p.setFromUnitVectors(c,m);const b=u.clone().applyQuaternion(p);o.push(b);const d=g.clone().applyQuaternion(p);s.push(d),c=m,u=b,g=d}return t.push(c.clone()),o.push(u.clone()),s.push(g.clone()),{tangents:t,normals:o,binormals:s,lengths:i,length:a}}const wt=.1;function Xt(n,e=0,t){const o=[];let s=n/2-1;if(t)if(e===1){const r=e-1,i=e,a=i+1;o.push(a,i,r)}else e>1&&(s++,e-=2);for(let r=0;r<s;r++){const i=r*2+e,a=i+1,l=i+2,c=i+3;o.push(i,a,l,c,l,a)}return o}function Zt(n,e=0,t){const o=[];let s=n.length/6-1;if(t)if(e===1){const c=e-1,u=e,g=u+1;o.push(g,u,c)}else e>1&&(s++,e-=2);const r=new h.Vector3,i=new h.Vector3,a=new h.Vector3,l=s-1;for(let c=0;c<s;c++){const u=c*2,g=u+1,p=u+2,f=u+3,m=u+e,b=m+1,d=m+2,v=m+3,D=[m,b,d,v,d,b],C=[m,b,v,v,d,m];if(m>=0){r.fromArray(n,u*3),i.fromArray(n,p*3);const w=c===l;if(r.equals(i)){const P=u+4;w||a.fromArray(n,P*3).equals(i)?o.push(...C):o.push(...D);continue}if(r.fromArray(n,g*3),i.fromArray(n,f*3),r.equals(i)){const P=u+5;w||a.fromArray(n,P*3).equals(i)?o.push(...D):o.push(...C);continue}}o.push(...D)}return o}var Ht=(n=>(n.bevel="bevel",n.chamfer="chamfer",n.round="round",n.lineSegment="lineSegment",n))(Ht||{});function xn(n,e,t,o,s=wt){const{point:r,length:i,width:a}=n,l=a/2,{tangent:c,normal:u,binormal:g}=e,{tangent:p,normal:f,binormal:m}=t,{line:b}=Kt(e,t,s);let d;if(!b){d=g.clone().multiplyScalar(l);const I=r.clone().sub(d),B=r.clone().add(d);d.copy(m).multiplyScalar(l);const R=r.clone().sub(d),X=r.clone().add(d);return{points:[I,B,R,X],normals:[u,u,f,f],lengths:[i,i,i,i]}}let{tangent:v,normal:D,length:C}=b;d=v.clone().multiplyScalar(C*l);const w=Math.abs(d.dot(p)),P=i-w,O=i+w,j=r.clone().sub(d),q=r.clone().add(d);let x,U,E,G;const S=g.clone().multiplyScalar(a),N=m.clone().multiplyScalar(a);if(c.clone().cross(p).dot(u)>0){const I=x=E=j;U=I.clone().add(S),G=I.clone().add(N)}else{const I=G=U=q;x=I.clone().sub(S),E=I.clone().sub(N)}return o?{points:[x,U,E,G],normals:[u,u,f,f],lengths:[P,P,O,O]}:{points:[x,U,j,q,E,G],normals:[u,u,D,D,f,f],lengths:[P,P,i,i,O,O]}}function Sn(n,e,t=wt){const{tangent:o,normal:s,binormal:r}=n,{tangent:i,normal:a,binormal:l}=e;let c=0;const u=o.dot(i),g=Math.abs(u);g>1-t?c|=u>0?1:2:g<t&&(c|=4);const p=s.dot(a),f=Math.abs(p);f>1-t?c|=p>0?8:16:f<t&&(c|=32);const m=r.dot(l),b=Math.abs(m);return b>1-t?c|=m>0?64:128:b<t&&(c|=256),c}function Kt(n,e,t=wt){const{normal:o,binormal:s}=n,{normal:r,binormal:i}=e,a=Sn(n,e,t);let l,c;if(a&8&&!(a&2))c=r,l=s.clone().add(i);else if(a&16)c=r,l=i.clone().negate().add(s);else{if(a&3)return{relation:a};if(a&256)return{relation:a};c=o.clone().add(r).normalize(),l=o.clone().cross(r)}l.normalize();let u=l.dot(s);u<0&&(l.negate(),u=-u);const g=1/u;return{relation:a,line:{tangent:l,normal:c,length:g}}}function Mn(n,e,t,o,s=wt){const{point:r,length:i,width:a}=n,l=a/2,{tangent:c,normal:u,binormal:g}=e,{tangent:p,normal:f,binormal:m}=t,{smoothStepAngle:b,smoothStepLength:d}=o||{},{relation:v,line:D}=Kt(e,t,s);let C;if(!D){C=g.clone().multiplyScalar(l);const L=r.clone().sub(C),T=r.clone().add(C);C.copy(m).multiplyScalar(l);const F=r.clone().sub(C),z=r.clone().add(C);return{points:[L,T,F,z],normals:[u,u,f,f],lengths:[i,i,i,i]}}let{tangent:w,normal:P,length:O}=D;C=w.clone().multiplyScalar(O*l);const j=r.clone().sub(C),q=r.clone().add(C);if(v&64)return{points:[j,q],normals:[P,P],lengths:[i,i]};const x=g.angleTo(w),U=Math.abs(C.dot(p)),E=i-U,G=1/U;let S=b==null&&d?U/d:x/(b??.5);S=Math.max(Math.round(S),1);const N=1/S,I=new h.Quaternion().setFromUnitVectors(g,w),B=new h.Quaternion().setFromUnitVectors(w,m),R=new h.Quaternion().setFromUnitVectors(u,P),X=new h.Quaternion().setFromUnitVectors(P,f),tt=c.clone().cross(p).dot(u)>0?function(L){return{left:j,right:j.clone().add(L)}}:function(L){return{left:q.clone().sub(L),right:q}};C.copy(g).multiplyScalar(a);const J=new h.Quaternion,A=new h.Quaternion,V=[],Z=[],_=[];for(let L=0;L<S;L++){const T=L*N;A.slerpQuaternions(J,I,T);const F=L*G+E;_.push(F,F);const z=C.clone().applyQuaternion(A),{left:M,right:H}=tt(z);V.push(M,H),A.slerpQuaternions(J,R,T);const K=u.clone().applyQuaternion(A);Z.push(K,K)}C.copy(w).multiplyScalar(a);for(let L=0;L<=S;L++){const T=L*N;A.slerpQuaternions(J,B,T);const F=L*G+i;_.push(F,F);const z=C.clone().applyQuaternion(A),{left:M,right:H}=tt(z);V.push(M,H),A.slerpQuaternions(J,X,T);const K=P.clone().applyQuaternion(A);Z.push(K,K)}return{points:V,normals:Z,lengths:_}}function On(n,e,t){const{point:o,length:s,width:r}=n,i=r/2,{normal:a,binormal:l}=e,{normal:c,binormal:u}=t;let g=l.clone().multiplyScalar(i);const p=o.clone().sub(g),f=o.clone().add(g);let m=u.clone().multiplyScalar(i);const b=o.clone().sub(m),d=o.clone().add(m);return{points:[p,f,b,d],normals:[a,a,c,c],lengths:[s,s,s,s]}}function Un(n,e,t,o){const{connectionType:s}=o||{};switch(s){case"round":return Mn(n,e,t,o);case"lineSegment":return On(n,e,t);default:return xn(n,e,t,s==="chamfer")}}new h.Matrix3;function Yt(n,e){const t=n.length;let o=1/0,s=0;for(;s<t;){const r=n[s],i=e-r;if(e<r)return-i>o?s-1:s;o=i,s++}return s}function $t(n,e,t){const o=n.length;let s=0;for(;s<o;){const r=n[s];if(e<r)return t?s:s-1;s++}return t?-1:s}function tn(n){var o;let e;const t=[];for(let s of n){let r,i=null;if(s instanceof h.Curve?(i=[s],r=s.getPoint(0)):Array.isArray(s)?(s.length>1&&(i=It(s)),r=s[0]):r=s,e&&!e.equals(r)){const a=Ut(e,r);t.push(a)}i&&t.push(...i),e=(o=t.at(-1))==null?void 0:o.getPoint(1)}return t}function In(n){let e;const t=[];for(let o of n){if(o instanceof h.Curve){t.push(o),e=o.getPoint(1);continue}else if(Array.isArray(o)){if(o.length>1){const s=It(o);t.push(...s),e=o.at(-1);continue}o=o[0]}if(e&&!e.equals(o)){const s=Ut(e,o);t.push(s)}e=o}return t}function Dt(n,e,t){let o,s=[];if(n instanceof h.Curve?(o=n.getPoint(0),s=[n]):Array.isArray(n)?(n.length>1&&(s=It(n)),o=n[0]):o=n,e&&(t||s.length===0)&&(t||s.length===0)){const r=Ut(e,o);s.unshift(r)}return s}function Bn(n,e,t){const o=Dt(n,e,t);switch(o.length){case 0:return null;case 1:return o[0]}const s=new h.CurvePath;return s.curves.push(...o),s}function Bt(n){return n instanceof h.Curve?n.getPoint(0):Array.isArray(n)?n[0]:n}function Rt(n){return n instanceof h.Curve?n.getPoint(1):Array.isArray(n)?n.at(-1):n}const at="lineDistance",ft={width:1,sampleLength:1,startLength:0,startColor:65280,endColor:255,autoClose:!1};function nn(n,e){const{division:t}=Mt({...e,curve:n});return n.getPoints(t)}function en(n,e){const{startColor:t,endColor:o,color:s,startLength:r}=e||{},i=s?new h.Color(s):null,a=t?new h.Color(t):i??new h.Color(0,1,0),l=o?new h.Color(o):i??new h.Color(0,0,1),c=r??0,u=[],g=[],p=Ot(n).lengths,m=1/(p.at(-1)+c),b=new h.Color;return n.forEach((d,v)=>{d.toArray(u,v*3);const D=p[v]+c;p[v]=D;const C=D*m;b.lerpColors(a,l,C),b.toArray(g,v*3)}),{color:g,position:u,lineDistance:p,lengths:p,points:n}}class Vt extends h.BufferGeometry{constructor(t){super();W(this,"isPathGeometry",!0);W(this,"_options",null);W(this,"_startDrawLength",0);W(this,"_endDrawLength",1/0);W(this,"_pathData",[]);W(this,"_curves",[]);W(this,"_curvePath",this.generateCurvePath());W(this,"points",[]);W(this,"lengths",[]);t&&(this.options=t)}get globalOptions(){return this.constructor.options}get options(){return this._options??(this._options=structuredClone(this.globalOptions))}set options(t){const o=this.options;this._options=t?Object.assign(o,t):null}get width(){return this.options.width??(this.options.width=this.globalOptions.width??ft.width)}set width(t){this.options.width=t}get sampleLength(){return this.options.sampleLength??(this.options.sampleLength=this.globalOptions.sampleLength??ft.sampleLength)}set sampleLength(t){this.options.sampleLength=t}get sampleNum(){return this.options.sampleNum??(this.options.sampleNum=this.globalOptions.sampleNum)}set sampleNum(t){this.options.sampleNum=t}get autoClose(){return this.options.autoClose??(this.options.autoClose=this.globalOptions.autoClose)}set autoClose(t){this.options.autoClose=t,this.curvePath.autoClose=!!t}get closed(){const{points:t}=this,o=t[0],s=t.at(-1);return o&&s?o.equals(s):!1}get color(){let t=this.options.color;if(!t){const o=this.globalOptions.color;o&&(this.options.color=t=structuredClone(o))}return t}set color(t){this.options.color=t}get startColor(){let t=this.options.startColor;if(!t){const o=this.globalOptions.startColor??ft.startColor;this.options.startColor=t=structuredClone(o)}return t}set startColor(t){this.options.startColor=t}get endColor(){let t=this.options.endColor;if(!t){const o=this.globalOptions.endColor??ft.endColor;this.options.endColor=t=structuredClone(o)}return t}set endColor(t){this.options.endColor=t}get startLength(){return this.options.startLength??(this.options.startLength=this.globalOptions.startLength??0)}set startLength(t){this.options.startLength=t}get endLength(){return this.lengths.at(-1)??this.startLength}get lineDistance(){var t;return(t=this.getAttribute(at))==null?void 0:t.array}getClosestIndex(t){return Yt(this.lineDistance,t)}getNearbyIndex(t,o){return $t(this.lineDistance,t,o)}setDrawLength(t,o){const s=this.getClosestIndex(t);let r=1/0;o==null||o===1/0||(r=this.getClosestIndex(o)-s+1),this.setDrawRange(s,r)}get startDrawLength(){return this._startDrawLength}set startDrawLength(t){this._startDrawLength=t,this.setDrawLength(t,this.endDrawLength)}get endDrawLength(){return this._endDrawLength??(this._endDrawLength=1/0)}set endDrawLength(t){this._endDrawLength=t,this.setDrawLength(this.startDrawLength,t)}copy(t){super.copy(t);const{lengths:o,_startDrawLength:s,_endDrawLength:r}=t;return this.lengths=o?[...o]:[],this._startDrawLength=s??0,this._endDrawLength=r||null,this}get vertexCount(){var t;return((t=this.getAttribute("position"))==null?void 0:t.count)??0}get pathData(){return this._pathData}set pathData(t){this._pathData=t,this.curves=tn(t)}get closedPathData(){let t=this.pathData;if(this.autoClose){const o=Bt(t[0]),s=Rt(t.at(-1));o.equals(s)||(t=[...t,o.clone()])}return t}get curves(){return this._curves}set curves(t){this._curves=t,this.curvePath=this.generateCurvePath()}get curvePath(){return this._curvePath}set curvePath(t){this._curvePath=t,this.updateGeometry()}get closedCurvePath(){let t=this.curvePath;return this.autoClose&&(t=t.clone(),dn(t),t.autoClose=!1),t}generateCurvePath(){const t=new h.CurvePath;return t.curves=this.curves,t.autoClose=!!this.autoClose,t}get length(){return this.endLength-this.startLength}get lastPoint(){return this.curvePath.getPoint(1)}get firstPoint(){return this.curvePath.getPoint(0)}append(t){const o=Dt(t,this.lastPoint,!0);this.pathData.push(t),this.curves.push(...o),this.updateGeometry()}set(t){this.pathData=[t],this.updateGeometry()}updateGeometry(){const{curvePath:t,options:o}=this,s=nn(t,o),r=en(s,o);this.resetAttributes(r)}appendAttributes(t){var m,b,d,v,D,C;const{position:o,normal:s,uv:r,lengths:i,lineDistance:a,index:l,color:c,points:u}=t,g=((m=this.getAttribute("position"))==null?void 0:m.array)??[],p=this.lengths,f={position:[...g,...o],lengths:[...p,...i],points:[...this.points,...u]};if(s){const w=((b=this.getAttribute("normal"))==null?void 0:b.array)??[];f.normal=[...w,...s]}if(r){const w=((d=this.getAttribute("uv"))==null?void 0:d.array)??[];f.uv=[...w,...r]}if(l){const w=((v=this.getIndex())==null?void 0:v.array)??[];f.index=[...w,...l]}if(c){const w=((D=this.getAttribute("color"))==null?void 0:D.array)??[];f.color=[...w,...c]}if(a){const w=((C=this.getAttribute(at))==null?void 0:C.array)??[];f.lineDistance=[...w,...a]}this.resetAttributes(f)}resetAttributes(t){const{position:o,normal:s,uv:r,lineDistance:i,lengths:a,index:l,color:c,points:u}=t;this.setAttribute("position",new h.Float32BufferAttribute(o,3)),l&&this.setIndex(l),s?this.setAttribute("normal",new h.Float32BufferAttribute(s,3)):this.deleteAttribute("normal"),r?this.setAttribute("uv",new h.Float32BufferAttribute(r,2)):this.deleteAttribute("uv"),c?this.setAttribute("color",new h.Float32BufferAttribute(c,3)):this.deleteAttribute("color"),i?this.setAttribute(at,new h.Float32BufferAttribute(i,1)):this.deleteAttribute(at),this.lengths=a,this.points=u,this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere()}get lastPosition(){const t=this.getAttribute("position");if(!t)return null;const o=t.count;return new h.Vector3().fromBufferAttribute(t,o-1)}}W(Vt,"options",structuredClone(ft));var on=(n=>(n.curve="curve",n.polyline="polyline",n.blend="blend",n))(on||{});const rt={up:{x:0,y:1,z:0},useU:!1,fixUp:!1,uvStep:1,drawType:"blend",connectionType:Ht.round,smoothStepAngle:.5};function Tt(n,e){const{up:t,autoClose:o}=e,{division:s,length:r}=Mt({...e,curve:n}),i=Pn(n,s,t,{...e,closed:o});return i.length=r,sn(i,e)}function sn(n,e){const{startColor:t,endColor:o,color:s,preIndex:r,prePoint:i,connectPre:a}=e,l=s?new h.Color(s):null,c=t?new h.Color(t):l??new h.Color(0,1,0),u=o?new h.Color(o):l??new h.Color(0,0,1),g=e.width??1,p=e.preLength??0,{points:f,tangents:m,normals:b,binormals:d,length:v}=n,D=f[0],C=i?D.distanceTo(i):0,w=v+C+p,P=e.uvStep??w,O=f.length-1,j=g/2,q=[],x=[],U=[],E=[],G=[],S=[],N=1/P,I=1/w;let B=p;const R=new h.Color;let X=f[0];for(let A=0;A<=O;A++){const V=f[A],Z=b[A],_=d[A];B+=V.distanceTo(X),q.push(B),S.push(B,B);const L=B*N;E.push(0,L,1,L);const T=B*I;R.lerpColors(c,u,T);const F=_.clone().multiplyScalar(j),z=V.clone().sub(F);let M=A*2*3;z.toArray(x,M),Z.toArray(U,M),R.toArray(G,M);const H=V.clone().add(F);M+=3,H.toArray(x,M),Z.toArray(U,M),R.toArray(G,M),X=V}const tt=x.length/3,J=r?Xt(tt,r+1,a):Xt(tt);return{position:x,normal:U,uv:E,index:J,color:G,lineDistance:S,lengths:q,points:f,tangents:m,normals:b,binormals:d}}function Lt(n,e){const{up:t,autoClose:o}=e;if(o){const r=n[0],i=n.at(-1);r.equals(i)||(n=[...n,r.clone()])}const s=e.fixUp?Jt(n,t):_n(n,t);return s.points=n,Ft(s,e)}function Ft(n,e){const{startColor:t,endColor:o,color:s,prePoint:r,preIndex:i,connectPre:a}=e,l=s?new h.Color(s):null,c=t?new h.Color(t):l??new h.Color(0,1,0),u=o?new h.Color(o):l??new h.Color(0,0,1),g=e.width??1,p=g/2,f=e.preLength??0,{tangents:m,normals:b,binormals:d,lengths:v,points:D}=n,C=v.at(-1);let w=m[0],P=b[0],O=d[0];const j=D[0],x=(r?j.distanceTo(r):0)+f,U=C+x,E=e.uvStep??U,G=v.map(_=>_+x),S=[],N=[],I=[],B=[],R=[],X=1/E,tt=1/U,J=new h.Color,A=D.length-1;let V=0;for(let _=0;_<=A;_++){const L=G[_],T=D[_],F=m[_],z=b[_],M=d[_],H=_<A,K=_>0,At=H&&K;let it,ct,ut;if(At){let et=Un({point:T,length:L,width:g},{tangent:w,normal:P,binormal:O},{tangent:F,normal:z,binormal:M},e);it=et.points,ct=et.normals,ut=et.lengths}else{const Q=M.clone().multiplyScalar(p),nt=T.clone().sub(Q),Y=T.clone().add(Q);it=[nt,Y],ct=[z,z],ut=[L,L]}const ht=it.length;for(let Q=0;Q<ht;Q++){const nt=it[Q],Y=ut[Q],et=ct[Q],mt=Y*tt;J.lerpColors(c,u,mt),J.toArray(B,V),nt.toArray(S,V),et.toArray(N,V),R.push(Y);const bt=Q%2,yt=Y*X;I.push(bt,yt),V+=3}w=F,P=z,O=M}const Z=i?Zt(S,i+1,a):Zt(S);return{position:S,normal:N,uv:I,color:B,index:Z,lineDistance:R,length,lengths:G,points:D,tangents:m,normals:b,binormals:d}}var rn=(n=>(n.intact="intact",n.add="add",n.addGap="addGap",n))(rn||{});function an(n,e,t,o="intact"){let{points:s,index:r,lengths:i,position:a,normal:l,uv:c,color:u,lineDistance:g,tangents:p,normals:f,binormals:m}=n,{points:b,index:d,lengths:v,position:D,normal:C,uv:w,color:P,lineDistance:O,tangents:j,normals:q,binormals:x}=e;const{fixUp:U,up:E}=t,S=r.at(-3)-4,N=s.at(-1),I=s.at(-2);let B=v.at(-1);const R=b[0],X=b[1];if(o&&o!=="intact"){let k=i.at(-1);o==="addGap"&&(k+=N.distanceTo(R));const gt=k/B;B+=k;let ot=O.length;for(let $=0;$<ot;$++)O[$]+=k,w[$*2+1]+=gt;ot=v.length;for(let $=0;$<ot;$++)v[$]+=k}const tt=p.at(-1),J=p.at(-2),A=f.at(-1),V=f.at(-2),Z=m.at(-1),_=m.at(-2),L=i.at(-1),T=i.at(-2),F=j[0],z=j[1],M=q[0],H=q[1],K=x[0],At=x[1],it=v[0],ct=v[1],ut=N.equals(R),ht=ut?[I,R,X]:[I,N,R,X];let Q;if(U)Q={...Jt(ht,E),points:ht};else if(ut)Q={tangents:[J,F,z],normals:[V,M,H],binormals:[_,K,At],lengths:[T,it,ct],points:ht};else{const k=R.clone().sub(N).normalize(),gt=new h.Quaternion().setFromUnitVectors(tt,k),ot=A.clone().applyQuaternion(gt),$=Z.clone().applyQuaternion(gt);Q={tangents:[J,k,F,z],normals:[V,ot,M,H],binormals:[_,$,K,At],lengths:[T,L,it,ct],points:ht}}let{index:nt,position:Y,normal:et,uv:mt,color:bt,lineDistance:yt}=Ft(Q,{...t,preLength:void 0,preIndex:S,prePoint:void 0,connectPre:!1});if(a=a.slice(0,-6),l=l.slice(0,-6),c=c.slice(0,-4),u=u.slice(0,-6),g=g.slice(0,-2),Y=Y.slice(6,-6),et=et.slice(6,-6),mt=mt.slice(4,-4),bt=bt.slice(6,-6),yt=yt.slice(2,-2),nt=nt.slice(6,-6),D=D.slice(6),C=C.slice(6),w=w.slice(4),P=P.slice(6),O=O.slice(2),t.connectPre){const k=d.length%6;d=d.slice(k)}const gn=Math.min(...d.slice(0,3)),pn=Math.max(...nt.slice(-3))-1;if(pn!==gn){let k=d.length;const gt=pn-gn;for(let ot=0;ot<k;ot++)d[ot]+=gt}const Nn=[...a,...Y,...D],zn=[...l,...et,...C],Qn=[...c,...mt,...w],jn=[...u,...bt,...P],qn=[...g,...yt,...O],En=[...r,...nt,...d],kn=[...s,...b],Wn=[...i,...v],Jn=[...p,...j],Xn=[...f,...q],Zn=[...m,...x];return{position:Nn,normal:zn,uv:Qn,color:jn,lineDistance:qn,index:En,points:kn,lengths:Wn,length:B,tangents:Jn,normals:Xn,binormals:Zn}}function Gt(n,e,t){let o=t,s;const{autoClose:r}=e;if(r){const i=(t==null?void 0:t.points)??[Bt(n[0]),Rt(n.at(-1))],a=i[0],l=i.at(-1);a.equals(l)||n.push(a.clone())}e={...e,autoClose:!1};for(let i of n){let a,l,c=s,u=e;if(o){const{points:f,lengths:m,index:b}=o;a=m.at(-1),l=b.at(-3),c=f.at(-1),u={...e,preLength:a,preIndex:l,prePoint:c,connectPre:!1}}s&&(u={...e,prePoint:c});let g,p;i instanceof h.Curve?p=Tt(i,u):Array.isArray(i)?(i.length>1&&(p=Lt(i,u)),g=i[0]):g=i,!p&&c&&g&&!c.equals(g)&&(p=Lt([c,g],o?u:e)),p?(o=o?an(o,p,{...e,connectPre:!1}):p,s=void 0):s=g}return o}class ln extends Vt{constructor(t){super(t);W(this,"isBandGeometry",!0);W(this,"frenetFrames",null)}get up(){return this.options.up??(this.options.up=Object.assign({},this.globalOptions.up??rt.up))}set up(t){this.options.up=t}get fixUp(){return this.options.fixUp??(this.options.fixUp=this.globalOptions.fixUp??rt.fixUp)}set fixUp(t){this.options.fixUp=t}get useU(){return this.options.useU??(this.options.useU=this.globalOptions.useU??rt.useU)}set useU(t){this.options.useU=t}get uvStep(){return this.options.uvStep??(this.options.uvStep=this.globalOptions.uvStep??rt.uvStep)}set uvStep(t){this.options.uvStep=t}get drawType(){return this.options.drawType??(this.options.drawType=this.globalOptions.drawType??rt.drawType)}set drawType(t){this.options.drawType=t}get connectionType(){return this.options.connectionType??(this.options.connectionType=this.globalOptions.connectionType??rt.connectionType)}set connectionType(t){this.options.connectionType=t}get smoothStepLength(){return this.options.smoothStepLength}set smoothStepLength(t){this.options.smoothStepLength=t}get smoothStepAngle(){return this.options.smoothStepAngle}set smoothStepAngle(t){this.options.smoothStepAngle=t}append(t){const{lastPoint:o,endLength:s}=this,r=Dt(t,o,!0);if(this.pathData.push(t),this.curves.push(...r),this.drawType!=="blend")return this.updateGeometry();const{openedGeometryData:i,options:a}=this,l=[t],c=new h.Vector3().copy(a.up??{x:0,y:1,z:0}).normalize(),u={...a,preLength:s,up:c,connectPre:!0};if(i){const{lengths:p,index:f,points:m}=i;u.preLength=p.at(-1),u.preIndex=f.at(-3),u.prePoint=m.at(-1)}const g=Gt(l,u,i);this.resetAttributes(g)}updateGeometry(){const{closedCurvePath:t,closedPathData:o,endLength:s,drawType:r,options:i}=this,a=new h.Vector3().copy(i.up??{x:0,y:1,z:0}).normalize(),l={...i,preLength:s,autoClose:!1,up:a,connectPre:!0};let c;switch(r){case"curve":{c=Tt(t,l);break}case"polyline":{const{division:u}=Mt({...l,curve:t}),g=t.getPoints(u);c=Lt(g,l);break}default:{c=Gt(o,l);break}}this.resetAttributes(c)}get geometryData(){const t=this.frenetFrames;if(!t)return null;const o=this.getAttribute("position").array,s=this.getAttribute("normal").array,r=this.getAttribute("uv").array,i=this.getIndex().array,a=this.getAttribute("color").array,l=this.getAttribute(at).array;return{position:o,normal:s,uv:r,index:i,color:a,lineDistance:l,...t}}get openedGeometryData(){const{geometryData:t,closed:o}=this;if(!(t&&o))return t;const{position:s,normal:r,uv:i,index:a,color:l,lineDistance:c,lengths:u,points:g,tangents:p,normals:f,binormals:m}=t,b=-6,d=-1;return{position:s.slice(0,b),normal:r.slice(0,b),uv:i.slice(0,-4),color:l.slice(0,b),lineDistance:c.slice(0,-2),index:a.slice(0,b),lengths:u.slice(0,d),points:g.slice(0,d),tangents:p.slice(0,d),normals:f.slice(0,d),binormals:m.slice(0,d)}}resetAttributes(t){super.resetAttributes(t);const{points:o,tangents:s,normals:r,binormals:i,lengths:a}=t;this.frenetFrames={points:o,tangents:s,normals:r,binormals:i,lengths:a}}getDivisionIndex(t){return Math.floor(t/2)}setDrawLength(t,o){var a;let s=((a=this.getIndex())==null?void 0:a.count)??1;s-=1;let r=this.getClosestIndex(t);r=this.getDivisionIndex(r)*6,r=Math.min(r,s);let i=1/0;if(!(o==null||o===1/0)){let l=this.getClosestIndex(o);l=this.getDivisionIndex(l)*6,l=Math.min(l,s),i=l-r+1}this.setDrawRange(r,i)}}Object.assign(ln.options,rt);function Nt(n,e){for(const[t,o]of Object.entries(e))n[t]={value:o};return n}function zt(n,e,t){n.uniforms=Nt(t||n.uniforms||{},e);const o={},s=Object.keys(n);for(const[r,i]of Object.entries(e)){if(s.includes(r))continue;const a=function(){return this.uniforms[r].value},l=i.copy?function(c){this.uniforms[r].value.copy(c)}:function(c){this.uniforms[r].value=c};o[r]={configurable:!0,enumerable:!0,get:a,set:l}}return Object.defineProperties(n,o),n}function lt(n,e,t){let o;return t&&e?(zt(t,e),o=function(s,...r){const i=s.uniforms;this.uniforms=Nt(i,e),n.call(this,s,...r)}):e?o=function(s,...r){const i=s.uniforms;zt(this,e,i),n.call(this,s,...r)}:o=function(s,...r){this.uniforms=s.uniforms,n.call(this,s,...r)},o}const dt=/void\s+main\s*\(\)\s*\{\s*/,Qt={invert:!1,enableURange:!0,enableVRange:!0,uvMax:new h.Vector2(1e5,1e5),uvMin:new h.Vector2(0,0)},cn=`
uniform bool invert;
uniform bool enableURange;
uniform bool enableVRange;
uniform vec2 uvMax;
uniform vec2 uvMin;
void main() {
bool isDiscard = false;
#if defined(USE_MAP) || defined(USE_UV)
vec2 rangeUV;
#ifdef USE_MAP
rangeUV = vMapUv;
#else
rangeUV = vUv;
#endif
bool xDiscard = enableURange && ( uvMin.x > rangeUV.x || rangeUV.x > uvMax.x);
bool yDiscard = enableVRange && (uvMin.y > rangeUV.y || rangeUV.y > uvMax.y);
isDiscard = xDiscard || yDiscard;
#endif
if (invert){
isDiscard = !isDiscard;
}
if (isDiscard) discard;
`;function jt(n){n.fragmentShader=n.fragmentShader.replace(dt,cn)}const Rn=lt(jt,Qt);function Vn(n){const e=n.defines??(n.defines={});return e.USE_UV=!0,n.onBeforeCompile=lt(jt,Qt,n),n}const Pt={invert:!1,enableStart:!0,enableEnd:!0,startLength:0,endLength:1e6},un=`
attribute float lineDistance;
varying float vLineDistance;
void main() {
vLineDistance = lineDistance;
`,hn=`
varying float vLineDistance;
`,qt=`
uniform bool invert;
uniform bool enableStart;
uniform bool enableEnd;
uniform float startLength;
uniform float endLength;
void main() {
bool startDiscard = enableStart && vLineDistance < startLength;
bool endDiscard = enableEnd && vLineDistance > endLength;
bool isDiscard = startDiscard || endDiscard;
if (invert){
isDiscard = !isDiscard;
}
if (isDiscard) discard;
`;function Et(n){n.vertexShader=n.vertexShader.replace(dt,un);const e=hn+qt;n.fragmentShader=n.fragmentShader.replace(dt,e)}function kt(n){n.fragmentShader=n.fragmentShader.replace(dt,qt)}const Tn=lt(Et,Pt),Fn=lt(kt,Pt);function Gn(n){const e=n.isLineDashedMaterial?kt:Et;return n.onBeforeCompile=lt(e,Pt,n),n}return y.BandGeometry=ln,y.LengthConnectType=rn,y.PathDrawType=on,y.PathGeometry=Vt,y.addUniformPropertiesOnMaterial=zt,y.addUniforms=Nt,y.connectBandGeometryData=an,y.createBlendBandGeometryData=Gt,y.createCurveBandGeometryData=Tt,y.createCurveBandGeometryDataByFrenetFrames=sn,y.createOnBeforeCompile=lt,y.createPolylineBandGeometryData=Lt,y.createPolylineBandGeometryDataByFrenetFrames=Ft,y.createPolylinePathGeometryData=en,y.getClosestIndex=Yt,y.getCurvePoints=nn,y.getNearbyIndex=$t,y.getPathItemEndPoint=Rt,y.getPathItemStartPoint=Bt,y.lengthAttributeName=at,y.lengthDrawRangeModifier=Gn,y.lengthDrawRange_Mender=Et,y.lengthDrawRange_fragment_mainReplace=qt,y.lengthDrawRange_fragment_pars_mainReplace=hn,y.lengthDrawRange_onBeforeCompile=Tn,y.lengthDrawRange_uniforms=Pt,y.lengthDrawRange_vertex_mainReplace=un,y.lineDashedLengthDrawRange_Mender=kt,y.lineDashedLengthDrawRange_onBeforeCompile=Fn,y.minFun_Regex=dt,y.pathDataToContinuousCurves=tn,y.pathDataToCurves=In,y.pathItemToCurve=Bn,y.pathItemToCurves=Dt,y.uvDrawRangeModifier=Vn,y.uvDrawRange_Mender=jt,y.uvDrawRange_fragment_mainReplace=cn,y.uvDrawRange_onBeforeCompile=Rn,y.uvDrawRange_uniforms=Qt,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"}),y}({},three);