ocearo-ui 0.1.21 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/404.html +1 -1
- package/README.fr.md +123 -133
- package/README.md +120 -134
- package/__next.__PAGE__.txt +19 -5
- package/__next._full.txt +11 -11
- package/__next._tree.txt +2 -2
- package/_next/static/chunks/0-c2-u5p6bxzo.js +1 -0
- package/_next/static/chunks/01atsfq_4opab.js +1 -0
- package/_next/static/chunks/0cx639tthxlz4.js +1 -0
- package/_next/static/chunks/0h2qsuyze9ds1.js +1 -0
- package/_next/static/chunks/0iqdztntvxh3c.js +119 -0
- package/_next/static/chunks/0iztd835j5p1n.js +700 -0
- package/_next/static/chunks/{2nxsyowmuwpjy.js → 0jfox92up1jvy.js} +1 -1
- package/_next/static/chunks/0jpa5m78l0ib0.js +1 -0
- package/_next/static/chunks/0kpstejrka-7k.js +1 -0
- package/_next/static/chunks/0n95joti2n2py.js +3 -0
- package/_next/static/chunks/0oaqe70syw_b5.js +1 -0
- package/_next/static/chunks/0ohleay4roayh.js +353 -0
- package/_next/static/chunks/0on1skx9l54-9.js +1 -0
- package/_next/static/chunks/0w_skktmh3e48.js +1 -0
- package/_next/static/chunks/0y-dctk-kmqss.js +1 -0
- package/_next/static/chunks/0yiqocv54ogoq.js +1 -0
- package/_next/static/chunks/0zlk2mlkvbtj1.js +1 -0
- package/_next/static/chunks/0zwc9m4qgtwle.js +1 -0
- package/_next/static/chunks/11awvgcou7v4r.js +1 -0
- package/_next/static/chunks/144mjqdrx42lq.js +1 -0
- package/_next/static/chunks/1d81m3g9jqkob.js +1 -0
- package/_next/static/chunks/1ed7ayfg19cjb.js +1 -0
- package/_next/static/chunks/1epya-yh2wvj2.js +1 -0
- package/_next/static/chunks/1exvcc71cgr4t.js +446 -0
- package/_next/static/chunks/1fzzb4jtgv5gg.js +9 -0
- package/_next/static/chunks/1g8fbzv0hu0i2.js +1 -0
- package/_next/static/chunks/1gaiqhzy_0d7s.js +1 -0
- package/_next/static/chunks/1gq4t2dyr7rq3.js +1 -0
- package/_next/static/chunks/1l-jew0-1-3eq.js +30 -0
- package/_next/static/chunks/1ptj3mv8b_tzs.js +1 -0
- package/_next/static/chunks/1w1xks0hp_tlr.js +346 -0
- package/_next/static/chunks/1xekc18cyi4sx.js +1 -0
- package/_next/static/chunks/1y35unwvy8p98.js +1 -0
- package/_next/static/chunks/2aq8orcir5h03.js +1 -0
- package/_next/static/chunks/2fdpvhx4oo81h.js +1 -0
- package/_next/static/chunks/2g-xpe7xnropn.js +409 -0
- package/_next/static/chunks/2kmptoy43h0mx.js +1 -0
- package/_next/static/chunks/2n86yq1wz1yx7.js +1 -0
- package/_next/static/chunks/2r_h93rt76vka.js +1 -0
- package/_next/static/chunks/2rebcvig176xk.js +564 -0
- package/_next/static/chunks/2w71oj1brox5z.js +1 -0
- package/_next/static/chunks/2wayx8t5r5fi9.js +1 -0
- package/_next/static/chunks/2y3d8zopa8r5r.css +3 -0
- package/_next/static/chunks/3--qzv1u6c7_7.js +1 -0
- package/_next/static/chunks/31lugryguappr.js +1 -0
- package/_next/static/chunks/32j_j396qs7be.js +1 -0
- package/_next/static/chunks/32yn_fc-es66m.js +22 -0
- package/_next/static/chunks/34_oyzp8_pi_m.js +1 -0
- package/_next/static/chunks/34wvn5zw0a69w.js +1 -0
- package/_next/static/chunks/37t6vg8fb1-z8.js +1 -0
- package/_next/static/chunks/3k5itcabq5oqs.js +9 -0
- package/_next/static/chunks/3ktj0iemsr1m-.js +1 -0
- package/_next/static/chunks/3nm7o0eq5abhg.js +1 -0
- package/_next/static/chunks/3s6nzrbk-8mnv.js +31 -0
- package/_next/static/chunks/3td9mnhvcj9cq.js +1 -0
- package/_next/static/chunks/3xjnsskh0tayo.js +1 -0
- package/_next/static/chunks/3zqx8h9yg5-ch.js +1 -0
- package/_next/static/chunks/turbopack-1h111qg8l92rw.js +1 -0
- package/_not-found/__next._full.txt +12 -12
- package/_not-found/__next._not-found.__PAGE__.txt +19 -2
- package/_not-found/__next._tree.txt +2 -2
- package/_not-found.html +1 -1
- package/_not-found.txt +12 -12
- package/boats/boats.json +40 -5
- package/index.html +1 -1
- package/index.txt +11 -11
- package/package.json +14 -14
- package/settings/__next._full.txt +14 -14
- package/settings/__next._tree.txt +2 -2
- package/settings/__next.settings.__PAGE__.txt +22 -5
- package/settings.html +1 -1
- package/settings.txt +14 -14
- package/__next._head.txt +0 -6
- package/__next._index.txt +0 -5
- package/_next/static/chunks/009rlietvsaq2.js +0 -1
- package/_next/static/chunks/070stlm97b9a2.js +0 -1
- package/_next/static/chunks/08gn5_gd6amkq.js +0 -1
- package/_next/static/chunks/0abo2oxxw3hpi.js +0 -1
- package/_next/static/chunks/0jzbiie0nzar2.js +0 -1
- package/_next/static/chunks/0l9s4rhr00adq.js +0 -1
- package/_next/static/chunks/0ri_um14-5x7u.js +0 -1
- package/_next/static/chunks/0utifqhyv2cuc.js +0 -1
- package/_next/static/chunks/0uvr7xkt_5uno.js +0 -1
- package/_next/static/chunks/0wzr1__so6xme.js +0 -1
- package/_next/static/chunks/0zjxnzbxh76mt.js +0 -1
- package/_next/static/chunks/11ln9lzzbo35q.js +0 -1
- package/_next/static/chunks/1bz0tcmhjmjgh.js +0 -1
- package/_next/static/chunks/1d4h-sglyo8ft.js +0 -1
- package/_next/static/chunks/1gizigk3w6q7j.js +0 -31
- package/_next/static/chunks/1porlo35ga4zu.js +0 -1
- package/_next/static/chunks/1ptwltjb3h6jf.js +0 -4
- package/_next/static/chunks/1sq_733weprvs.js +0 -1
- package/_next/static/chunks/1w1ua0-p5lk1e.js +0 -38
- package/_next/static/chunks/1wv5e5qomv-7g.css +0 -3
- package/_next/static/chunks/27hn45pv56pv7.js +0 -393
- package/_next/static/chunks/28y-j215vt42m.js +0 -1
- package/_next/static/chunks/29-ag86gvlc40.js +0 -9
- package/_next/static/chunks/2a0yjir_3mk1m.js +0 -1
- package/_next/static/chunks/2atijj_pkc4uc.js +0 -2
- package/_next/static/chunks/2baz6j1q913qw.js +0 -1
- package/_next/static/chunks/2ccpehidlaq88.js +0 -1
- package/_next/static/chunks/2lez3uww9j4t0.js +0 -135
- package/_next/static/chunks/2lvvt2f1l5sfu.js +0 -1
- package/_next/static/chunks/2nd5amcst4lhp.js +0 -1
- package/_next/static/chunks/2pwmb4pkqygy_.js +0 -1
- package/_next/static/chunks/2rsdqsatgq9ta.js +0 -1
- package/_next/static/chunks/2uao1hfsz-oy8.js +0 -1
- package/_next/static/chunks/2urimbxg5bqv3.js +0 -1
- package/_next/static/chunks/2yghvponatk1x.js +0 -135
- package/_next/static/chunks/31i14-jemhnic.js +0 -863
- package/_next/static/chunks/32cbrrsp-x35l.js +0 -1
- package/_next/static/chunks/36ra6xjie0dsv.js +0 -9
- package/_next/static/chunks/3dt63tw_9r0jt.js +0 -38
- package/_next/static/chunks/3iuz3f0429awx.js +0 -1
- package/_next/static/chunks/3jh1u-s3k0bkk.js +0 -1
- package/_next/static/chunks/3jupxlga7r_do.js +0 -1
- package/_next/static/chunks/3m57lnggu30tr.js +0 -243
- package/_next/static/chunks/3rhgquok36e79.js +0 -1
- package/_next/static/chunks/3sgrkzk20mxs6.js +0 -54
- package/_next/static/chunks/42dfiu6iby3fq.js +0 -1
- package/_next/static/chunks/43ps2cu5ahf8n.js +0 -3
- package/_next/static/chunks/turbopack-0pirmko-w-775.js +0 -1
- package/_not-found/__next._head.txt +0 -6
- package/_not-found/__next._index.txt +0 -5
- package/_not-found/__next._not-found.txt +0 -5
- package/boats/ais/ais-30.glb +0 -0
- package/boats/ais/ais-31.glb +0 -0
- package/boats/ais/ais-35.glb +0 -0
- package/boats/ais/ais-36.glb +0 -0
- package/boats/ais/ais-37.glb +0 -0
- package/boats/ais/ais-40.glb +0 -0
- package/boats/ais/ais-50.glb +0 -0
- package/boats/ais/ais-60.glb +0 -0
- package/boats/ais/ais-70.glb +0 -0
- package/boats/ais/ais-80.glb +0 -0
- package/settings/__next._head.txt +0 -6
- package/settings/__next._index.txt +0 -5
- package/settings/__next.settings.txt +0 -5
- /package/_next/static/{hlKDicTyNGfd7dmHqo5m5 → baa0rBM5TIECz8JV_tLT6}/_buildManifest.js +0 -0
- /package/_next/static/{hlKDicTyNGfd7dmHqo5m5 → baa0rBM5TIECz8JV_tLT6}/_clientMiddlewareManifest.js +0 -0
- /package/_next/static/{hlKDicTyNGfd7dmHqo5m5 → baa0rBM5TIECz8JV_tLT6}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,72466,e=>{"use strict";let t={WARNING_THRESHOLD:50,DANGER_THRESHOLD:20,CHARGING_THRESHOLD:13.2,MIN_VOLTAGE:10.5,MAX_VOLTAGE:14.4};e.s(["BATTERY_CONFIG",0,t,"estimateStateOfCharge",0,e=>{if(!e||"number"!=typeof e)return 0;if(e>=13)return 100;if(e<=t.MIN_VOLTAGE)return 0;let r=[{voltage:12.85,soc:100},{voltage:12.75,soc:90},{voltage:12.65,soc:80},{voltage:12.55,soc:70},{voltage:12.45,soc:60},{voltage:12.35,soc:50},{voltage:12.25,soc:40},{voltage:12.15,soc:30},{voltage:12.05,soc:20},{voltage:11.95,soc:15},{voltage:11.8,soc:10},{voltage:11.6,soc:5},{voltage:10.5,soc:0}];for(let t=0;t<r.length-1;t++)if(e>=r[t+1].voltage){let o=r[t].voltage,u=r[t+1].voltage,n=r[t].soc,l=r[t+1].soc;return Math.round(l+(e-u)/(o-u)*(n-l))}return 0},"isBatteryCharging",0,e=>e>t.CHARGING_THRESHOLD])},52822,(e,t,r)=>{"use strict";var o=e.r(71645),u=e.r(2239),n="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},l=u.useSyncExternalStore,a=o.useRef,c=o.useEffect,s=o.useMemo,i=o.useDebugValue;r.useSyncExternalStoreWithSelector=function(e,t,r,o,u){var v=a(null);if(null===v.current){var f={hasValue:!1,value:null};v.current=f}else f=v.current;var g=l(e,(v=s(function(){function e(e){if(!c){if(c=!0,l=e,e=o(e),void 0!==u&&f.hasValue){var t=f.value;if(u(t,e))return a=t}return a=e}if(t=a,n(l,e))return t;var r=o(e);return void 0!==u&&u(t,r)?(l=e,t):(l=e,a=r)}var l,a,c=!1,s=void 0===r?null:r;return[function(){return e(t())},null===s?void 0:function(){return e(s())}]},[t,r,o,u]))[0],v[1]);return c(function(){f.hasValue=!0,f.value=g},[g]),i(g),g}},30224,(e,t,r)=>{"use strict";e.i(47167),t.exports=e.r(52822)}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95163,e=>{"use strict";var r=e.i(43476);e.i(71645),e.i(85269);var t=e.i(22831),n=e.i(49721),i=e.i(68757),a=e.i(83646),o=e.i(77291);e.s(["default",0,()=>{let{t:e}=(0,t.useTranslation)(),{scene:s}=(0,a.default)(),{giveWayTo:l,encounters:u}=(0,o.default)();if(!l)return null;let{target:g,role:d}=l,c=u.filter(e=>"stand-on"!==e.role.ownRole).length-1;return(0,r.jsxs)("div",{className:"flex items-center gap-3 px-4 py-2 rounded-2xl select-none text-white backdrop-blur",style:{background:`color-mix(in srgb, ${s.giveWay} 82%, transparent)`},role:"alert",children:[(0,r.jsx)(n.FontAwesomeIcon,{icon:i.faTriangleExclamation,className:"text-lg"}),(0,r.jsxs)("div",{className:"leading-tight",children:[(0,r.jsx)("div",{className:"text-label font-bold uppercase tracking-widest",children:e("colregs.youGiveWay")}),(0,r.jsxs)("div",{className:"text-caption font-semibold opacity-95",children:[e(`colregs.${d.reason}`,{name:g.name})," · ",e("colregs.rule",{rule:d.rule}),c>0&&` \xb7 +${c}`]})]})]})}])},78938,function(e){e.n(e.i(95163))},77291,e=>{"use strict";var r=e.i(71645),t=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},l=e=>{let r=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(r))return"restricted";if(/fishing/.test(r))return"fishing";if(/sailing/.test(r))return"sail";if(/motoring|engine/.test(r))return"power";let t=Number(e.shipType);return 36===t?"sail":30===t?"fishing":33===t?"restricted":"power"},u=(e,r,t)=>(0,a.wrapPi)(Math.atan2(r.x-e.x,r.y-e.y)-t),g=(e,r,t)=>{let n={x:0,y:0},i=u(n,r,e.course),l=u(r,n,r.course),g=Math.sign(l)||1,d=e=>Math.abs(e)>112.5*o;if(d(i)&&r.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(d(l)&&e.speed>r.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let c=s[e.category]??1,p=s[r.category]??1;if(c!==p)return c<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${r.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${r.category}`,targetTurn:g};if("sail"===e.category&&Number.isFinite(t)){let n=(0,a.wrapPi)(t-e.course)>=0?"starboard":"port";return n!==((0,a.wrapPi)(t-r.course)>=0?"starboard":"port")?"port"===n?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:g}:r.x*Math.sin(t)+r.y*Math.cos(t)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:g}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(r.course-e.course-Math.PI))<10*o&&Math.abs(i)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:i>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:g}};var d=e.i(83402),c=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,t.useAIS)({passive:!0}),{states:u}=(0,c.useOcearoContext)(),v=e||u.ais?s:p,{twd:h,heading:f}=(0,i.default)(),b=(0,n.useSignalKPaths)(m),w=(a=(0,n.useSignalKPrefix)("propulsion."),o=d.default.get("ownVesselCategory"),(0,r.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,r])=>e.endsWith(".revolutions")&&Number(r)>.5||e.endsWith(".state")&&"started"===r)?"power":"sail",[a,o])),T=d.default.get("aisLengthScalingFactor")||.7;return(0,r.useMemo)(()=>{let e=b["navigation.courseOverGroundTrue"]??f,r=b["navigation.speedOverGround"]??0,t=[];if(Number.isFinite(e))for(let n of v){if("danger"!==n.risk)continue;let i=n.cog??n.cogMagnetic??n.heading;if(!Number.isFinite(i)||null===n.sceneX)continue;let a=g({course:e,speed:r,category:w},{x:n.sceneX/T,y:-n.sceneZ/T,course:i,speed:n.sog??0,category:l(n)},h);t.push({target:{...n},role:a})}t.sort((e,r)=>(e.target.tcpaSeconds??1/0)-(r.target.tcpaSeconds??1/0));let n={};for(let e of v)"close"===e.risk?n[e.mmsi]="close":"danger"===e.risk&&(n[e.mmsi]="giveWay");for(let e of t)n[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let i=t.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:w,encounters:t,statuses:n,giveWay:i.length>0,giveWayTo:i[0]||null,primary:t[0]||null}},[v,h,f,b,w,T])}],77291)},61969,e=>{"use strict";var r=e.i(71645),t=e.i(85709),n=e.i(539);let i=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,t.useSignalKPaths)(a);return(0,r.useMemo)(()=>{let r=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,t=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(t)&&(s=(0,n.wrapPi)(t+o));let l=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,n.polarSpeedSi)(a,o):null),u=e["performance.polarSpeedRatio"]??null;null===u&&Number.isFinite(r)&&Number.isFinite(l)&&l>.2&&(u=r/l);let g=Number.isFinite(r)&&Number.isFinite(l)?(r-l)*1.943844:null,d=null,c=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,n.optimalUpwind)(1.943844*a):(0,n.optimalDownwind)(1.943844*a);e&&(d=e.twa/i,Number.isFinite(s)&&Number.isFinite(o)&&(c=(0,n.wrapPi)(s-Math.sign(o||1)*d)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],v=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,n.bestVmcHeading)({twd:s,tws:a,bearing:m}),r=Number.isFinite(t)?(0,n.vmcForHeading)({twd:s,tws:a,bearing:m,heading:t}):null;v=e?{bearing:m,best:e,current:r}:null}return{ratio:u,polarSpeed:l,boatSpeed:r,deltaKn:g,heading:t,twd:s,tws:a,twa:o,targetTwa:d,targetHeading:c,upwind:p,vmc:v}},[e])}])},83646,e=>{"use strict";var r=e.i(67561);e.s(["default",0,()=>(0,r.useOcearoContext)().tokens])},74452,(e,r,t)=>{r.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var r=e.i(74452);let t=180/Math.PI,n=r.default.vpp,i=(e,r,t)=>e+(r-e)*t,a=(e,r)=>{if(r<=e[0])return[0,0];let t=e.length-1;if(r>=e[t])return[t-1,1];let n=0;for(;r>e[n+1];)n++;return[n,(r-e[n])/(e[n+1]-e[n])]},o=n.speeds.map((e,r)=>(e=>{let r=n.beat_angle[e],i=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(r/t),o=n.run_vmg[e]/Math.abs(Math.cos(i/t)),s=[[0,0],[.7*r,.55*a],[r,a]];for(let t of n.angles)t>r&&t<i&&s.push([t,n[String(t)][e]]);return s.push([i,o]),i<180&&s.push([180,n.run_vmg[e]]),s})(r)),s=(e,r)=>{let[t,n]=a(e.map(e=>e[0]),r);return i(e[t][1],e[t+1][1],n)},l=(e,r)=>{if(!Number.isFinite(e)||!Number.isFinite(r)||e<=0)return null;let t=Math.min(180,Math.abs((r+540)%360-180)),l=n.speeds;if(e<l[0])return s(o[0],t)*(e/l[0]);let[u,g]=a(l,e);return i(s(o[u],t),s(o[u+1],t),g)},u=(e,r)=>{let[t,o]=a(n.speeds,r);return i(e[t],e[t+1],o)},g=(e,r)=>{let n=l(1.943844*e,r*t);return null===n?null:n/1.943844},d=e=>{let r=(e+Math.PI)%(2*Math.PI);return r<0&&(r+=2*Math.PI),r-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:r,bearing:n})=>{if(![e,r,n].every(Number.isFinite)||r<=0)return null;let i=null;for(let a=-100;a<=100;a++){let o=n+a/t,s=g(r,d(e-o));if(null===s)continue;let l=s*Math.cos(o-n);(!i||l>i.vmc)&&(i={heading:d(o),speed:s,vmc:l})}return i},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let r=u(n.run_angle,e),i=l(e,r);return{twa:r,speed:i,vmg:-i*Math.cos(r/t)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let r=u(n.beat_angle,e),i=l(e,r);return{twa:r,speed:i,vmg:i*Math.cos(r/t)}},"polarSpeed",0,l,"polarSpeedSi",0,g,"vmcForHeading",0,({twd:e,tws:r,bearing:t,heading:n})=>{if(![e,r,t,n].every(Number.isFinite))return null;let i=g(r,d(e-n));return null===i?null:i*Math.cos(n-t)},"wrapPi",0,d])}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,77291,e=>{"use strict";var r=e.i(71645),t=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},u=e=>{let r=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(r))return"restricted";if(/fishing/.test(r))return"fishing";if(/sailing/.test(r))return"sail";if(/motoring|engine/.test(r))return"power";let t=Number(e.shipType);return 36===t?"sail":30===t?"fishing":33===t?"restricted":"power"},l=(e,r,t)=>(0,a.wrapPi)(Math.atan2(r.x-e.x,r.y-e.y)-t),g=(e,r,t)=>{let n={x:0,y:0},i=l(n,r,e.course),u=l(r,n,r.course),g=Math.sign(u)||1,d=e=>Math.abs(e)>112.5*o;if(d(i)&&r.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(d(u)&&e.speed>r.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let c=s[e.category]??1,p=s[r.category]??1;if(c!==p)return c<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${r.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${r.category}`,targetTurn:g};if("sail"===e.category&&Number.isFinite(t)){let n=(0,a.wrapPi)(t-e.course)>=0?"starboard":"port";return n!==((0,a.wrapPi)(t-r.course)>=0?"starboard":"port")?"port"===n?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:g}:r.x*Math.sin(t)+r.y*Math.cos(t)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:g}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(r.course-e.course-Math.PI))<10*o&&Math.abs(i)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:i>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:g}};var d=e.i(83402),c=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,t.useAIS)({passive:!0}),{states:l}=(0,c.useOcearoContext)(),v=e||l.ais?s:p,{twd:h,heading:b}=(0,i.default)(),f=(0,n.useSignalKPaths)(m),w=(a=(0,n.useSignalKPrefix)("propulsion."),o=d.default.get("ownVesselCategory"),(0,r.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,r])=>e.endsWith(".revolutions")&&Number(r)>.5||e.endsWith(".state")&&"started"===r)?"power":"sail",[a,o])),T=d.default.get("aisLengthScalingFactor")||.7;return(0,r.useMemo)(()=>{let e=f["navigation.courseOverGroundTrue"]??b,r=f["navigation.speedOverGround"]??0,t=[];if(Number.isFinite(e))for(let n of v){if("danger"!==n.risk)continue;let i=n.cog??n.cogMagnetic??n.heading;if(!Number.isFinite(i)||null===n.sceneX)continue;let a=g({course:e,speed:r,category:w},{x:n.sceneX/T,y:-n.sceneZ/T,course:i,speed:n.sog??0,category:u(n)},h);t.push({target:{...n},role:a})}t.sort((e,r)=>(e.target.tcpaSeconds??1/0)-(r.target.tcpaSeconds??1/0));let n={};for(let e of v)"close"===e.risk?n[e.mmsi]="close":"danger"===e.risk&&(n[e.mmsi]="giveWay");for(let e of t)n[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let i=t.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:w,encounters:t,statuses:n,giveWay:i.length>0,giveWayTo:i[0]||null,primary:t[0]||null}},[v,h,b,f,w,T])}],77291)},61969,e=>{"use strict";var r=e.i(71645),t=e.i(85709),n=e.i(539);let i=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,t.useSignalKPaths)(a);return(0,r.useMemo)(()=>{let r=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,t=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(t)&&(s=(0,n.wrapPi)(t+o));let u=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,n.polarSpeedSi)(a,o):null),l=e["performance.polarSpeedRatio"]??null;null===l&&Number.isFinite(r)&&Number.isFinite(u)&&u>.2&&(l=r/u);let g=Number.isFinite(r)&&Number.isFinite(u)?(r-u)*1.943844:null,d=null,c=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,n.optimalUpwind)(1.943844*a):(0,n.optimalDownwind)(1.943844*a);e&&(d=e.twa/i,Number.isFinite(s)&&Number.isFinite(o)&&(c=(0,n.wrapPi)(s-Math.sign(o||1)*d)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],v=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,n.bestVmcHeading)({twd:s,tws:a,bearing:m}),r=Number.isFinite(t)?(0,n.vmcForHeading)({twd:s,tws:a,bearing:m,heading:t}):null;v=e?{bearing:m,best:e,current:r}:null}return{ratio:l,polarSpeed:u,boatSpeed:r,deltaKn:g,heading:t,twd:s,tws:a,twa:o,targetTwa:d,targetHeading:c,upwind:p,vmc:v}},[e])}])},83646,e=>{"use strict";var r=e.i(67561);e.s(["default",0,()=>(0,r.useOcearoContext)().tokens])},74452,(e,r,t)=>{r.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var r=e.i(74452);let t=180/Math.PI,n=r.default.vpp,i=(e,r,t)=>e+(r-e)*t,a=(e,r)=>{if(r<=e[0])return[0,0];let t=e.length-1;if(r>=e[t])return[t-1,1];let n=0;for(;r>e[n+1];)n++;return[n,(r-e[n])/(e[n+1]-e[n])]},o=n.speeds.map((e,r)=>(e=>{let r=n.beat_angle[e],i=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(r/t),o=n.run_vmg[e]/Math.abs(Math.cos(i/t)),s=[[0,0],[.7*r,.55*a],[r,a]];for(let t of n.angles)t>r&&t<i&&s.push([t,n[String(t)][e]]);return s.push([i,o]),i<180&&s.push([180,n.run_vmg[e]]),s})(r)),s=(e,r)=>{let[t,n]=a(e.map(e=>e[0]),r);return i(e[t][1],e[t+1][1],n)},u=(e,r)=>{if(!Number.isFinite(e)||!Number.isFinite(r)||e<=0)return null;let t=Math.min(180,Math.abs((r+540)%360-180)),u=n.speeds;if(e<u[0])return s(o[0],t)*(e/u[0]);let[l,g]=a(u,e);return i(s(o[l],t),s(o[l+1],t),g)},l=(e,r)=>{let[t,o]=a(n.speeds,r);return i(e[t],e[t+1],o)},g=(e,r)=>{let n=u(1.943844*e,r*t);return null===n?null:n/1.943844},d=e=>{let r=(e+Math.PI)%(2*Math.PI);return r<0&&(r+=2*Math.PI),r-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:r,bearing:n})=>{if(![e,r,n].every(Number.isFinite)||r<=0)return null;let i=null;for(let a=-100;a<=100;a++){let o=n+a/t,s=g(r,d(e-o));if(null===s)continue;let u=s*Math.cos(o-n);(!i||u>i.vmc)&&(i={heading:d(o),speed:s,vmc:u})}return i},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let r=l(n.run_angle,e),i=u(e,r);return{twa:r,speed:i,vmg:-i*Math.cos(r/t)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let r=l(n.beat_angle,e),i=u(e,r);return{twa:r,speed:i,vmg:i*Math.cos(r/t)}},"polarSpeed",0,u,"polarSpeedSi",0,g,"vmcForHeading",0,({twd:e,tws:r,bearing:t,heading:n})=>{if(![e,r,t,n].every(Number.isFinite))return null;let i=g(r,d(e-n));return null===i?null:i*Math.cos(n-t)},"wrapPi",0,d])}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,17617,e=>{"use strict";var a=e.i(43476),t=e.i(71645);e.i(85269);var n=e.i(22831),i=e.i(83402),s=e.i(67561),l=e.i(85709),r=e.i(46991);let d=e=>e*Math.PI/180,o=({label:e,description:t,checked:n,onChange:i})=>(0,a.jsx)("div",{className:"p-4 rounded-xl bg-hud-bg tesla-hover border border-hud",children:(0,a.jsxs)("label",{className:"flex items-center justify-between cursor-pointer",children:[(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsx)("span",{className:"text-label font-bold uppercase tracking-widest text-hud-secondary",children:e}),t&&(0,a.jsx)("p",{className:"text-caption text-hud-muted font-medium uppercase tracking-wider",children:t})]}),(0,a.jsx)("input",{type:"checkbox",className:"sr-only peer",checked:n,onChange:e=>i(e.target.checked)}),(0,a.jsx)("div",{className:"relative w-11 h-6 bg-hud-bg-elevated peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-hud-main after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-hud-main after:border-hud-main after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-oYellow"})]})}),c=({label:e,value:t,accent:n="text-hud-main"})=>(0,a.jsxs)("div",{className:"flex flex-col bg-hud-bg p-2 rounded-lg border border-hud",children:[(0,a.jsx)("span",{className:"text-caption font-semibold uppercase tracking-widest text-hud-muted leading-none mb-1",children:e}),(0,a.jsx)("span",{className:`text-caption font-mono font-bold ${n}`,children:t})]});e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),{updateSignalKData:x}=(0,s.useOcearoContext)(),[g,u]=(0,t.useState)(()=>i.default.get("debugWindOverride")||!1),[p,m]=(0,t.useState)(()=>i.default.get("debugWindSpeed")??10),[b,h]=(0,t.useState)(()=>i.default.get("debugWindDirection")??0),[v,f]=(0,t.useState)(()=>i.default.get("debugShowAxes")||!1),j=(0,t.useCallback)((e,a)=>{let t=e*r.KNOTS_TO_MPS,n=a*Math.PI/180;x({"environment.wind.speedTrue":t,"environment.wind.speedApparent":t,"environment.wind.angleTrueWater":n,"environment.wind.angleApparent":n,"environment.wind.directionTrue":n})},[x]);(0,t.useEffect)(()=>{if(!g)return;j(p,b);let e=setInterval(()=>{j(p,b)},1e3);return()=>clearInterval(e)},[g,p,b,j]);let w=(0,t.useMemo)(()=>["environment.wind.angleTrueWater","environment.wind.speedTrue","environment.wind.angleApparent","environment.wind.speedApparent","performance.beatAngle","performance.gybeAngle","performance.beatAngleVelocityMadeGood","performance.gybeAngleVelocityMadeGood","performance.targetAngle","performance.polarSpeed","performance.polarSpeedRatio","performance.velocityMadeGood","navigation.speedThroughWater","performance.polarVelocityMadeGood","performance.polarVelocityMadeGoodRatio","navigation.headingTrue","navigation.courseOverGroundTrue","navigation.courseGreatCircle.nextPoint.bearingTrue","performance.laylineAngle","navigation.racing.layline","navigation.racing.layline.distance","navigation.racing.layline.time","navigation.racing.oppositeLayline","navigation.racing.oppositeLayline.distance","navigation.racing.oppositeLayline.time","navigation.racing.startLineStb","navigation.racing.startLinePort","navigation.racing.distanceStartline","navigation.racing.timeToStart","navigation.racing.timePortDown","navigation.racing.timePortUp","navigation.racing.timeStbdDown","navigation.racing.timeStbdUp"],[]),y=(0,l.useSignalKPaths)(w),N=(e,a)=>y[e]??a,S=N("environment.wind.angleTrueWater",d(25)),T=N("environment.wind.speedTrue",20),k=N("environment.wind.angleApparent",d(23)),A=N("environment.wind.speedApparent",25),M=N("performance.beatAngle",d(45)),P=N("performance.gybeAngle",d(135)),$=N("performance.beatAngleVelocityMadeGood",6),W=N("performance.gybeAngleVelocityMadeGood",5),F=N("performance.targetAngle",M),G=N("performance.polarSpeed",8),D=N("performance.polarSpeedRatio",.95),O=N("performance.velocityMadeGood",5),I=N("navigation.speedThroughWater",7),V=N("performance.polarVelocityMadeGood",6),C=N("performance.polarVelocityMadeGoodRatio",.9),Y=N("navigation.headingTrue",d(0)),R=N("navigation.courseOverGroundTrue",d(20)),L=N("navigation.courseGreatCircle.nextPoint.bearingTrue",d(30)),U=N("performance.laylineAngle",d(10)),B=N("navigation.racing.layline.distance",100),K=N("navigation.racing.layline.time",180),_=N("navigation.racing.oppositeLayline.distance",80),E=N("navigation.racing.oppositeLayline.time",180),H=N("navigation.racing.distanceStartline",50),q=N("navigation.racing.timeToStart",120),z=N("navigation.racing.timePortDown",60),J=N("navigation.racing.timePortUp",70),Q=N("navigation.racing.timeStbdDown",65),X=N("navigation.racing.timeStbdUp",75);return(0,a.jsxs)("div",{className:"p-8 text-hud-main w-full overflow-y-auto h-full",children:[(0,a.jsxs)("header",{className:"mb-8",children:[(0,a.jsx)("h1",{className:"text-value font-semibold uppercase tracking-tight mb-1",children:e("menu.debug")}),(0,a.jsx)("p",{className:"text-hud-secondary text-label font-medium uppercase tracking-widest",children:e("debug.systemDebug")})]}),(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:"3D"}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsx)(o,{label:e("settings.debugShowAxes"),description:e("settings.debugShowAxesDesc"),checked:v,onChange:e=>{f(e),i.default.set("debugShowAxes",e)}})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("settings.debugWindOverride")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsx)(o,{label:e("settings.debugWindOverride"),description:e("settings.debugWindOverrideDesc"),checked:g,onChange:e=>{u(e),i.default.set("debugWindOverride",e)}}),g&&(0,a.jsxs)("div",{className:"space-y-4 p-4 rounded-xl bg-oYellow/5 border border-oYellow/20",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)("span",{className:"text-caption font-semibold uppercase tracking-widest text-hud-secondary",children:e("settings.debugWindSpeed")}),(0,a.jsxs)("span",{className:"text-value font-semibold text-oYellow bg-oYellow/10 px-3 py-1 rounded-lg",children:[p," kn"]})]}),(0,a.jsx)("input",{type:"range",className:"w-full h-1.5 bg-hud-bg-elevated rounded-lg appearance-none cursor-pointer accent-oYellow",min:"0",max:"60",step:"0.5",value:p,onChange:e=>{var a;m(a=parseFloat(e.target.value)),i.default.set("debugWindSpeed",a)}})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)("span",{className:"text-caption font-semibold uppercase tracking-widest text-hud-secondary",children:e("settings.debugWindDirection")}),(0,a.jsxs)("span",{className:"text-value font-semibold text-oYellow bg-oYellow/10 px-3 py-1 rounded-lg",children:[b,"°"]})]}),(0,a.jsx)("input",{type:"range",className:"w-full h-1.5 bg-hud-bg-elevated rounded-lg appearance-none cursor-pointer accent-oYellow",min:"0",max:"359",step:"1",value:b,onChange:e=>{var a;h(a=parseInt(e.target.value,10)),i.default.set("debugWindDirection",a)}})]})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.windDynamics")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"TWA",value:`${(180/Math.PI*S).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"TWS",value:`${T.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"AWA",value:`${(180/Math.PI*k).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"AWS",value:`${A.toFixed(1)} kn`})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.performanceMetrics")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Beat ∠",value:`${(180/Math.PI*M).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"Gybe ∠",value:`${(180/Math.PI*P).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"VMG Beat",value:`${$.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"VMG Gybe",value:`${W.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Target TWA",value:`${(180/Math.PI*F).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"Opt ∠",value:`${(180/Math.PI*(F-S)).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"Polar Spd",value:`${G.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Pol Ratio",value:D.toFixed(2)}),(0,a.jsx)(c,{label:"VMG",value:`${O.toFixed(1)} kn`,accent:"text-oBlue"}),(0,a.jsx)(c,{label:"STW",value:`${I.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Pol VMG",value:`${V.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Pol VMG %",value:`${(100*C).toFixed(1)}%`})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.navigation")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Heading",value:`${(180/Math.PI*Y).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"COG",value:`${(180/Math.PI*R).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"WPT Brg",value:`${(180/Math.PI*L).toFixed(1)}\xb0`,accent:"text-oYellow"}),(0,a.jsx)(c,{label:"Layline ∠",value:`${(180/Math.PI*U).toFixed(1)}\xb0`,accent:"text-oGreen"})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.laylineAnalysis")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Dist",value:`${B.toFixed(0)}m`}),(0,a.jsx)(c,{label:"Time",value:`${K}s`}),(0,a.jsx)(c,{label:"Opp Dist",value:`${_.toFixed(0)}m`}),(0,a.jsx)(c,{label:"Opp Time",value:`${E}s`})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.regattaStart")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Start Dist",value:`${H.toFixed(1)}m`,accent:"text-oRed"}),(0,a.jsx)(c,{label:"TT Start",value:`${q}s`,accent:"text-oRed"}),(0,a.jsx)(c,{label:"Port DW",value:`${z}s`}),(0,a.jsx)(c,{label:"Port UW",value:`${J}s`}),(0,a.jsx)(c,{label:"Stbd DW",value:`${Q}s`}),(0,a.jsx)(c,{label:"Stbd UW",value:`${X}s`})]})]})]})]})}])},58652,function(e){e.n(e.i(17617))}]);
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,78461,e=>{"use strict";var t=e.i(71645),i=e.i(85709),n=e.i(67561);let r=["navigation.headingTrue","navigation.headingMagnetic","navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic","navigation.position"],a=null;e.s(["default",0,()=>{let{convertLatLonToXY:e}=(0,n.useOcearoContext)(),s=(0,i.useSignalKPaths)(r),o=s["navigation.headingTrue"]??s["navigation.headingMagnetic"]??s["navigation.courseOverGroundTrue"]??s["navigation.courseOverGroundMagnetic"],l=Number.isFinite(o),d=s["navigation.position"],u=Number.isFinite(d?.latitude)&&Number.isFinite(d?.longitude);return{heading:l?o:0,offset:(0,t.useMemo)(()=>{if(!u)return{x:0,y:0};let t={lat:d.latitude,lon:d.longitude};return e(t,(a||(a=t),a))},[d,u,e]),hasFix:u,hasHeading:l}}])},23549,e=>{"use strict";var t=e.i(43476),i=e.i(71645);e.i(85269);var n=e.i(22831),r=e.i(78461),a=e.i(37369),s=e.i(539),o=e.i(76247);let l=180/Math.PI;e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),d=(0,a.useBerth)(),u=(()=>{let{heading:e,offset:t}=(0,r.default)(),n=(0,a.useBerth)();return(0,i.useMemo)(()=>{if(!n.pose)return null;let{x:i,y:r,heading:a}=n.pose,l="stern"===n.type,d=l?1:-1,u={x:i+d*Math.sin(a)*o.BOAT.length*.5,y:r+d*Math.cos(a)*o.BOAT.length*.5},c=u.x-t.x,f=u.y-t.y,p=Math.hypot(c,f),h=(0,s.wrapPi)(Math.atan2(c,f)-e),m=-(c*Math.cos(a)-f*Math.sin(a));return{distance:p,bearing:h,headingError:(0,s.wrapPi)(a-e),lateral:m,astern:l}},[n,e,t])})(),{heading:c,offset:f}=(0,r.default)(),p=e=>`px-3 py-1.5 rounded-full text-caption font-semibold uppercase tracking-wider border transition-colors ${e?"bg-oBlue text-white border-oBlue":"border-hud text-hud-secondary hover:text-hud-main"}`,h=null;if(u){let t=Math.round(u.headingError*l),i=u.lateral,n=t=>e(t>=0?"parking.starboard":"parking.port");h=Math.abs(u.bearing)>.6*Math.PI?e("parking.behind"):Math.abs(i)>.4?e("parking.moveAcross",{metres:Math.abs(i).toFixed(1),side:n(-i)}):Math.abs(t)>4?e("parking.turn",{deg:Math.abs(t),side:n(t)}):e(u.astern?"parking.alignedAstern":"parking.aligned")}return(0,t.jsxs)("div",{className:"hud-halo flex flex-col items-center gap-2 select-none",children:[u&&(0,t.jsxs)("div",{className:"text-center leading-tight",children:[(0,t.jsx)("div",{className:"text-value font-semibold text-hud-main",children:h}),(0,t.jsxs)("div",{className:"text-caption text-hud-secondary",children:[e("parking.entry",{metres:u.distance.toFixed(0)}),u.astern?` \xb7 ${e("parking.astern")}`:"","virtual"===d.source?` \xb7 ${e("parking.virtual")}`:""]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap justify-center gap-2",children:[a.BERTH_TYPES.map(i=>(0,t.jsx)("button",{type:"button",className:p(d.type===i),onClick:()=>"virtual"===d.source?(0,a.placeVirtualBerth)(f,c,i):(0,a.setBerth)({type:i}),children:e(`parking.type_${i}`)},i)),"side"===d.type&&(0,t.jsx)("button",{type:"button",className:p(!1),onClick:()=>(0,a.setBerth)({side:"port"===d.side?"starboard":"port"}),children:e("port"===d.side?"parking.portSide":"parking.starboardSide")}),(0,t.jsx)("button",{type:"button",className:p(!1),onClick:()=>(0,a.placeVirtualBerth)(f,c),children:e("parking.placeAhead")})]})]})}],23549)},36540,function(e){e.n(e.i(23549))},76247,37369,e=>{"use strict";var t=e.i(43476),i=e.i(71645),n=e.i(43216),r=e.i(83646),a=e.i(78461);let s={type:"bow",side:"starboard",pose:null,source:"virtual"},o=new Set,l=()=>s,d=e=>{s={...s,...e},o.forEach(e=>e())},u=e=>(o.add(e),()=>o.delete(e)),c=()=>(0,i.useSyncExternalStore)(u,l,l),f=(e,t,i=s.type,n=22)=>{d({type:i,pose:{x:e.x+Math.sin(t)*n,y:e.y+Math.cos(t)*n,heading:"stern"===i?t+Math.PI:t},source:"virtual"})};e.s(["BERTH_TYPES",0,["bow","stern","side","buoy"],"getBerth",0,l,"placeVirtualBerth",0,f,"setBerth",0,d,"useBerth",0,c],37369);let p={length:10.8,beam:3.9},h=p.length/2,m=p.beam/2,v=({size:e,position:i,color:n,opacity:r=1})=>(0,t.jsxs)("mesh",{position:i,children:[(0,t.jsx)("boxGeometry",{args:e}),(0,t.jsx)("meshLambertMaterial",{color:n,transparent:r<1,opacity:r})]}),g=({position:e,rotation:i=0,color:n,length:r=4})=>(0,t.jsxs)("group",{position:e,rotation:[0,i,0],children:[(0,t.jsxs)("mesh",{rotation:[-Math.PI/2,0,0],position:[0,.07,r/2-.6],children:[(0,t.jsx)("planeGeometry",{args:[.7,r-1.2]}),(0,t.jsx)("meshBasicMaterial",{color:n,transparent:!0,opacity:.85,depthWrite:!1})]}),(0,t.jsxs)("mesh",{rotation:[-Math.PI/2,0,0],position:[0,.07,-.6],children:[(0,t.jsx)("circleGeometry",{args:[1.2,3,Math.PI/2]}),(0,t.jsx)("meshBasicMaterial",{color:n,transparent:!0,opacity:.85,depthWrite:!1})]})]}),y=({type:e,side:r,colors:a})=>{let s,o=(0,i.useMemo)(()=>(()=>{let e=-h+3.5,t=[[-m,h],[m,h],[m,e]];for(let i=1;i<=8;i++){let n=i/8;t.push([m*(1-n)**1.6,e-(e+h)*Math.sin(n*Math.PI/2)])}for(let i=7;i>=0;i--){let n=i/8;t.push([-m*(1-n)**1.6,e-(e+h)*Math.sin(n*Math.PI/2)])}return t.push([-m,h]),t.map(([e,t])=>[e,.06,t])})(),[]),l="port"===r?-1:1;return(0,t.jsxs)("group",{children:[(0,t.jsx)(n.Line,{points:o,color:a.target,lineWidth:2.5,dashed:!0,dashSize:.8,gapSize:.5}),(0,t.jsxs)("mesh",{rotation:[-Math.PI/2,0,0],position:[0,.04,.3],children:[(0,t.jsx)("planeGeometry",{args:[.9*p.beam,p.length-1.6]}),(0,t.jsx)("meshBasicMaterial",{color:a.target,transparent:!0,opacity:.12,depthWrite:!1})]}),("bow"===e||"stern"===e)&&(s="bow"===e?-1:1,(0,t.jsxs)("group",{children:[(0,t.jsx)(v,{size:[32,.35,2.2],position:[0,.17,s*(h+.45+1.1)],color:a.pontoon}),(0,t.jsx)(v,{size:[.8,.3,9],position:[m+.45+.4,.15,s*(h-4.5+.45)],color:a.pontoon}),(0,t.jsx)(v,{size:[.95*p.beam,1,.95*p.length],position:[-(p.beam+.9),.5,0],color:a.neighbour,opacity:.45}),(0,t.jsx)(g,{position:[0,0,-s*(h+7)],rotation:"bow"===e?0:Math.PI,color:a.target})]})),"side"===e&&(0,t.jsxs)("group",{children:[(0,t.jsx)(v,{size:[2.4,.35,26],position:[l*(m+.45+1.2),.17,0],color:a.pontoon}),(0,t.jsx)(g,{position:[-(2.5*l),0,h+6],rotation:.25*l,color:a.target})]}),"buoy"===e&&(0,t.jsxs)("group",{children:[(0,t.jsxs)("mesh",{position:[0,.5,-(h+2.5)],children:[(0,t.jsx)("sphereGeometry",{args:[.6,20,14]}),(0,t.jsx)("meshLambertMaterial",{color:a.buoy})]}),(0,t.jsx)(n.Line,{points:[[0,.3,-(h+2.5)],[0,.3,-h]],color:a.pontoon,lineWidth:2}),(0,t.jsx)(g,{position:[0,0,h+6],color:a.target})]})]})};e.s(["BOAT",0,p,"default",0,({scale:e=.5})=>{let{scene:n,accent:s}=(0,r.default)(),{heading:o,offset:d,hasFix:u,hasHeading:p}=(0,a.default)(),h=c();(0,i.useEffect)(()=>{u&&p&&!l().pose&&f(d,o)},[d,o,u,p]);let m=(0,i.useMemo)(()=>({target:s,pontoon:n.rigging,neighbour:n.vessel,buoy:n.target}),[n,s]);if(!h.pose)return null;let{x:v,y:g,heading:x}=h.pose;return(0,t.jsx)("group",{rotation:[0,o,0],children:(0,t.jsx)("group",{position:[(v-d.x)*e,0,-(g-d.y)*e],rotation:[0,-x,0],scale:[e,e,e],children:(0,t.jsx)(y,{type:h.type,side:h.side,colors:m})})})}],76247)},83646,e=>{"use strict";var t=e.i(67561);e.s(["default",0,()=>(0,t.useOcearoContext)().tokens])},31067,e=>{"use strict";function t(){return(t=Object.assign.bind()).apply(null,arguments)}e.s(["default",()=>t])},43216,e=>{"use strict";let t,i;var n=e.i(31067),r=e.i(71645),a=e.i(90072),s=e.i(90874),o=a,l=e.i(32533),d=a,u=e.i(8560),c=e.i(31497);class f extends d.ShaderMaterial{constructor(e){super({type:"LineMaterial",uniforms:d.UniformsUtils.clone(d.UniformsUtils.merge([u.UniformsLib.common,u.UniformsLib.fog,{worldUnits:{value:1},linewidth:{value:1},resolution:{value:new d.Vector2(1,1)},dashOffset:{value:0},dashScale:{value:1},dashSize:{value:1},gapSize:{value:1}}])),vertexShader:`
|
|
2
|
+
#include <common>
|
|
3
|
+
#include <fog_pars_vertex>
|
|
4
|
+
#include <logdepthbuf_pars_vertex>
|
|
5
|
+
#include <clipping_planes_pars_vertex>
|
|
6
|
+
|
|
7
|
+
uniform float linewidth;
|
|
8
|
+
uniform vec2 resolution;
|
|
9
|
+
|
|
10
|
+
attribute vec3 instanceStart;
|
|
11
|
+
attribute vec3 instanceEnd;
|
|
12
|
+
|
|
13
|
+
#ifdef USE_COLOR
|
|
14
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
|
15
|
+
varying vec4 vLineColor;
|
|
16
|
+
attribute vec4 instanceColorStart;
|
|
17
|
+
attribute vec4 instanceColorEnd;
|
|
18
|
+
#else
|
|
19
|
+
varying vec3 vLineColor;
|
|
20
|
+
attribute vec3 instanceColorStart;
|
|
21
|
+
attribute vec3 instanceColorEnd;
|
|
22
|
+
#endif
|
|
23
|
+
#endif
|
|
24
|
+
|
|
25
|
+
#ifdef WORLD_UNITS
|
|
26
|
+
|
|
27
|
+
varying vec4 worldPos;
|
|
28
|
+
varying vec3 worldStart;
|
|
29
|
+
varying vec3 worldEnd;
|
|
30
|
+
|
|
31
|
+
#ifdef USE_DASH
|
|
32
|
+
|
|
33
|
+
varying vec2 vUv;
|
|
34
|
+
|
|
35
|
+
#endif
|
|
36
|
+
|
|
37
|
+
#else
|
|
38
|
+
|
|
39
|
+
varying vec2 vUv;
|
|
40
|
+
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
#ifdef USE_DASH
|
|
44
|
+
|
|
45
|
+
uniform float dashScale;
|
|
46
|
+
attribute float instanceDistanceStart;
|
|
47
|
+
attribute float instanceDistanceEnd;
|
|
48
|
+
varying float vLineDistance;
|
|
49
|
+
|
|
50
|
+
#endif
|
|
51
|
+
|
|
52
|
+
void trimSegment( const in vec4 start, inout vec4 end ) {
|
|
53
|
+
|
|
54
|
+
// trim end segment so it terminates between the camera plane and the near plane
|
|
55
|
+
|
|
56
|
+
// conservative estimate of the near plane
|
|
57
|
+
float a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column
|
|
58
|
+
float b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column
|
|
59
|
+
float nearEstimate = - 0.5 * b / a;
|
|
60
|
+
|
|
61
|
+
float alpha = ( nearEstimate - start.z ) / ( end.z - start.z );
|
|
62
|
+
|
|
63
|
+
end.xyz = mix( start.xyz, end.xyz, alpha );
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
void main() {
|
|
68
|
+
|
|
69
|
+
#ifdef USE_COLOR
|
|
70
|
+
|
|
71
|
+
vLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;
|
|
72
|
+
|
|
73
|
+
#endif
|
|
74
|
+
|
|
75
|
+
#ifdef USE_DASH
|
|
76
|
+
|
|
77
|
+
vLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;
|
|
78
|
+
vUv = uv;
|
|
79
|
+
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
float aspect = resolution.x / resolution.y;
|
|
83
|
+
|
|
84
|
+
// camera space
|
|
85
|
+
vec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );
|
|
86
|
+
vec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );
|
|
87
|
+
|
|
88
|
+
#ifdef WORLD_UNITS
|
|
89
|
+
|
|
90
|
+
worldStart = start.xyz;
|
|
91
|
+
worldEnd = end.xyz;
|
|
92
|
+
|
|
93
|
+
#else
|
|
94
|
+
|
|
95
|
+
vUv = uv;
|
|
96
|
+
|
|
97
|
+
#endif
|
|
98
|
+
|
|
99
|
+
// special case for perspective projection, and segments that terminate either in, or behind, the camera plane
|
|
100
|
+
// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space
|
|
101
|
+
// but we need to perform ndc-space calculations in the shader, so we must address this issue directly
|
|
102
|
+
// perhaps there is a more elegant solution -- WestLangley
|
|
103
|
+
|
|
104
|
+
bool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column
|
|
105
|
+
|
|
106
|
+
if ( perspective ) {
|
|
107
|
+
|
|
108
|
+
if ( start.z < 0.0 && end.z >= 0.0 ) {
|
|
109
|
+
|
|
110
|
+
trimSegment( start, end );
|
|
111
|
+
|
|
112
|
+
} else if ( end.z < 0.0 && start.z >= 0.0 ) {
|
|
113
|
+
|
|
114
|
+
trimSegment( end, start );
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// clip space
|
|
121
|
+
vec4 clipStart = projectionMatrix * start;
|
|
122
|
+
vec4 clipEnd = projectionMatrix * end;
|
|
123
|
+
|
|
124
|
+
// ndc space
|
|
125
|
+
vec3 ndcStart = clipStart.xyz / clipStart.w;
|
|
126
|
+
vec3 ndcEnd = clipEnd.xyz / clipEnd.w;
|
|
127
|
+
|
|
128
|
+
// direction
|
|
129
|
+
vec2 dir = ndcEnd.xy - ndcStart.xy;
|
|
130
|
+
|
|
131
|
+
// account for clip-space aspect ratio
|
|
132
|
+
dir.x *= aspect;
|
|
133
|
+
dir = normalize( dir );
|
|
134
|
+
|
|
135
|
+
#ifdef WORLD_UNITS
|
|
136
|
+
|
|
137
|
+
// get the offset direction as perpendicular to the view vector
|
|
138
|
+
vec3 worldDir = normalize( end.xyz - start.xyz );
|
|
139
|
+
vec3 offset;
|
|
140
|
+
if ( position.y < 0.5 ) {
|
|
141
|
+
|
|
142
|
+
offset = normalize( cross( start.xyz, worldDir ) );
|
|
143
|
+
|
|
144
|
+
} else {
|
|
145
|
+
|
|
146
|
+
offset = normalize( cross( end.xyz, worldDir ) );
|
|
147
|
+
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// sign flip
|
|
151
|
+
if ( position.x < 0.0 ) offset *= - 1.0;
|
|
152
|
+
|
|
153
|
+
float forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );
|
|
154
|
+
|
|
155
|
+
// don't extend the line if we're rendering dashes because we
|
|
156
|
+
// won't be rendering the endcaps
|
|
157
|
+
#ifndef USE_DASH
|
|
158
|
+
|
|
159
|
+
// extend the line bounds to encompass endcaps
|
|
160
|
+
start.xyz += - worldDir * linewidth * 0.5;
|
|
161
|
+
end.xyz += worldDir * linewidth * 0.5;
|
|
162
|
+
|
|
163
|
+
// shift the position of the quad so it hugs the forward edge of the line
|
|
164
|
+
offset.xy -= dir * forwardOffset;
|
|
165
|
+
offset.z += 0.5;
|
|
166
|
+
|
|
167
|
+
#endif
|
|
168
|
+
|
|
169
|
+
// endcaps
|
|
170
|
+
if ( position.y > 1.0 || position.y < 0.0 ) {
|
|
171
|
+
|
|
172
|
+
offset.xy += dir * 2.0 * forwardOffset;
|
|
173
|
+
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// adjust for linewidth
|
|
177
|
+
offset *= linewidth * 0.5;
|
|
178
|
+
|
|
179
|
+
// set the world position
|
|
180
|
+
worldPos = ( position.y < 0.5 ) ? start : end;
|
|
181
|
+
worldPos.xyz += offset;
|
|
182
|
+
|
|
183
|
+
// project the worldpos
|
|
184
|
+
vec4 clip = projectionMatrix * worldPos;
|
|
185
|
+
|
|
186
|
+
// shift the depth of the projected points so the line
|
|
187
|
+
// segments overlap neatly
|
|
188
|
+
vec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;
|
|
189
|
+
clip.z = clipPose.z * clip.w;
|
|
190
|
+
|
|
191
|
+
#else
|
|
192
|
+
|
|
193
|
+
vec2 offset = vec2( dir.y, - dir.x );
|
|
194
|
+
// undo aspect ratio adjustment
|
|
195
|
+
dir.x /= aspect;
|
|
196
|
+
offset.x /= aspect;
|
|
197
|
+
|
|
198
|
+
// sign flip
|
|
199
|
+
if ( position.x < 0.0 ) offset *= - 1.0;
|
|
200
|
+
|
|
201
|
+
// endcaps
|
|
202
|
+
if ( position.y < 0.0 ) {
|
|
203
|
+
|
|
204
|
+
offset += - dir;
|
|
205
|
+
|
|
206
|
+
} else if ( position.y > 1.0 ) {
|
|
207
|
+
|
|
208
|
+
offset += dir;
|
|
209
|
+
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// adjust for linewidth
|
|
213
|
+
offset *= linewidth;
|
|
214
|
+
|
|
215
|
+
// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...
|
|
216
|
+
offset /= resolution.y;
|
|
217
|
+
|
|
218
|
+
// select end
|
|
219
|
+
vec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;
|
|
220
|
+
|
|
221
|
+
// back to clip space
|
|
222
|
+
offset *= clip.w;
|
|
223
|
+
|
|
224
|
+
clip.xy += offset;
|
|
225
|
+
|
|
226
|
+
#endif
|
|
227
|
+
|
|
228
|
+
gl_Position = clip;
|
|
229
|
+
|
|
230
|
+
vec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation
|
|
231
|
+
|
|
232
|
+
#include <logdepthbuf_vertex>
|
|
233
|
+
#include <clipping_planes_vertex>
|
|
234
|
+
#include <fog_vertex>
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
`,fragmentShader:`
|
|
238
|
+
uniform vec3 diffuse;
|
|
239
|
+
uniform float opacity;
|
|
240
|
+
uniform float linewidth;
|
|
241
|
+
|
|
242
|
+
#ifdef USE_DASH
|
|
243
|
+
|
|
244
|
+
uniform float dashOffset;
|
|
245
|
+
uniform float dashSize;
|
|
246
|
+
uniform float gapSize;
|
|
247
|
+
|
|
248
|
+
#endif
|
|
249
|
+
|
|
250
|
+
varying float vLineDistance;
|
|
251
|
+
|
|
252
|
+
#ifdef WORLD_UNITS
|
|
253
|
+
|
|
254
|
+
varying vec4 worldPos;
|
|
255
|
+
varying vec3 worldStart;
|
|
256
|
+
varying vec3 worldEnd;
|
|
257
|
+
|
|
258
|
+
#ifdef USE_DASH
|
|
259
|
+
|
|
260
|
+
varying vec2 vUv;
|
|
261
|
+
|
|
262
|
+
#endif
|
|
263
|
+
|
|
264
|
+
#else
|
|
265
|
+
|
|
266
|
+
varying vec2 vUv;
|
|
267
|
+
|
|
268
|
+
#endif
|
|
269
|
+
|
|
270
|
+
#include <common>
|
|
271
|
+
#include <fog_pars_fragment>
|
|
272
|
+
#include <logdepthbuf_pars_fragment>
|
|
273
|
+
#include <clipping_planes_pars_fragment>
|
|
274
|
+
|
|
275
|
+
#ifdef USE_COLOR
|
|
276
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
|
277
|
+
varying vec4 vLineColor;
|
|
278
|
+
#else
|
|
279
|
+
varying vec3 vLineColor;
|
|
280
|
+
#endif
|
|
281
|
+
#endif
|
|
282
|
+
|
|
283
|
+
vec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {
|
|
284
|
+
|
|
285
|
+
float mua;
|
|
286
|
+
float mub;
|
|
287
|
+
|
|
288
|
+
vec3 p13 = p1 - p3;
|
|
289
|
+
vec3 p43 = p4 - p3;
|
|
290
|
+
|
|
291
|
+
vec3 p21 = p2 - p1;
|
|
292
|
+
|
|
293
|
+
float d1343 = dot( p13, p43 );
|
|
294
|
+
float d4321 = dot( p43, p21 );
|
|
295
|
+
float d1321 = dot( p13, p21 );
|
|
296
|
+
float d4343 = dot( p43, p43 );
|
|
297
|
+
float d2121 = dot( p21, p21 );
|
|
298
|
+
|
|
299
|
+
float denom = d2121 * d4343 - d4321 * d4321;
|
|
300
|
+
|
|
301
|
+
float numer = d1343 * d4321 - d1321 * d4343;
|
|
302
|
+
|
|
303
|
+
mua = numer / denom;
|
|
304
|
+
mua = clamp( mua, 0.0, 1.0 );
|
|
305
|
+
mub = ( d1343 + d4321 * ( mua ) ) / d4343;
|
|
306
|
+
mub = clamp( mub, 0.0, 1.0 );
|
|
307
|
+
|
|
308
|
+
return vec2( mua, mub );
|
|
309
|
+
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
void main() {
|
|
313
|
+
|
|
314
|
+
#include <clipping_planes_fragment>
|
|
315
|
+
|
|
316
|
+
#ifdef USE_DASH
|
|
317
|
+
|
|
318
|
+
if ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps
|
|
319
|
+
|
|
320
|
+
if ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX
|
|
321
|
+
|
|
322
|
+
#endif
|
|
323
|
+
|
|
324
|
+
float alpha = opacity;
|
|
325
|
+
|
|
326
|
+
#ifdef WORLD_UNITS
|
|
327
|
+
|
|
328
|
+
// Find the closest points on the view ray and the line segment
|
|
329
|
+
vec3 rayEnd = normalize( worldPos.xyz ) * 1e5;
|
|
330
|
+
vec3 lineDir = worldEnd - worldStart;
|
|
331
|
+
vec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );
|
|
332
|
+
|
|
333
|
+
vec3 p1 = worldStart + lineDir * params.x;
|
|
334
|
+
vec3 p2 = rayEnd * params.y;
|
|
335
|
+
vec3 delta = p1 - p2;
|
|
336
|
+
float len = length( delta );
|
|
337
|
+
float norm = len / linewidth;
|
|
338
|
+
|
|
339
|
+
#ifndef USE_DASH
|
|
340
|
+
|
|
341
|
+
#ifdef USE_ALPHA_TO_COVERAGE
|
|
342
|
+
|
|
343
|
+
float dnorm = fwidth( norm );
|
|
344
|
+
alpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );
|
|
345
|
+
|
|
346
|
+
#else
|
|
347
|
+
|
|
348
|
+
if ( norm > 0.5 ) {
|
|
349
|
+
|
|
350
|
+
discard;
|
|
351
|
+
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
#endif
|
|
355
|
+
|
|
356
|
+
#endif
|
|
357
|
+
|
|
358
|
+
#else
|
|
359
|
+
|
|
360
|
+
#ifdef USE_ALPHA_TO_COVERAGE
|
|
361
|
+
|
|
362
|
+
// artifacts appear on some hardware if a derivative is taken within a conditional
|
|
363
|
+
float a = vUv.x;
|
|
364
|
+
float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;
|
|
365
|
+
float len2 = a * a + b * b;
|
|
366
|
+
float dlen = fwidth( len2 );
|
|
367
|
+
|
|
368
|
+
if ( abs( vUv.y ) > 1.0 ) {
|
|
369
|
+
|
|
370
|
+
alpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );
|
|
371
|
+
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
#else
|
|
375
|
+
|
|
376
|
+
if ( abs( vUv.y ) > 1.0 ) {
|
|
377
|
+
|
|
378
|
+
float a = vUv.x;
|
|
379
|
+
float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;
|
|
380
|
+
float len2 = a * a + b * b;
|
|
381
|
+
|
|
382
|
+
if ( len2 > 1.0 ) discard;
|
|
383
|
+
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
#endif
|
|
387
|
+
|
|
388
|
+
#endif
|
|
389
|
+
|
|
390
|
+
vec4 diffuseColor = vec4( diffuse, alpha );
|
|
391
|
+
#ifdef USE_COLOR
|
|
392
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
|
393
|
+
diffuseColor *= vLineColor;
|
|
394
|
+
#else
|
|
395
|
+
diffuseColor.rgb *= vLineColor;
|
|
396
|
+
#endif
|
|
397
|
+
#endif
|
|
398
|
+
|
|
399
|
+
#include <logdepthbuf_fragment>
|
|
400
|
+
|
|
401
|
+
gl_FragColor = diffuseColor;
|
|
402
|
+
|
|
403
|
+
#include <tonemapping_fragment>
|
|
404
|
+
#include <${c.version>=154?"colorspace_fragment":"encodings_fragment"}>
|
|
405
|
+
#include <fog_fragment>
|
|
406
|
+
#include <premultiplied_alpha_fragment>
|
|
407
|
+
|
|
408
|
+
}
|
|
409
|
+
`,clipping:!0}),this.isLineMaterial=!0,this.onBeforeCompile=function(){this.transparent?this.defines.USE_LINE_COLOR_ALPHA="1":delete this.defines.USE_LINE_COLOR_ALPHA},Object.defineProperties(this,{color:{enumerable:!0,get:function(){return this.uniforms.diffuse.value},set:function(e){this.uniforms.diffuse.value=e}},worldUnits:{enumerable:!0,get:function(){return"WORLD_UNITS"in this.defines},set:function(e){!0===e?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}},linewidth:{enumerable:!0,get:function(){return this.uniforms.linewidth.value},set:function(e){this.uniforms.linewidth.value=e}},dashed:{enumerable:!0,get:function(){return"USE_DASH"in this.defines},set(e){!!e!="USE_DASH"in this.defines&&(this.needsUpdate=!0),!0===e?this.defines.USE_DASH="":delete this.defines.USE_DASH}},dashScale:{enumerable:!0,get:function(){return this.uniforms.dashScale.value},set:function(e){this.uniforms.dashScale.value=e}},dashSize:{enumerable:!0,get:function(){return this.uniforms.dashSize.value},set:function(e){this.uniforms.dashSize.value=e}},dashOffset:{enumerable:!0,get:function(){return this.uniforms.dashOffset.value},set:function(e){this.uniforms.dashOffset.value=e}},gapSize:{enumerable:!0,get:function(){return this.uniforms.gapSize.value},set:function(e){this.uniforms.gapSize.value=e}},opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(e){this.uniforms.opacity.value=e}},resolution:{enumerable:!0,get:function(){return this.uniforms.resolution.value},set:function(e){this.uniforms.resolution.value.copy(e)}},alphaToCoverage:{enumerable:!0,get:function(){return"USE_ALPHA_TO_COVERAGE"in this.defines},set:function(e){!!e!="USE_ALPHA_TO_COVERAGE"in this.defines&&(this.needsUpdate=!0),!0===e?(this.defines.USE_ALPHA_TO_COVERAGE="",this.extensions.derivatives=!0):(delete this.defines.USE_ALPHA_TO_COVERAGE,this.extensions.derivatives=!1)}}}),this.setValues(e)}}let p=c.version>=125?"uv1":"uv2",h=new o.Vector4,m=new o.Vector3,v=new o.Vector3,g=new o.Vector4,y=new o.Vector4,x=new o.Vector4,b=new o.Vector3,S=new o.Matrix4,w=new o.Line3,M=new o.Vector3,_=new o.Box3,E=new o.Sphere,A=new o.Vector4;function L(e,t,n){return A.set(0,0,-t,1).applyMatrix4(e.projectionMatrix),A.multiplyScalar(1/A.w),A.x=i/n.width,A.y=i/n.height,A.applyMatrix4(e.projectionMatrixInverse),A.multiplyScalar(1/A.w),Math.abs(Math.max(A.x,A.y))}class B extends o.Mesh{constructor(e=new l.LineSegmentsGeometry,t=new f({color:0xffffff*Math.random()})){super(e,t),this.isLineSegments2=!0,this.type="LineSegments2"}computeLineDistances(){let e=this.geometry,t=e.attributes.instanceStart,i=e.attributes.instanceEnd,n=new Float32Array(2*t.count);for(let e=0,r=0,a=t.count;e<a;e++,r+=2)m.fromBufferAttribute(t,e),v.fromBufferAttribute(i,e),n[r]=0===r?0:n[r-1],n[r+1]=n[r]+m.distanceTo(v);let r=new o.InstancedInterleavedBuffer(n,2,1);return e.setAttribute("instanceDistanceStart",new o.InterleavedBufferAttribute(r,1,0)),e.setAttribute("instanceDistanceEnd",new o.InterleavedBufferAttribute(r,1,1)),this}raycast(e,n){let r,a,s=this.material.worldUnits,l=e.camera;null!==l||s||console.error('LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.');let d=void 0!==e.params.Line2&&e.params.Line2.threshold||0;t=e.ray;let u=this.matrixWorld,c=this.geometry,f=this.material;if(i=f.linewidth+d,null===c.boundingSphere&&c.computeBoundingSphere(),E.copy(c.boundingSphere).applyMatrix4(u),s)r=.5*i;else{let e=Math.max(l.near,E.distanceToPoint(t.origin));r=L(l,e,f.resolution)}if(E.radius+=r,!1!==t.intersectsSphere(E)){if(null===c.boundingBox&&c.computeBoundingBox(),_.copy(c.boundingBox).applyMatrix4(u),s)a=.5*i;else{let e=Math.max(l.near,_.distanceToPoint(t.origin));a=L(l,e,f.resolution)}_.expandByScalar(a),!1!==t.intersectsBox(_)&&(s?function(e,n){let r=e.matrixWorld,a=e.geometry,s=a.attributes.instanceStart,l=a.attributes.instanceEnd,d=Math.min(a.instanceCount,s.count);for(let a=0;a<d;a++){w.start.fromBufferAttribute(s,a),w.end.fromBufferAttribute(l,a),w.applyMatrix4(r);let d=new o.Vector3,u=new o.Vector3;t.distanceSqToSegment(w.start,w.end,u,d),u.distanceTo(d)<.5*i&&n.push({point:u,pointOnLine:d,distance:t.origin.distanceTo(u),object:e,face:null,faceIndex:a,uv:null,[p]:null})}}(this,n):function(e,n,r){let a=n.projectionMatrix,s=e.material.resolution,l=e.matrixWorld,d=e.geometry,u=d.attributes.instanceStart,c=d.attributes.instanceEnd,f=Math.min(d.instanceCount,u.count),h=-n.near;t.at(1,x),x.w=1,x.applyMatrix4(n.matrixWorldInverse),x.applyMatrix4(a),x.multiplyScalar(1/x.w),x.x*=s.x/2,x.y*=s.y/2,x.z=0,b.copy(x),S.multiplyMatrices(n.matrixWorldInverse,l);for(let n=0;n<f;n++){if(g.fromBufferAttribute(u,n),y.fromBufferAttribute(c,n),g.w=1,y.w=1,g.applyMatrix4(S),y.applyMatrix4(S),g.z>h&&y.z>h)continue;if(g.z>h){let e=g.z-y.z,t=(g.z-h)/e;g.lerp(y,t)}else if(y.z>h){let e=y.z-g.z,t=(y.z-h)/e;y.lerp(g,t)}g.applyMatrix4(a),y.applyMatrix4(a),g.multiplyScalar(1/g.w),y.multiplyScalar(1/y.w),g.x*=s.x/2,g.y*=s.y/2,y.x*=s.x/2,y.y*=s.y/2,w.start.copy(g),w.start.z=0,w.end.copy(y),w.end.z=0;let d=w.closestPointToPointParameter(b,!0);w.at(d,M);let f=o.MathUtils.lerp(g.z,y.z,d),m=f>=-1&&f<=1,v=b.distanceTo(M)<.5*i;if(m&&v){w.start.fromBufferAttribute(u,n),w.end.fromBufferAttribute(c,n),w.start.applyMatrix4(l),w.end.applyMatrix4(l);let i=new o.Vector3,a=new o.Vector3;t.distanceSqToSegment(w.start,w.end,a,i),r.push({point:a,pointOnLine:i,distance:t.origin.distanceTo(a),object:e,face:null,faceIndex:n,uv:null,[p]:null})}}}(this,l,n))}}onBeforeRender(e){let t=this.material.uniforms;t&&t.resolution&&(e.getViewport(h),this.material.uniforms.resolution.value.set(h.z,h.w))}}var U=l;class z extends U.LineSegmentsGeometry{constructor(){super(),this.isLineGeometry=!0,this.type="LineGeometry"}setPositions(e){let t=e.length-3,i=new Float32Array(2*t);for(let n=0;n<t;n+=3)i[2*n]=e[n],i[2*n+1]=e[n+1],i[2*n+2]=e[n+2],i[2*n+3]=e[n+3],i[2*n+4]=e[n+4],i[2*n+5]=e[n+5];return super.setPositions(i),this}setColors(e,t=3){let i=e.length-t,n=new Float32Array(2*i);if(3===t)for(let r=0;r<i;r+=t)n[2*r]=e[r],n[2*r+1]=e[r+1],n[2*r+2]=e[r+2],n[2*r+3]=e[r+3],n[2*r+4]=e[r+4],n[2*r+5]=e[r+5];else for(let r=0;r<i;r+=t)n[2*r]=e[r],n[2*r+1]=e[r+1],n[2*r+2]=e[r+2],n[2*r+3]=e[r+3],n[2*r+4]=e[r+4],n[2*r+5]=e[r+5],n[2*r+6]=e[r+6],n[2*r+7]=e[r+7];return super.setColors(n,t),this}fromLine(e){let t=e.geometry;return this.setPositions(t.attributes.position.array),this}}class j extends B{constructor(e=new z,t=new f({color:0xffffff*Math.random()})){super(e,t),this.isLine2=!0,this.type="Line2"}}let O=r.forwardRef(function({points:e,color:t=0xffffff,vertexColors:i,linewidth:o,lineWidth:d,segments:u,dashed:c,...p},h){var m,v;let g=(0,s.useThree)(e=>e.size),y=r.useMemo(()=>u?new B:new j,[u]),[x]=r.useState(()=>new f),b=(null==i||null==(m=i[0])?void 0:m.length)===4?4:3,S=r.useMemo(()=>{let n=u?new l.LineSegmentsGeometry:new z,r=e.map(e=>{let t=Array.isArray(e);return e instanceof a.Vector3||e instanceof a.Vector4?[e.x,e.y,e.z]:e instanceof a.Vector2?[e.x,e.y,0]:t&&3===e.length?[e[0],e[1],e[2]]:t&&2===e.length?[e[0],e[1],0]:e});if(n.setPositions(r.flat()),i){t=0xffffff;let e=i.map(e=>e instanceof a.Color?e.toArray():e);n.setColors(e.flat(),b)}return n},[e,u,i,b]);return r.useLayoutEffect(()=>{y.computeLineDistances()},[e,y]),r.useLayoutEffect(()=>{c?x.defines.USE_DASH="":delete x.defines.USE_DASH,x.needsUpdate=!0},[c,x]),r.useEffect(()=>()=>{S.dispose(),x.dispose()},[S]),r.createElement("primitive",(0,n.default)({object:y,ref:h},p),r.createElement("primitive",{object:S,attach:"geometry"}),r.createElement("primitive",(0,n.default)({object:x,attach:"material",color:t,vertexColors:!!i,resolution:[g.width,g.height],linewidth:null!=(v=null!=o?o:d)?v:1,dashed:c,transparent:4===b},p)))});e.s(["Line",0,O],43216)},31497,e=>{"use strict";let t=parseInt(e.i(90072).REVISION.replace(/\D+/g,""));e.s(["version",0,t])},32533,e=>{"use strict";var t=e.i(90072);let i=new t.Box3,n=new t.Vector3;class r extends t.InstancedBufferGeometry{constructor(){super(),this.isLineSegmentsGeometry=!0,this.type="LineSegmentsGeometry",this.setIndex([0,2,1,2,3,1,2,4,3,4,5,3,4,6,5,6,7,5]),this.setAttribute("position",new t.Float32BufferAttribute([-1,2,0,1,2,0,-1,1,0,1,1,0,-1,0,0,1,0,0,-1,-1,0,1,-1,0],3)),this.setAttribute("uv",new t.Float32BufferAttribute([-1,2,1,2,-1,1,1,1,-1,-1,1,-1,-1,-2,1,-2],2))}applyMatrix4(e){let t=this.attributes.instanceStart,i=this.attributes.instanceEnd;return void 0!==t&&(t.applyMatrix4(e),i.applyMatrix4(e),t.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}setPositions(e){let i;e instanceof Float32Array?i=e:Array.isArray(e)&&(i=new Float32Array(e));let n=new t.InstancedInterleavedBuffer(i,6,1);return this.setAttribute("instanceStart",new t.InterleavedBufferAttribute(n,3,0)),this.setAttribute("instanceEnd",new t.InterleavedBufferAttribute(n,3,3)),this.computeBoundingBox(),this.computeBoundingSphere(),this}setColors(e,i=3){let n;e instanceof Float32Array?n=e:Array.isArray(e)&&(n=new Float32Array(e));let r=new t.InstancedInterleavedBuffer(n,2*i,1);return this.setAttribute("instanceColorStart",new t.InterleavedBufferAttribute(r,i,0)),this.setAttribute("instanceColorEnd",new t.InterleavedBufferAttribute(r,i,i)),this}fromWireframeGeometry(e){return this.setPositions(e.attributes.position.array),this}fromEdgesGeometry(e){return this.setPositions(e.attributes.position.array),this}fromMesh(e){return this.fromWireframeGeometry(new t.WireframeGeometry(e.geometry)),this}fromLineSegments(e){let t=e.geometry;return this.setPositions(t.attributes.position.array),this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new t.Box3);let e=this.attributes.instanceStart,n=this.attributes.instanceEnd;void 0!==e&&void 0!==n&&(this.boundingBox.setFromBufferAttribute(e),i.setFromBufferAttribute(n),this.boundingBox.union(i))}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new t.Sphere),null===this.boundingBox&&this.computeBoundingBox();let e=this.attributes.instanceStart,i=this.attributes.instanceEnd;if(void 0!==e&&void 0!==i){let t=this.boundingSphere.center;this.boundingBox.getCenter(t);let r=0;for(let a=0,s=e.count;a<s;a++)n.fromBufferAttribute(e,a),r=Math.max(r,t.distanceToSquared(n)),n.fromBufferAttribute(i,a),r=Math.max(r,t.distanceToSquared(n));this.boundingSphere.radius=Math.sqrt(r),isNaN(this.boundingSphere.radius)&&console.error("THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.",this)}}toJSON(){}applyMatrix(e){return console.warn("THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4()."),this.applyMatrix4(e)}}e.s(["LineSegmentsGeometry",0,r])},74452,(e,t,i)=>{t.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var t=e.i(74452);let i=180/Math.PI,n=t.default.vpp,r=(e,t,i)=>e+(t-e)*i,a=(e,t)=>{if(t<=e[0])return[0,0];let i=e.length-1;if(t>=e[i])return[i-1,1];let n=0;for(;t>e[n+1];)n++;return[n,(t-e[n])/(e[n+1]-e[n])]},s=n.speeds.map((e,t)=>(e=>{let t=n.beat_angle[e],r=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(t/i),s=n.run_vmg[e]/Math.abs(Math.cos(r/i)),o=[[0,0],[.7*t,.55*a],[t,a]];for(let i of n.angles)i>t&&i<r&&o.push([i,n[String(i)][e]]);return o.push([r,s]),r<180&&o.push([180,n.run_vmg[e]]),o})(t)),o=(e,t)=>{let[i,n]=a(e.map(e=>e[0]),t);return r(e[i][1],e[i+1][1],n)},l=(e,t)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0)return null;let i=Math.min(180,Math.abs((t+540)%360-180)),l=n.speeds;if(e<l[0])return o(s[0],i)*(e/l[0]);let[d,u]=a(l,e);return r(o(s[d],i),o(s[d+1],i),u)},d=(e,t)=>{let[i,s]=a(n.speeds,t);return r(e[i],e[i+1],s)},u=(e,t)=>{let n=l(1.943844*e,t*i);return null===n?null:n/1.943844},c=e=>{let t=(e+Math.PI)%(2*Math.PI);return t<0&&(t+=2*Math.PI),t-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:t,bearing:n})=>{if(![e,t,n].every(Number.isFinite)||t<=0)return null;let r=null;for(let a=-100;a<=100;a++){let s=n+a/i,o=u(t,c(e-s));if(null===o)continue;let l=o*Math.cos(s-n);(!r||l>r.vmc)&&(r={heading:c(s),speed:o,vmc:l})}return r},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=d(n.run_angle,e),r=l(e,t);return{twa:t,speed:r,vmg:-r*Math.cos(t/i)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=d(n.beat_angle,e),r=l(e,t);return{twa:t,speed:r,vmg:r*Math.cos(t/i)}},"polarSpeed",0,l,"polarSpeedSi",0,u,"vmcForHeading",0,({twd:e,tws:t,bearing:i,heading:n})=>{if(![e,t,i,n].every(Number.isFinite))return null;let r=u(t,c(e-n));return null===r?null:r*Math.cos(n-i)},"wrapPi",0,c])}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,26822,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.i(85269);var n=e.i(22831),i=e.i(83524),a=e.i(85709),o=e.i(66799),s=e.i(92554);let l=["compass","gps","heading","auto"],u=["steering.autopilot.engaged","steering.autopilot.state","steering.autopilot.mode"];e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),d=(0,i.default)(),g=(0,a.useSignalKPaths)(u),[c,p]=(0,r.useState)(!1),[m,v]=(0,r.useState)(null),h=(0,r.useRef)(null);if((0,r.useEffect)(()=>()=>clearTimeout(h.current),[]),!d)return null;let f=g["steering.autopilot.engaged"]??"enabled"===g["steering.autopilot.state"],b=g["steering.autopilot.mode"],w=!0===f&&(!b||l.includes(b))&&null!==d.change,M=Math.round((d.change??0)*180/Math.PI),T=async()=>{if(!c){p(!0),h.current=setTimeout(()=>p(!1),4e3);return}clearTimeout(h.current),p(!1);try{await o.default.adjustAutopilotTarget(M),v({ok:!0,text:e("advice.applied")})}catch(e){v({ok:!1,text:e?.message||String(e)})}setTimeout(()=>v(null),4e3)},N="avoid"===d.kind,y="standOn"===d.kind;return(0,t.jsxs)("div",{className:`tesla-card !p-3 flex items-center gap-3 max-w-[30rem] ${N?"border-oRed/60":""}`,children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:`text-label font-semibold ${N?"text-oRed":y?"text-oGreen":"text-oYellow"}`,children:(0,s.formatAdvice)(d,e)}),(0,t.jsx)("div",{className:"text-caption text-hud-muted truncate",children:m?m.text:d.reason?`${e(`colregs.${d.reason}`,{name:d.targetName||"AIS"})} \xb7 ${e("colregs.rule",{rule:d.lastMoment?"17b":d.rule})}`:N?e("advice.avoidHint",{name:d.targetName||"AIS"}):e("advice.vmgHint")})]}),w&&!y&&(0,t.jsx)("button",{type:"button",onClick:T,className:`shrink-0 px-3 py-2 rounded-lg text-caption font-semibold uppercase tracking-wider border transition-colors ${c?"bg-oYellow text-black border-oYellow":"border-hud text-hud-main tesla-hover"}`,children:c?e("advice.confirm"):e("advice.apply")})]})}])},56101,function(e){e.n(e.i(26822))},77291,e=>{"use strict";var t=e.i(71645),r=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},l=e=>{let t=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(t))return"restricted";if(/fishing/.test(t))return"fishing";if(/sailing/.test(t))return"sail";if(/motoring|engine/.test(t))return"power";let r=Number(e.shipType);return 36===r?"sail":30===r?"fishing":33===r?"restricted":"power"},u=(e,t,r)=>(0,a.wrapPi)(Math.atan2(t.x-e.x,t.y-e.y)-r),d=(e,t,r)=>{let n={x:0,y:0},i=u(n,t,e.course),l=u(t,n,t.course),d=Math.sign(l)||1,g=e=>Math.abs(e)>112.5*o;if(g(i)&&t.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(g(l)&&e.speed>t.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let c=s[e.category]??1,p=s[t.category]??1;if(c!==p)return c<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${t.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${t.category}`,targetTurn:d};if("sail"===e.category&&Number.isFinite(r)){let n=(0,a.wrapPi)(r-e.course)>=0?"starboard":"port";return n!==((0,a.wrapPi)(r-t.course)>=0?"starboard":"port")?"port"===n?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:d}:t.x*Math.sin(r)+t.y*Math.cos(r)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:d}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(t.course-e.course-Math.PI))<10*o&&Math.abs(i)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:i>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:d}};var g=e.i(83402),c=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,r.useAIS)({passive:!0}),{states:u}=(0,c.useOcearoContext)(),v=e||u.ais?s:p,{twd:h,heading:f}=(0,i.default)(),b=(0,n.useSignalKPaths)(m),w=(a=(0,n.useSignalKPrefix)("propulsion."),o=g.default.get("ownVesselCategory"),(0,t.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,t])=>e.endsWith(".revolutions")&&Number(t)>.5||e.endsWith(".state")&&"started"===t)?"power":"sail",[a,o])),M=g.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let e=b["navigation.courseOverGroundTrue"]??f,t=b["navigation.speedOverGround"]??0,r=[];if(Number.isFinite(e))for(let n of v){if("danger"!==n.risk)continue;let i=n.cog??n.cogMagnetic??n.heading;if(!Number.isFinite(i)||null===n.sceneX)continue;let a=d({course:e,speed:t,category:w},{x:n.sceneX/M,y:-n.sceneZ/M,course:i,speed:n.sog??0,category:l(n)},h);r.push({target:{...n},role:a})}r.sort((e,t)=>(e.target.tcpaSeconds??1/0)-(t.target.tcpaSeconds??1/0));let n={};for(let e of v)"close"===e.risk?n[e.mmsi]="close":"danger"===e.risk&&(n[e.mmsi]="giveWay");for(let e of r)n[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let i=r.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:w,encounters:r,statuses:n,giveWay:i.length>0,giveWayTo:i[0]||null,primary:r[0]||null}},[v,h,f,b,w,M])}],77291)},83524,92554,e=>{"use strict";var t=e.i(71645),r=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(90669),o=e.i(539),s=e.i(83402),l=e.i(77291);let u=Math.PI/180,d=3*u,g=60*u,c=5*u,p=90*u,m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,()=>{let{targets:e}=(0,r.useAIS)({passive:!0}),u=(0,i.default)(),v=(0,n.useSignalKPaths)(m),h=(0,t.useMemo)(()=>(0,a.getCollisionThresholds)(),[]),f=(0,l.default)(),b=s.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let t=v["navigation.speedOverGround"],r=v["navigation.courseOverGroundTrue"]??u.heading,n=f.giveWayTo||f.primary;if(n&&Number.isFinite(t)&&t>.3&&Number.isFinite(r)){let{target:i,role:s}=n,l={targetName:i.name,rule:s.rule,reason:s.reason},u="stand-on"===s.ownRole&&Number.isFinite(i.tcpaSeconds)&&i.tcpaSeconds<180&&Number.isFinite(i.cpaMeters)&&i.cpaMeters<.3*h.cpaMeters;if("stand-on"===s.ownRole&&!u)return{kind:"standOn",change:0,heading:r,...l};let d=Math.sign(Math.sin(Math.atan2(i.sceneX,-i.sceneZ)-r))||1,g=(({targets:e,sog:t,cog:r,scale:n,thresholds:i,preferSide:o=0})=>{let s=e.filter(e=>null!==e.distanceMeters&&null!==e.sceneX&&Number.isFinite(e.sog)&&Number.isFinite(e.cog??e.cogMagnetic)),l=(e,r=i.cpaMeters)=>s.every(o=>{let s=(0,a.closestApproach)({rx:o.sceneX/n,ry:-o.sceneZ/n,ownSog:t,ownCog:e,targetSog:o.sog,targetCog:o.cog??o.cogMagnetic});return!s||s.tcpa<=0||s.tcpa>i.tcpaSeconds||s.cpa>=r}),u=o<0?[-1,1]:[1,-1],d=(e,t)=>{for(let n=c;n<=p+1e-9;n+=c)if(l(r+e*n,t))return e*n;return null};if(0!==o)return d(u[0])??d(u[0],i.cpaMeters/2)??d(u[1]);for(let e=c;e<=p+1e-9;e+=c){if(l(r+e))return e;if(l(r-e))return-e}return null})({targets:e,sog:t,cog:r,scale:b,thresholds:h,preferSide:"both"===s.ownRole||"power"===f.ownCategory||u?1:d});return null!==g?{kind:"avoid",change:g,heading:(0,o.wrapPi)(r+g),lastMoment:u,...l}:{kind:"avoid",change:null,heading:r,lastMoment:u,noSolution:!0,...l}}let i=u.vmc;if(i&&Number.isFinite(i.current)&&Number.isFinite(u.heading)){let e=(0,o.wrapPi)(i.best.heading-u.heading),t=(i.best.vmc-i.current)*1.943844;if(t>=.15&&Math.abs(e)>=d&&Math.abs(e)<=g)return{kind:"vmg",change:e,heading:i.best.heading,gainKn:t}}return null},[e,u,v,b,h,f])}],83524),e.s(["formatAdvice",0,(e,t)=>{let r=Math.round(180*Math.abs(e.change)/Math.PI);if("standOn"===e.kind)return t("advice.standOn");if("avoid"===e.kind&&e.noSolution)return t("advice.avoidNoSolution");if("avoid"===e.kind)return t("advice.avoid",{deg:r,side:t(e.change>=0?"advice.starboard":"advice.port")});let n=e.change>=0?"+":"−";return t("advice.vmg",{change:`${n}${r}\xb0`,gain:e.gainKn.toFixed(1)})}],92554)},61969,e=>{"use strict";var t=e.i(71645),r=e.i(85709),n=e.i(539);let i=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,r.useSignalKPaths)(a);return(0,t.useMemo)(()=>{let t=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,r=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(r)&&(s=(0,n.wrapPi)(r+o));let l=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,n.polarSpeedSi)(a,o):null),u=e["performance.polarSpeedRatio"]??null;null===u&&Number.isFinite(t)&&Number.isFinite(l)&&l>.2&&(u=t/l);let d=Number.isFinite(t)&&Number.isFinite(l)?(t-l)*1.943844:null,g=null,c=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,n.optimalUpwind)(1.943844*a):(0,n.optimalDownwind)(1.943844*a);e&&(g=e.twa/i,Number.isFinite(s)&&Number.isFinite(o)&&(c=(0,n.wrapPi)(s-Math.sign(o||1)*g)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],v=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,n.bestVmcHeading)({twd:s,tws:a,bearing:m}),t=Number.isFinite(r)?(0,n.vmcForHeading)({twd:s,tws:a,bearing:m,heading:r}):null;v=e?{bearing:m,best:e,current:t}:null}return{ratio:u,polarSpeed:l,boatSpeed:t,deltaKn:d,heading:r,twd:s,tws:a,twa:o,targetTwa:g,targetHeading:c,upwind:p,vmc:v}},[e])}])},74452,(e,t,r)=>{t.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var t=e.i(74452);let r=180/Math.PI,n=t.default.vpp,i=(e,t,r)=>e+(t-e)*r,a=(e,t)=>{if(t<=e[0])return[0,0];let r=e.length-1;if(t>=e[r])return[r-1,1];let n=0;for(;t>e[n+1];)n++;return[n,(t-e[n])/(e[n+1]-e[n])]},o=n.speeds.map((e,t)=>(e=>{let t=n.beat_angle[e],i=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(t/r),o=n.run_vmg[e]/Math.abs(Math.cos(i/r)),s=[[0,0],[.7*t,.55*a],[t,a]];for(let r of n.angles)r>t&&r<i&&s.push([r,n[String(r)][e]]);return s.push([i,o]),i<180&&s.push([180,n.run_vmg[e]]),s})(t)),s=(e,t)=>{let[r,n]=a(e.map(e=>e[0]),t);return i(e[r][1],e[r+1][1],n)},l=(e,t)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0)return null;let r=Math.min(180,Math.abs((t+540)%360-180)),l=n.speeds;if(e<l[0])return s(o[0],r)*(e/l[0]);let[u,d]=a(l,e);return i(s(o[u],r),s(o[u+1],r),d)},u=(e,t)=>{let[r,o]=a(n.speeds,t);return i(e[r],e[r+1],o)},d=(e,t)=>{let n=l(1.943844*e,t*r);return null===n?null:n/1.943844},g=e=>{let t=(e+Math.PI)%(2*Math.PI);return t<0&&(t+=2*Math.PI),t-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:t,bearing:n})=>{if(![e,t,n].every(Number.isFinite)||t<=0)return null;let i=null;for(let a=-100;a<=100;a++){let o=n+a/r,s=d(t,g(e-o));if(null===s)continue;let l=s*Math.cos(o-n);(!i||l>i.vmc)&&(i={heading:g(o),speed:s,vmc:l})}return i},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=u(n.run_angle,e),i=l(e,t);return{twa:t,speed:i,vmg:-i*Math.cos(t/r)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=u(n.beat_angle,e),i=l(e,t);return{twa:t,speed:i,vmg:i*Math.cos(t/r)}},"polarSpeed",0,l,"polarSpeedSi",0,d,"vmcForHeading",0,({twd:e,tws:t,bearing:r,heading:n})=>{if(![e,t,r,n].every(Number.isFinite))return null;let i=d(t,g(e-n));return null===i?null:i*Math.cos(n-r)},"wrapPi",0,g])}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,97069,e=>{"use strict";var t=e.i(43476),i=e.i(46991),a=e.i(71645),l=e.i(85709);e.i(85269);var n=e.i(22831);let o="bg-oBlue";e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),[s,r]=(0,a.useState)(240),u=(0,l.useSignalKPath)("environment.depth.belowKeel"),d=(0,l.useSignalKPath)("environment.depth.belowTransducer"),c=(0,l.useSignalKPath)("environment.depth.belowSurface"),m=(0,a.useMemo)(()=>u??d??c??null,[u,d,c]);(0,a.useEffect)(()=>{let e=()=>{let e=window.innerHeight;r(e<640?Math.min(.25*e,240):Math.min(.35*e,240))};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]);let h=(0,a.useMemo)(()=>null===m?0:Math.min(m/50*100,100),[m]),p=(0,a.useMemo)(()=>null===m?o:m<3?"bg-oRed":m<5?"bg-oYellow":o,[m]),v="text-hud-main",b=(0,a.useCallback)(e=>null===e?"--":`${(0,i.convertDepthUnit)(e)} ${(0,i.getDepthUnitLabel)()}`,[]),g=(0,t.jsx)("div",{className:"w-1.5 bg-hud-elevated rounded-full overflow-hidden mb-2 relative",style:{height:s},role:"progressbar","aria-valuenow":m,"aria-valuemin":"0","aria-valuemax":50,"aria-label":`${e("indicators.waterDepth")}: ${b(m)}`,children:(0,t.jsx)("div",{className:`absolute bottom-0 left-0 w-full transition-all duration-1000 ease-in-out ${p} ${null!=m&&m<3?"animate-pulse":""}`,style:{height:`${h}%`}})});return(0,t.jsxs)("div",{className:"flex flex-col items-center group p-3 transition-all duration-300",children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase tracking-[0.2em] mb-4 opacity-40 group-hover:opacity-100 transition-opacity ${v}`,children:e("indicators.depth")}),g,(0,t.jsx)("div",{className:`text-caption font-semibold tracking-widest mt-2 ${v} ${null!=m&&m<3?"text-oRed animate-soft-pulse":""}`,children:b(m)})]})}])},14774,function(e){e.n(e.i(97069))}]);
|