mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-03-27 08:09:36 +00:00
style cleanup, mobile layout improvements, ForceFieldBare fix
This commit is contained in:
parent
c15bce10f3
commit
bb654b3667
98 changed files with 1010 additions and 835 deletions
|
|
@ -1 +1 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{i as r,o as i}from"./react-three-fiber.esm-CgPHUpXo.js";import{a,i as o}from"./SettingsProvider-CCHVZuSg.js";import{t as s}from"./logger-z_EpIdIa.js";import"./traditional-BTL5qX2E.js";import{Ut as c,bt as l,c as u}from"./three.module-07hRbor4.js";import"./mission-D8vr00S1.js";import{r as d}from"./engineStore-Dkm20jvr.js";import{r as f}from"./loaders-VxR5Bl13.js";import{n as p}from"./AudioContext-CMp1T7r9.js";import{t as m}from"./FloatingLabel-C9VkDpCy.js";var h=e(t(),1),g=n(),_=s(`AudioEmitter`),v=new Map,y=new Map;function b(e,t=1){y.set(e,t)}function x(e){y.delete(e)}var S=0;function C(){return S}function w(){S++;for(let[e]of y){try{e.stop()}catch{}try{e.disconnect()}catch{}}y.clear()}d.subscribe(e=>e.playback.rate,e=>{for(let[t,n]of y)try{t.setPlaybackRate(n*e)}catch{}});function T(e,t){let n=t(e),r=n?.filename;if(!r)return null;let i=r.endsWith(`.wav`)?r:`${r}.wav`,a=n.description,o=a==null?void 0:t(a);return{filename:i,is3D:o?.is3D??!0,isLooping:o?.isLooping??!1,refDist:o?.referenceDistance??20,maxDist:o?.maxDistance??100,volume:o?.volume??1}}function E(e,t,n,r,i){let a;try{a=f(e.filename)}catch{return}let o=d.getState().playback.rate,s=S;D(a,n,n=>{if(s===S)try{if(e.is3D&&i){let a=new l(t);a.setBuffer(n),a.setDistanceModel(`inverse`),a.setRefDistance(e.refDist),a.setMaxDistance(e.maxDist),a.setRolloffFactor(1),a.setVolume(e.volume),a.setPlaybackRate(o),r&&a.position.copy(r),i.add(a),y.set(a,1),a.play(),a.source.onended=()=>{y.delete(a);try{a.disconnect()}catch{}i.remove(a)}}else{let r=new u(t);r.setBuffer(n),r.setVolume(e.volume),r.setPlaybackRate(o),y.set(r,1),r.play(),r.source.onended=()=>{y.delete(r);try{r.disconnect()}catch{}}}}catch{}})}function D(e,t,n){v.has(e)?n(v.get(e)):t.load(e,t=>{v.set(e,t),n(t)},void 0,t=>{_.error(`Audio load error %s: %o`,e,t)})}var O=(0,h.memo)(function({entity:e}){let{debugMode:t}=o(),n=e.audioFileName??``,s=e.audioVolume??1,d=e.audioMinDistance??1,_=e.audioMaxDistance??1,v=e.audioMinLoopGap??0,y=e.audioMaxLoopGap??0,b=e.audioIs3D??!0?1:0,x=e.audioIsLooping??!0,[S,C,w]=e.position??[0,0,0],T=i(e=>e.scene),E=i(e=>e.camera),{audioLoader:O,audioListener:k}=p(),{audioEnabled:A}=a(),j=(0,h.useRef)(null),M=(0,h.useRef)(null),N=(0,h.useRef)(null),P=(0,h.useRef)(!1),F=(0,h.useRef)(!1),I=(0,h.useRef)(new c(S,C,w)),L=(0,h.useRef)(0),R=()=>{M.current!=null&&(clearTimeout(M.current),M.current=null),N.current!=null&&(clearTimeout(N.current),N.current=null)},[z]=(0,h.useState)(()=>Math.random());(0,h.useEffect)(()=>{if(!O||!k)return;L.current++;let e;if(b){let t=new l(k);t.position.copy(I.current),t.setDistanceModel(`inverse`),t.setRefDistance(d),t.setMaxDistance(_),t.setRolloffFactor(1),t.setVolume(s),e=t,T.add(e)}else e=new u(k),e.setVolume(s);return j.current=e,()=>{R();try{e.stop()}catch{}try{e.disconnect()}catch{}b&&T.remove(e),j.current=null,P.current=!1,F.current=!1}},[O,k,b,d,_,s,T]);let B=(e,t)=>{if(x)if(v>0||y>0){let n=Math.max(0,v),r=Math.max(n,y),i=n===r?n:z*(r-n)+n;e.loop=!1;let a=()=>{t===L.current&&(e.isPlaying===!1?M.current=setTimeout(()=>{if(t===L.current)try{e.play(),B(e,t)}catch{}},i):N.current=setTimeout(a,100))};N.current=setTimeout(a,100)}else e.setLoop(!0)},V=(0,h.useEffectEvent)(e=>{if(!O)return;let t=L.current;if(P.current)try{e.isPlaying||(e.play(),B(e,t))}catch{}else{let r;try{r=f(n)}catch{return}D(r,O,n=>{if(t===L.current&&!e.buffer){e.setBuffer(n),P.current=!0;try{e.play(),B(e,t)}catch{}}})}});return(0,h.useEffect)(()=>{let e=j.current;!e||b||!A||!n||V(e)},[A,b,n,O,k]),r(()=>{let e=j.current;if(!e||!b||!A||!n)return;let t=E.position.distanceTo(I.current),r=F.current,i=t<=_;if(i&&!r)F.current=!0,V(e);else if(!i&&r){F.current=!1,R();try{e.stop()}catch{}}}),(0,h.useEffect)(()=>{let e=j.current;if(e&&!A){R();try{e.stop()}catch{}F.current=!1}},[A]),t?(0,g.jsxs)(`mesh`,{position:I.current,children:[(0,g.jsx)(`sphereGeometry`,{args:[d,12,12]}),(0,g.jsx)(`meshBasicMaterial`,{color:`#00ff00`,wireframe:!0,opacity:.05,transparent:!0,toneMapped:!1}),(0,g.jsx)(m,{color:`#00ff00`,position:[0,d+1,0],children:n})]}):null});export{O as AudioEmitter,v as audioBufferCache,D as getCachedAudioBuffer,C as getSoundGeneration,E as playOneShotSound,T as resolveAudioProfile,w as stopAllTrackedSounds,b as trackSound,x as untrackSound};
|
||||
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{i as r,o as i}from"./react-three-fiber.esm-CgPHUpXo.js";import{a,i as o}from"./SettingsProvider-CCHVZuSg.js";import{t as s}from"./logger-z_EpIdIa.js";import{Ut as c,bt as l,c as u}from"./three.module-07hRbor4.js";import{r as d}from"./engineStore-Dkm20jvr.js";import{r as f}from"./loaders-CIpiZadQ.js";import{n as p}from"./AudioContext-CMp1T7r9.js";import{t as m}from"./FloatingLabel-4Yii8rRq.js";var h=e(t(),1),g=n(),_=s(`AudioEmitter`),v=new Map,y=new Map;function b(e,t=1){y.set(e,t)}function x(e){y.delete(e)}var S=0;function C(){return S}function w(){S++;for(let[e]of y){try{e.stop()}catch{}try{e.disconnect()}catch{}}y.clear()}d.subscribe(e=>e.playback.rate,e=>{for(let[t,n]of y)try{t.setPlaybackRate(n*e)}catch{}});function T(e,t){let n=t(e),r=n?.filename;if(!r)return null;let i=r.endsWith(`.wav`)?r:`${r}.wav`,a=n.description,o=a==null?void 0:t(a);return{filename:i,is3D:o?.is3D??!0,isLooping:o?.isLooping??!1,refDist:o?.referenceDistance??20,maxDist:o?.maxDistance??100,volume:o?.volume??1}}function E(e,t,n,r,i){let a;try{a=f(e.filename)}catch{return}let o=d.getState().playback.rate,s=S;D(a,n,n=>{if(s===S)try{if(e.is3D&&i){let a=new l(t);a.setBuffer(n),a.setDistanceModel(`inverse`),a.setRefDistance(e.refDist),a.setMaxDistance(e.maxDist),a.setRolloffFactor(1),a.setVolume(e.volume),a.setPlaybackRate(o),r&&a.position.copy(r),i.add(a),y.set(a,1),a.play(),a.source.onended=()=>{y.delete(a);try{a.disconnect()}catch{}i.remove(a)}}else{let r=new u(t);r.setBuffer(n),r.setVolume(e.volume),r.setPlaybackRate(o),y.set(r,1),r.play(),r.source.onended=()=>{y.delete(r);try{r.disconnect()}catch{}}}}catch{}})}function D(e,t,n){v.has(e)?n(v.get(e)):t.load(e,t=>{v.set(e,t),n(t)},void 0,t=>{_.error(`Audio load error %s: %o`,e,t)})}var O=(0,h.memo)(function({entity:e}){let{debugMode:t}=o(),n=e.audioFileName??``,s=e.audioVolume??1,d=e.audioMinDistance??1,_=e.audioMaxDistance??1,v=e.audioMinLoopGap??0,y=e.audioMaxLoopGap??0,b=e.audioIs3D??!0?1:0,x=e.audioIsLooping??!0,[S,C,w]=e.position??[0,0,0],T=i(e=>e.scene),E=i(e=>e.camera),{audioLoader:O,audioListener:k}=p(),{audioEnabled:A}=a(),j=(0,h.useRef)(null),M=(0,h.useRef)(null),N=(0,h.useRef)(null),P=(0,h.useRef)(!1),F=(0,h.useRef)(!1),I=(0,h.useRef)(new c(S,C,w)),L=(0,h.useRef)(0),R=()=>{M.current!=null&&(clearTimeout(M.current),M.current=null),N.current!=null&&(clearTimeout(N.current),N.current=null)},[z]=(0,h.useState)(()=>Math.random());(0,h.useEffect)(()=>{if(!O||!k)return;L.current++;let e;if(b){let t=new l(k);t.position.copy(I.current),t.setDistanceModel(`inverse`),t.setRefDistance(d),t.setMaxDistance(_),t.setRolloffFactor(1),t.setVolume(s),e=t,T.add(e)}else e=new u(k),e.setVolume(s);return j.current=e,()=>{R();try{e.stop()}catch{}try{e.disconnect()}catch{}b&&T.remove(e),j.current=null,P.current=!1,F.current=!1}},[O,k,b,d,_,s,T]);let B=(e,t)=>{if(x)if(v>0||y>0){let n=Math.max(0,v),r=Math.max(n,y),i=n===r?n:z*(r-n)+n;e.loop=!1;let a=()=>{t===L.current&&(e.isPlaying===!1?M.current=setTimeout(()=>{if(t===L.current)try{e.play(),B(e,t)}catch{}},i):N.current=setTimeout(a,100))};N.current=setTimeout(a,100)}else e.setLoop(!0)},V=(0,h.useEffectEvent)(e=>{if(!O)return;let t=L.current;if(P.current)try{e.isPlaying||(e.play(),B(e,t))}catch{}else{let r;try{r=f(n)}catch{return}D(r,O,n=>{if(t===L.current&&!e.buffer){e.setBuffer(n),P.current=!0;try{e.play(),B(e,t)}catch{}}})}});return(0,h.useEffect)(()=>{let e=j.current;!e||b||!A||!n||V(e)},[A,b,n,O,k]),r(()=>{let e=j.current;if(!e||!b||!A||!n)return;let t=E.position.distanceTo(I.current),r=F.current,i=t<=_;if(i&&!r)F.current=!0,V(e);else if(!i&&r){F.current=!1,R();try{e.stop()}catch{}}}),(0,h.useEffect)(()=>{let e=j.current;if(e&&!A){R();try{e.stop()}catch{}F.current=!1}},[A]),t?(0,g.jsxs)(`mesh`,{position:I.current,children:[(0,g.jsx)(`sphereGeometry`,{args:[d,12,12]}),(0,g.jsx)(`meshBasicMaterial`,{color:`#00ff00`,wireframe:!0,opacity:.05,transparent:!0,toneMapped:!1}),(0,g.jsx)(m,{color:`#00ff00`,position:[0,d+1,0],children:n})]}):null});export{O as AudioEmitter,v as audioBufferCache,D as getCachedAudioBuffer,C as getSoundGeneration,E as playOneShotSound,T as resolveAudioProfile,w as stopAllTrackedSounds,b as trackSound,x as untrackSound};
|
||||
1
docs/assets/ChatInput-B9JdqF5v.js
Normal file
1
docs/assets/ChatInput-B9JdqF5v.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{k as i}from"./index-B1XI52_L.js";var a=t(),o=e(n(),1),s={InputForm:`_InputForm_18kom_1`,Input:`_Input_18kom_1`},c=r();function l(){let e=(0,a.c)(8),[t,n]=(0,o.useState)(``),r;e[0]===t?r=e[1]:(r=e=>{e.preventDefault();let r=t.trim();r&&(i.getState().sendCommand(`messageSent`,r),n(``))},e[0]=t,e[1]=r);let l=r,f;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=e=>n(e.target.value),e[2]=f):f=e[2];let p;e[3]===t?p=e[4]:(p=(0,c.jsx)(`input`,{className:s.Input,type:`text`,placeholder:`Say something…`,value:t,onChange:f,onKeyDown:d,onKeyUp:u,maxLength:255}),e[3]=t,e[4]=p);let m;return e[5]!==l||e[6]!==p?(m=(0,c.jsx)(`form`,{className:s.InputForm,onSubmit:l,children:p}),e[5]=l,e[6]=p,e[7]=m):m=e[7],m}function u(e){return e.stopPropagation()}function d(e){return e.stopPropagation()}export{l as ChatInput};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import"./logger-z_EpIdIa.js";import"./traditional-BTL5qX2E.js";import"./streamHelpers-AIec78DP.js";import"./scene-BdOVRsxo.js";import"./mission-D8vr00S1.js";import{O as i}from"./index-lyciGARn.js";var a=t(),o=e(n(),1),s={InputForm:`_InputForm_18kom_1`,Input:`_Input_18kom_1`},c=r();function l(){let e=(0,a.c)(8),[t,n]=(0,o.useState)(``),r;e[0]===t?r=e[1]:(r=e=>{e.preventDefault();let r=t.trim();r&&(i.getState().sendCommand(`messageSent`,r),n(``))},e[0]=t,e[1]=r);let l=r,f;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(f=e=>n(e.target.value),e[2]=f):f=e[2];let p;e[3]===t?p=e[4]:(p=(0,c.jsx)(`input`,{className:s.Input,type:`text`,placeholder:`Say something…`,value:t,onChange:f,onKeyDown:d,onKeyUp:u,maxLength:255}),e[3]=t,e[4]=p);let m;return e[5]!==l||e[6]!==p?(m=(0,c.jsx)(`form`,{className:s.InputForm,onSubmit:l,children:p}),e[5]=l,e[6]=p,e[7]=m):m=e[7],m}function u(e){return e.stopPropagation()}function d(e){return e.stopPropagation()}export{l as ChatInput};
|
||||
1
docs/assets/ChatSoundPlayer-CkJcKyFh.js
Normal file
1
docs/assets/ChatSoundPlayer-CkJcKyFh.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{r as t}from"./jsx-runtime-BpGWiA-R.js";import{a as n}from"./SettingsProvider-CCHVZuSg.js";import{c as r}from"./three.module-07hRbor4.js";import{i,r as a}from"./engineStore-Dkm20jvr.js";import{r as o}from"./loaders-CIpiZadQ.js";import{n as s}from"./AudioContext-CMp1T7r9.js";import{getCachedAudioBuffer as c,getSoundGeneration as l,trackSound as u,untrackSound as d}from"./AudioEmitter-2bTNGdLP.js";var f=e(t(),1);function p(){let{audioLoader:e,audioListener:t}=s(),{audioEnabled:p}=n(),m=i(e=>e.playback.streamSnapshot?.chatMessages),h=i(e=>e.playback.streamSnapshot?.timeSec),g=(0,f.useRef)(new WeakSet),_=(0,f.useRef)(new Map);return(0,f.useEffect)(()=>{if(!p||!e||!t||!m?.length||h==null)return;let n=g.current,i=_.current;for(let s of m)if(!n.has(s)&&(n.add(s),s.soundPath&&!(Math.abs(h-s.timeSec)>2)))try{let n=o(s.soundPath),f=s.soundPitch??1,p=a.getState().playback.rate,m=s.sender,h=l();c(n,e,e=>{if(h!==l())return;if(m){let e=i.get(m);if(e){try{e.stop()}catch{}d(e);try{e.disconnect()}catch{}i.delete(m)}}let n=new r(t);n.setBuffer(e),n.setPlaybackRate(f*p),u(n,f),m&&i.set(m,n),n.play(),n.source.onended=()=>{d(n);try{n.disconnect()}catch{}m&&i.get(m)===n&&i.delete(m)}})}catch{}},[p,e,t,m,h]),null}export{p as ChatSoundPlayer};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{r as t}from"./jsx-runtime-BpGWiA-R.js";import"./react-three-fiber.esm-CgPHUpXo.js";import{a as n}from"./SettingsProvider-CCHVZuSg.js";import"./logger-z_EpIdIa.js";import"./traditional-BTL5qX2E.js";import{c as r}from"./three.module-07hRbor4.js";import"./mission-D8vr00S1.js";import{i,r as a}from"./engineStore-Dkm20jvr.js";import{r as o}from"./loaders-VxR5Bl13.js";import{n as s}from"./AudioContext-CMp1T7r9.js";import"./FloatingLabel-C9VkDpCy.js";import{getCachedAudioBuffer as c,getSoundGeneration as l,trackSound as u,untrackSound as d}from"./AudioEmitter-GaV8B7eC.js";var f=e(t(),1);function p(){let{audioLoader:e,audioListener:t}=s(),{audioEnabled:p}=n(),m=i(e=>e.playback.streamSnapshot?.chatMessages),h=i(e=>e.playback.streamSnapshot?.timeSec),g=(0,f.useRef)(new WeakSet),_=(0,f.useRef)(new Map);return(0,f.useEffect)(()=>{if(!p||!e||!t||!m?.length||h==null)return;let n=g.current,i=_.current;for(let s of m)if(!n.has(s)&&(n.add(s),s.soundPath&&!(Math.abs(h-s.timeSec)>2)))try{let n=o(s.soundPath),f=s.soundPitch??1,p=a.getState().playback.rate,m=s.sender,h=l();c(n,e,e=>{if(h!==l())return;if(m){let e=i.get(m);if(e){try{e.stop()}catch{}d(e);try{e.disconnect()}catch{}i.delete(m)}}let n=new r(t);n.setBuffer(e),n.setPlaybackRate(f*p),u(n,f),m&&i.set(m,n),n.play(),n.source.onended=()=>{d(n);try{n.disconnect()}catch{}m&&i.get(m)===n&&i.delete(m)}})}catch{}},[p,e,t,m,h]),null}export{p as ChatSoundPlayer};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{r as e,t}from"./chunk-DECur_0Z.js";import{n,r,t as i}from"./jsx-runtime-BpGWiA-R.js";import{n as a,r as o}from"./react-three-fiber.esm-CgPHUpXo.js";import"./traditional-BTL5qX2E.js";import{t as s}from"./Html-C0zmSr0g.js";var c=t(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.Stats=r()})(e,function(){var e=function(){function t(e){return i.appendChild(e.dom),e}function n(e){for(var t=0;t<i.children.length;t++)i.children[t].style.display=t===e?`block`:`none`;r=e}var r=0,i=document.createElement(`div`);i.style.cssText=`position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000`,i.addEventListener(`click`,function(e){e.preventDefault(),n(++r%i.children.length)},!1);var a=(performance||Date).now(),o=a,s=0,c=t(new e.Panel(`FPS`,`#0ff`,`#002`)),l=t(new e.Panel(`MS`,`#0f0`,`#020`));if(self.performance&&self.performance.memory)var u=t(new e.Panel(`MB`,`#f08`,`#201`));return n(0),{REVISION:16,dom:i,addPanel:t,showPanel:n,begin:function(){a=(performance||Date).now()},end:function(){s++;var e=(performance||Date).now();if(l.update(e-a,200),e>o+1e3&&(c.update(1e3*s/(e-o),100),o=e,s=0,u)){var t=performance.memory;u.update(t.usedJSHeapSize/1048576,t.jsHeapSizeLimit/1048576)}return e},update:function(){a=this.end()},domElement:i,setMode:n}};return e.Panel=function(e,t,n){var r=1/0,i=0,a=Math.round,o=a(window.devicePixelRatio||1),s=80*o,c=48*o,l=3*o,u=2*o,d=3*o,f=15*o,p=74*o,m=30*o,h=document.createElement(`canvas`);h.width=s,h.height=c,h.style.cssText=`width:80px;height:48px`;var g=h.getContext(`2d`);return g.font=`bold `+9*o+`px Helvetica,Arial,sans-serif`,g.textBaseline=`top`,g.fillStyle=n,g.fillRect(0,0,s,c),g.fillStyle=t,g.fillText(e,l,u),g.fillRect(d,f,p,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d,f,p,m),{dom:h,update:function(c,_){r=Math.min(r,c),i=Math.max(i,c),g.fillStyle=n,g.globalAlpha=1,g.fillRect(0,0,s,f),g.fillStyle=t,g.fillText(a(c)+` `+e+` (`+a(r)+`-`+a(i)+`)`,l,u),g.drawImage(h,d+o,f,p-o,m,d,f,p-o,m),g.fillRect(d+p-o,f,o,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d+p-o,f,o,a((1-c/_)*m))}}},e})})),l=e(r());function u(e,t){typeof e==`function`?e(t):e!=null&&(e.current=t)}function d(e,t=[],n){let[r,i]=l.useState();return l.useLayoutEffect(()=>{let t=e();return i(t),u(n,t),()=>u(n,null)},t),r}var f=e(c());function p({showPanel:e=0,className:t,parent:n}){let r=d(()=>new f.default,[]);return l.useEffect(()=>{if(r){let i=n&&n.current||document.body;r.showPanel(e),i?.appendChild(r.dom);let s=(t??``).split(` `).filter(e=>e);s.length&&r.dom.classList.add(...s);let c=o(()=>r.begin()),l=a(()=>r.end());return()=>{s.length&&r.dom.classList.remove(...s),i?.removeChild(r.dom),c(),l()}}},[n,r,t,e]),null}var m=n(),h={StatsPanel:`_StatsPanel_10m5i_1`,AxisLabel:`_AxisLabel_10m5i_8`},g=i();function _(){let e=(0,m.c)(10),t=(0,l.useRef)(null),n;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=()=>{let e=t.current;e&&e.setColors(`rgb(153, 255, 0)`,`rgb(0, 153, 255)`,`rgb(255, 153, 0)`)},e[0]=n):n=e[0],(0,l.useEffect)(n);let r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,g.jsx)(p,{className:h.StatsPanel}),e[1]=r):r=e[1];let i;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(i=[70],e[2]=i):i=e[2];let a;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,g.jsx)(`axesHelper`,{ref:t,args:i,renderOrder:999,children:(0,g.jsx)(`lineBasicMaterial`,{depthTest:!1,depthWrite:!1,fog:!1,vertexColors:!0})}),e[3]=a):a=e[3];let o;e[4]===Symbol.for(`react.memo_cache_sentinel`)?(o=[80,0,0],e[4]=o):o=e[4];let c;e[5]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,g.jsx)(s,{position:o,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`y`,children:`Y`})}),e[5]=c):c=e[5];let u;e[6]===Symbol.for(`react.memo_cache_sentinel`)?(u=[0,80,0],e[6]=u):u=e[6];let d;e[7]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,g.jsx)(s,{position:u,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`z`,children:`Z`})}),e[7]=d):d=e[7];let f;e[8]===Symbol.for(`react.memo_cache_sentinel`)?(f=[0,0,80],e[8]=f):f=e[8];let _;return e[9]===Symbol.for(`react.memo_cache_sentinel`)?(_=(0,g.jsxs)(g.Fragment,{children:[r,a,c,d,(0,g.jsx)(s,{position:f,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`x`,children:`X`})})]}),e[9]=_):_=e[9],_}export{_ as DebugElements};
|
||||
1
docs/assets/DebugElements-DbcJj7CW.js
Normal file
1
docs/assets/DebugElements-DbcJj7CW.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e,t}from"./chunk-DECur_0Z.js";import{n,r,t as i}from"./jsx-runtime-BpGWiA-R.js";import{n as a,r as o}from"./react-three-fiber.esm-CgPHUpXo.js";import{t as s}from"./Html-BfjRWIZg.js";var c=t(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.Stats=r()})(e,function(){var e=function(){function t(e){return i.appendChild(e.dom),e}function n(e){for(var t=0;t<i.children.length;t++)i.children[t].style.display=t===e?`block`:`none`;r=e}var r=0,i=document.createElement(`div`);i.style.cssText=`position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000`,i.addEventListener(`click`,function(e){e.preventDefault(),n(++r%i.children.length)},!1);var a=(performance||Date).now(),o=a,s=0,c=t(new e.Panel(`FPS`,`#0ff`,`#002`)),l=t(new e.Panel(`MS`,`#0f0`,`#020`));if(self.performance&&self.performance.memory)var u=t(new e.Panel(`MB`,`#f08`,`#201`));return n(0),{REVISION:16,dom:i,addPanel:t,showPanel:n,begin:function(){a=(performance||Date).now()},end:function(){s++;var e=(performance||Date).now();if(l.update(e-a,200),e>o+1e3&&(c.update(1e3*s/(e-o),100),o=e,s=0,u)){var t=performance.memory;u.update(t.usedJSHeapSize/1048576,t.jsHeapSizeLimit/1048576)}return e},update:function(){a=this.end()},domElement:i,setMode:n}};return e.Panel=function(e,t,n){var r=1/0,i=0,a=Math.round,o=a(window.devicePixelRatio||1),s=80*o,c=48*o,l=3*o,u=2*o,d=3*o,f=15*o,p=74*o,m=30*o,h=document.createElement(`canvas`);h.width=s,h.height=c,h.style.cssText=`width:80px;height:48px`;var g=h.getContext(`2d`);return g.font=`bold `+9*o+`px Helvetica,Arial,sans-serif`,g.textBaseline=`top`,g.fillStyle=n,g.fillRect(0,0,s,c),g.fillStyle=t,g.fillText(e,l,u),g.fillRect(d,f,p,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d,f,p,m),{dom:h,update:function(c,_){r=Math.min(r,c),i=Math.max(i,c),g.fillStyle=n,g.globalAlpha=1,g.fillRect(0,0,s,f),g.fillStyle=t,g.fillText(a(c)+` `+e+` (`+a(r)+`-`+a(i)+`)`,l,u),g.drawImage(h,d+o,f,p-o,m,d,f,p-o,m),g.fillRect(d+p-o,f,o,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d+p-o,f,o,a((1-c/_)*m))}}},e})})),l=e(r());function u(e,t){typeof e==`function`?e(t):e!=null&&(e.current=t)}function d(e,t=[],n){let[r,i]=l.useState();return l.useLayoutEffect(()=>{let t=e();return i(t),u(n,t),()=>u(n,null)},t),r}var f=e(c());function p({showPanel:e=0,className:t,parent:n}){let r=d(()=>new f.default,[]);return l.useEffect(()=>{if(r){let i=n&&n.current||document.body;r.showPanel(e),i?.appendChild(r.dom);let s=(t??``).split(` `).filter(e=>e);s.length&&r.dom.classList.add(...s);let c=o(()=>r.begin()),l=a(()=>r.end());return()=>{s.length&&r.dom.classList.remove(...s),i?.removeChild(r.dom),c(),l()}}},[n,r,t,e]),null}var m=n(),h={StatsPanel:`_StatsPanel_10m5i_1`,AxisLabel:`_AxisLabel_10m5i_8`},g=i();function _(){let e=(0,m.c)(10),t=(0,l.useRef)(null),n;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=()=>{let e=t.current;e&&e.setColors(`rgb(153, 255, 0)`,`rgb(0, 153, 255)`,`rgb(255, 153, 0)`)},e[0]=n):n=e[0],(0,l.useEffect)(n);let r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,g.jsx)(p,{className:h.StatsPanel}),e[1]=r):r=e[1];let i;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(i=[70],e[2]=i):i=e[2];let a;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,g.jsx)(`axesHelper`,{ref:t,args:i,renderOrder:999,children:(0,g.jsx)(`lineBasicMaterial`,{depthTest:!1,depthWrite:!1,fog:!1,vertexColors:!0})}),e[3]=a):a=e[3];let o;e[4]===Symbol.for(`react.memo_cache_sentinel`)?(o=[80,0,0],e[4]=o):o=e[4];let c;e[5]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,g.jsx)(s,{position:o,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`y`,children:`Y`})}),e[5]=c):c=e[5];let u;e[6]===Symbol.for(`react.memo_cache_sentinel`)?(u=[0,80,0],e[6]=u):u=e[6];let d;e[7]===Symbol.for(`react.memo_cache_sentinel`)?(d=(0,g.jsx)(s,{position:u,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`z`,children:`Z`})}),e[7]=d):d=e[7];let f;e[8]===Symbol.for(`react.memo_cache_sentinel`)?(f=[0,0,80],e[8]=f):f=e[8];let _;return e[9]===Symbol.for(`react.memo_cache_sentinel`)?(_=(0,g.jsxs)(g.Fragment,{children:[r,a,c,d,(0,g.jsx)(s,{position:f,center:!0,children:(0,g.jsx)(`span`,{className:h.AxisLabel,"data-axis":`x`,children:`X`})})]}),e[9]=_):_=e[9],_}export{_ as DebugElements};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import"./traditional-BTL5qX2E.js";import"./engineStore-Dkm20jvr.js";import{C as i,D as a,E as o,S as s,T as c,u as l,w as u,x as d}from"./index-lyciGARn.js";import{n as f,t as p}from"./gr-1PcjgMj0.js";var m=t(),h=e(n(),1),g={Root:`_Root_1u60y_1`,PlayPause:`_PlayPause_1u60y_10`,Time:`_Time_1u60y_32`,Seek:`_Seek_1u60y_38`,Speed:`_Speed_1u60y_45`,CameraMode:`_CameraMode_1u60y_46`,Field:`_Field_1u60y_56`},_=r();function v(e){return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,`0`)}`}function y(){let e=(0,m.c)(42),t=o(),n=u(),r=s(),y=i(),x=a(),{play:S,pause:C,seek:w,setSpeed:T}=c(),E,D;e[0]!==n||e[1]!==C||e[2]!==S||e[3]!==t?(E=()=>{if(!t)return;let e=e=>{if(e.code!==`Space`)return;let t=e.target;t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`||t.tagName===`BUTTON`||t.isContentEditable||(e.preventDefault(),n?C():S())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},D=[t,n,S,C],e[0]=n,e[1]=C,e[2]=S,e[3]=t,e[4]=E,e[5]=D):(E=e[4],D=e[5]),(0,h.useEffect)(E,D);let O;e[6]!==T||e[7]!==x?(O=()=>{let e=d.indexOf(x);e>0&&T(d[e-1])},e[6]=T,e[7]=x,e[8]=O):O=e[8],l(`decreasePlaybackSpeed`,O);let k;e[9]!==T||e[10]!==x?(k=()=>{let e=d.indexOf(x);e<d.length-1&&T(d[e+1])},e[9]=T,e[10]=x,e[11]=k):k=e[11],l(`increasePlaybackSpeed`,k);let A;e[12]===w?A=e[13]:(A=e=>{w(parseFloat(e.target.value))},e[12]=w,e[13]=A);let j=A,M;e[14]===T?M=e[15]:(M=e=>{T(parseFloat(e.target.value))},e[14]=T,e[15]=M);let N=M;if(!t||!Number.isFinite(t.duration))return null;let P=n?C:S,F=n?`Pause`:`Play`,I;e[16]===n?I=e[17]:(I=n?(0,_.jsx)(p,{}):(0,_.jsx)(f,{}),e[16]=n,e[17]=I);let L;e[18]!==P||e[19]!==F||e[20]!==I?(L=(0,_.jsx)(`button`,{className:g.PlayPause,onClick:P,"aria-label":F,autoFocus:!0,children:I}),e[18]=P,e[19]=F,e[20]=I,e[21]=L):L=e[21];let R;e[22]===r?R=e[23]:(R=v(r),e[22]=r,e[23]=R);let z;e[24]===y?z=e[25]:(z=v(y),e[24]=y,e[25]=z);let B=`${R} / ${z}`,V;e[26]===B?V=e[27]:(V=(0,_.jsx)(`span`,{className:g.Time,children:B}),e[26]=B,e[27]=V);let H;e[28]!==r||e[29]!==y||e[30]!==j?(H=(0,_.jsx)(`input`,{className:g.Seek,type:`range`,min:0,max:y,step:.01,value:r,onChange:j}),e[28]=r,e[29]=y,e[30]=j,e[31]=H):H=e[31];let U;e[32]===Symbol.for(`react.memo_cache_sentinel`)?(U=(0,_.jsx)(`label`,{htmlFor:`playbackSpeed`,children:`Speed`}),e[32]=U):U=e[32];let W;e[33]===Symbol.for(`react.memo_cache_sentinel`)?(W=d.map(b),e[33]=W):W=e[33];let G;e[34]!==N||e[35]!==x?(G=(0,_.jsxs)(`div`,{className:g.Field,children:[U,(0,_.jsx)(`select`,{id:`playbackSpeed`,className:g.Speed,value:x,onChange:N,children:W})]}),e[34]=N,e[35]=x,e[36]=G):G=e[36];let K;return e[37]!==V||e[38]!==H||e[39]!==G||e[40]!==L?(K=(0,_.jsxs)(`div`,{className:g.Root,children:[L,V,H,G]}),e[37]=V,e[38]=H,e[39]=G,e[40]=L,e[41]=K):K=e[41],K}function b(e){return(0,_.jsxs)(`option`,{value:e,children:[e,`x`]},e)}export{y as DemoPlaybackControls};
|
||||
|
|
@ -1 +0,0 @@
|
|||
._Root_1u60y_1{z-index:2;align-items:center;gap:10px;padding:8px 12px;font-size:13px;display:flex}._PlayPause_1u60y_10{color:#fff;cursor:pointer;background:#03529399;border:1px solid #ffffff4d;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;font-size:11px;display:flex}@media (hover:hover){._PlayPause_1u60y_10:hover{background:#0062b3cc}}._Time_1u60y_32{font-variant-numeric:tabular-nums;white-space:nowrap;flex-shrink:0}._Seek_1u60y_38[type=range]{flex:1 0 20px;width:20px;min-width:20px;max-width:none}._Speed_1u60y_45,._CameraMode_1u60y_46{color:#fff;background:#0009;border:1px solid #ffffff4d;border-radius:3px;flex-shrink:0;padding:3px 4px;font-size:13px}._Field_1u60y_56{align-items:center;gap:8px;display:flex}._Field_1u60y_56 label{text-transform:uppercase;color:#fff9;font-size:11px;font-weight:500}
|
||||
1
docs/assets/DemoPlaybackControls-B8inlhPI.js
Normal file
1
docs/assets/DemoPlaybackControls-B8inlhPI.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{C as i,D as a,E as o,O as s,S as c,T as l,u,w as d}from"./index-B1XI52_L.js";import{n as f,t as p}from"./gr-1PcjgMj0.js";var m=t(),h=e(n(),1),g={Root:`_Root_1sc8r_1`,PlayPause:`_PlayPause_1sc8r_16 _Button_1u47f_2`,Time:`_Time_1sc8r_41`,Seek:`_Seek_1sc8r_59`,Speed:`_Speed_1sc8r_66`,CameraMode:`_CameraMode_1sc8r_67`,Field:`_Field_1sc8r_85`},_=r();function v(e){return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,`0`)}`}function y(){let e=(0,m.c)(42),t=a(),n=l(),r=i(),y=d(),x=s(),{play:S,pause:C,seek:w,setSpeed:T}=o(),E,D;e[0]!==n||e[1]!==C||e[2]!==S||e[3]!==t?(E=()=>{if(!t)return;let e=e=>{if(e.code!==`Space`)return;let t=e.target;t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`||t.tagName===`BUTTON`||t.isContentEditable||(e.preventDefault(),n?C():S())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},D=[t,n,S,C],e[0]=n,e[1]=C,e[2]=S,e[3]=t,e[4]=E,e[5]=D):(E=e[4],D=e[5]),(0,h.useEffect)(E,D);let O;e[6]!==T||e[7]!==x?(O=()=>{let e=c.indexOf(x);e>0&&T(c[e-1])},e[6]=T,e[7]=x,e[8]=O):O=e[8],u(`decreasePlaybackSpeed`,O);let k;e[9]!==T||e[10]!==x?(k=()=>{let e=c.indexOf(x);e<c.length-1&&T(c[e+1])},e[9]=T,e[10]=x,e[11]=k):k=e[11],u(`increasePlaybackSpeed`,k);let A;e[12]===w?A=e[13]:(A=e=>{w(parseFloat(e.target.value))},e[12]=w,e[13]=A);let j=A,M;e[14]===T?M=e[15]:(M=e=>{T(parseFloat(e.target.value))},e[14]=T,e[15]=M);let N=M;if(!t||!Number.isFinite(t.duration))return null;let P=n?C:S,F=n?`Pause`:`Play`,I;e[16]===n?I=e[17]:(I=n?(0,_.jsx)(p,{}):(0,_.jsx)(f,{}),e[16]=n,e[17]=I);let L;e[18]!==P||e[19]!==F||e[20]!==I?(L=(0,_.jsx)(`button`,{className:g.PlayPause,onClick:P,"aria-label":F,autoFocus:!0,children:I}),e[18]=P,e[19]=F,e[20]=I,e[21]=L):L=e[21];let R;e[22]===r?R=e[23]:(R=v(r),e[22]=r,e[23]=R);let z;e[24]===y?z=e[25]:(z=v(y),e[24]=y,e[25]=z);let B=`${R} / ${z}`,V;e[26]===B?V=e[27]:(V=(0,_.jsx)(`span`,{className:g.Time,children:B}),e[26]=B,e[27]=V);let H;e[28]!==r||e[29]!==y||e[30]!==j?(H=(0,_.jsx)(`input`,{className:g.Seek,type:`range`,min:0,max:y,step:.01,value:r,onChange:j}),e[28]=r,e[29]=y,e[30]=j,e[31]=H):H=e[31];let U;e[32]===Symbol.for(`react.memo_cache_sentinel`)?(U=(0,_.jsx)(`label`,{htmlFor:`playbackSpeed`,children:`Speed`}),e[32]=U):U=e[32];let W;e[33]===Symbol.for(`react.memo_cache_sentinel`)?(W=c.map(b),e[33]=W):W=e[33];let G;e[34]!==N||e[35]!==x?(G=(0,_.jsxs)(`div`,{className:g.Field,children:[U,(0,_.jsx)(`select`,{id:`playbackSpeed`,className:g.Speed,value:x,onChange:N,children:W})]}),e[34]=N,e[35]=x,e[36]=G):G=e[36];let K;return e[37]!==V||e[38]!==H||e[39]!==G||e[40]!==L?(K=(0,_.jsxs)(`div`,{className:g.Root,children:[L,V,H,G]}),e[37]=V,e[38]=H,e[39]=G,e[40]=L,e[41]=K):K=e[41],K}function b(e){return(0,_.jsxs)(`option`,{value:e,children:[e,`x`]},e)}export{y as DemoPlaybackControls};
|
||||
1
docs/assets/DemoPlaybackControls-V-lirz3V.css
Normal file
1
docs/assets/DemoPlaybackControls-V-lirz3V.css
Normal file
|
|
@ -0,0 +1 @@
|
|||
@layer button{._Button_1u47f_2{color:#fff;cursor:pointer;background:#0062b3cc;border:1px solid #fff6;border-radius:5px;flex:auto;justify-content:center;align-items:center;gap:8px;width:auto;min-width:28px;height:auto;min-height:32px;margin:0;padding:4px 8px;font-family:inherit;font-size:18px;font-weight:500;transition:background .2s,border-color .2s;display:flex;position:relative;transform:translate(0);box-shadow:0 1px 2px #0006}._Button_1u47f_2 svg{opacity:.8;pointer-events:none;flex:none;transition:opacity .2s}._Button_1u47f_2:disabled{opacity:.6;color:#fffc;cursor:default;box-shadow:inset 0 0 12px 1px #36363680}@media (hover:hover){._Button_1u47f_2{background:#03529399;border:1px solid #c8c8c84d;border-color:#ffffff4d #c8c8c84d #c8c8c84d #ffffff4d}._Button_1u47f_2:not(:disabled):hover{background:#0062b3cc;border-color:#fff6}._Button_1u47f_2 svg{opacity:.6}._Button_1u47f_2:not(:disabled):hover svg{opacity:1}}._Button_1u47f_2:not(:disabled):active,._Button_1u47f_2[aria-expanded=true]{background:#0062b3b3;border-color:#ffffff4d;transform:translateY(1px)}._Button_1u47f_2[data-active=true]{background:#0075d5e6;border-color:#fff6}._ButtonLabel_1u47f_82{font-size:14px}._ButtonHint_1u47f_86{opacity:.7;font-size:10px}._ButtonGroup_1u47f_91{flex:1 0 auto;align-items:stretch;width:100%;display:flex}._ButtonGroup_1u47f_91 ._Button_1u47f_2{background:#1b4f87b3;flex-direction:column;flex:1 0 0;gap:1px;padding-top:8px;padding-bottom:8px;font-size:22px;box-shadow:inset 0 0 10px #04284780}._ButtonGroup_1u47f_91 ._Button_1u47f_2 svg{margin-bottom:3px}._ButtonGroup_1u47f_91 ._Button_1u47f_2[data-active=true]{background:#0065cbcc;box-shadow:inset 0 2px 3px #08bdff80,inset 0 -2px 6px #00122880}._ButtonGroup_1u47f_91 ._Button_1u47f_2[data-active=true] svg{opacity:1}._ButtonGroup_1u47f_91 ._Button_1u47f_2:not(:first-child){border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}._ButtonGroup_1u47f_91 ._Button_1u47f_2:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}._DestructiveActionButton_1u47f_135{background:#d5423ab3;flex:none;min-width:28px;min-height:28px;margin:0 10px 0 0;padding:2px;font-size:16px}@media (hover:hover){._DestructiveActionButton_1u47f_135:not(:disabled):hover{background:#e5463be6}}@media (pointer:coarse){._DestructiveActionButton_1u47f_135{min-width:36px;min-height:36px;margin-right:6px;font-size:20px}}}._Root_1sc8r_1{z-index:2;align-items:center;gap:10px;padding:8px 10px;font-size:13px;display:flex}@media (pointer:coarse){._Root_1sc8r_1{padding:6px 8px}}._PlayPause_1sc8r_16{flex:none;justify-content:center;align-items:center;width:36px;height:36px;padding:0;font-size:12px;display:flex}@media (pointer:coarse){._PlayPause_1sc8r_16{width:40px;height:40px;font-size:14px}}._Time_1sc8r_41{font-variant-numeric:tabular-nums;white-space:nowrap;flex-shrink:0}@media (width<=599px){._Time_1sc8r_41{font-size:12px}}@media (width<=399px){._Time_1sc8r_41{font-size:11px}}._Seek_1sc8r_59[type=range]{flex:1 0 20px;width:20px;min-width:20px;max-width:none}._Speed_1sc8r_66,._CameraMode_1sc8r_67{color:#fff;background:#0009;border:1px solid #ffffff4d;border-radius:3px;flex-shrink:0;padding:3px 4px;font-size:13px}@media (pointer:coarse){._Speed_1sc8r_66,._CameraMode_1sc8r_67{padding:8px;font-size:14px}}._Field_1sc8r_85{align-items:center;gap:8px;display:flex}._Field_1sc8r_85 label{text-transform:uppercase;color:#fff9;font-size:11px;font-weight:500}
|
||||
|
|
@ -1 +1 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CgPHUpXo.js";import{Ut as a}from"./three.module-07hRbor4.js";import{t as o}from"./Html-C0zmSr0g.js";var s={Label:`_Label_8rn2m_1`},c=t(),l=e(n(),1),u=r(),d=[0,0,0],f=new a;function p(e,t,n,r){let i=e.matrixWorld.elements;return(t-i[12])*-i[8]+(n-i[13])*-i[9]+(r-i[14])*-i[10]<0}var m=(0,l.memo)(function(e){let t=(0,c.c)(12),{children:n,color:r,position:a,opacity:m}=e,h=r===void 0?`white`:r,g=a===void 0?d:a,_=m===void 0?`fadeWithDistance`:m,v=_===`fadeWithDistance`,y=(0,l.useRef)(null),[b,x]=(0,l.useState)(_!==0),S=(0,l.useRef)(null),C;t[0]!==v||t[1]!==b||t[2]!==_?(C=e=>{let{camera:t}=e,n=y.current;if(!n)return;n.getWorldPosition(f);let r=p(t,f.x,f.y,f.z);if(v){let e=r?1/0:t.position.distanceTo(f),n=e<200;if(b!==n&&x(n),S.current&&n){let t=Math.max(0,Math.min(1,1-e/200));S.current.style.opacity=t.toString()}}else{let e=!r&&_!==0;b!==e&&x(e),S.current&&(S.current.style.opacity=_.toString())}},t[0]=v,t[1]=b,t[2]=_,t[3]=C):C=t[3],i(C);let w;t[4]!==n||t[5]!==h||t[6]!==v||t[7]!==b||t[8]!==g?(w=b?(0,u.jsx)(o,{position:g,center:!0,children:(0,u.jsx)(`div`,{ref:S,className:s.Label,style:{color:h,opacity:v?0:void 0},children:n})}):null,t[4]=n,t[5]=h,t[6]=v,t[7]=b,t[8]=g,t[9]=w):w=t[9];let T;return t[10]===w?T=t[11]:(T=(0,u.jsx)(`group`,{ref:y,children:w}),t[10]=w,t[11]=T),T});export{m as t};
|
||||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CgPHUpXo.js";import{Ut as a}from"./three.module-07hRbor4.js";import{t as o}from"./Html-BfjRWIZg.js";var s={Label:`_Label_8rn2m_1`},c=t(),l=e(n(),1),u=r(),d=[0,0,0],f=new a;function p(e,t,n,r){let i=e.matrixWorld.elements;return(t-i[12])*-i[8]+(n-i[13])*-i[9]+(r-i[14])*-i[10]<0}var m=(0,l.memo)(function(e){let t=(0,c.c)(12),{children:n,color:r,position:a,opacity:m}=e,h=r===void 0?`white`:r,g=a===void 0?d:a,_=m===void 0?`fadeWithDistance`:m,v=_===`fadeWithDistance`,y=(0,l.useRef)(null),[b,x]=(0,l.useState)(_!==0),S=(0,l.useRef)(null),C;t[0]!==v||t[1]!==b||t[2]!==_?(C=e=>{let{camera:t}=e,n=y.current;if(!n)return;n.getWorldPosition(f);let r=p(t,f.x,f.y,f.z);if(v){let e=r?1/0:t.position.distanceTo(f),n=e<200;if(b!==n&&x(n),S.current&&n){let t=Math.max(0,Math.min(1,1-e/200));S.current.style.opacity=t.toString()}}else{let e=!r&&_!==0;b!==e&&x(e),S.current&&(S.current.style.opacity=_.toString())}},t[0]=v,t[1]=b,t[2]=_,t[3]=C):C=t[3],i(C);let w;t[4]!==n||t[5]!==h||t[6]!==v||t[7]!==b||t[8]!==g?(w=b?(0,u.jsx)(o,{position:g,center:!0,children:(0,u.jsx)(`div`,{ref:S,className:s.Label,style:{color:h,opacity:v?0:void 0},children:n})}):null,t[4]=n,t[5]=h,t[6]=v,t[7]=b,t[8]=g,t[9]=w):w=t[9];let T;return t[10]===w?T=t[11]:(T=(0,u.jsx)(`group`,{ref:y,children:w}),t[10]=w,t[11]=T),T});export{m as t};
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CgPHUpXo.js";import{a}from"./SettingsProvider-CCHVZuSg.js";import"./logger-z_EpIdIa.js";import"./traditional-BTL5qX2E.js";import{At as o,Dt as s,Ht as c,b as l,p as u}from"./three.module-07hRbor4.js";import"./mission-D8vr00S1.js";import{p as d}from"./loaders-VxR5Bl13.js";import{t as f}from"./Texture-CIsc25mc.js";import{t as p}from"./DebugSuspense-Dk4MzcWf.js";var m=t(),h=e(n(),1),g=`
|
||||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CgPHUpXo.js";import{a}from"./SettingsProvider-CCHVZuSg.js";import{At as o,Dt as s,Ht as c,b as l,p as u}from"./three.module-07hRbor4.js";import{p as d}from"./loaders-CIpiZadQ.js";import{t as f}from"./Texture-CIsc25mc.js";import{t as p}from"./DebugSuspense-Dk4MzcWf.js";var m=t(),h=e(n(),1),g=`
|
||||
#include <fog_pars_vertex>
|
||||
|
||||
varying vec2 vUv;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
docs/assets/KeyboardOverlay-D875z9z7.js
Normal file
1
docs/assets/KeyboardOverlay-D875z9z7.js
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -1,5 +1,5 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{t as i}from"./useQuery-CTkgxob_.js";import{c as a}from"./manifest-CirqV3Ls.js";import"./logger-z_EpIdIa.js";import"./mission-D8vr00S1.js";import{H as o,U as s}from"./index-lyciGARn.js";import{i as c,l,n as u}from"./loaders-VxR5Bl13.js";var d=t(),f=e(n(),1),p={GuiMarkup:`_GuiMarkup_jg4va_1`,Bullet:`_Bullet_jg4va_12`},m=r(),h=new Set([`spop`,`spush`,`lmargin`,`font`,`color`,`bitmap`,`a`,`/a`]);function g(e){return e.split(/<([^><]+)>/g).map((e,t)=>{if(t%2==0)return e?{type:`text`,value:e}:null;{let[t,...n]=e.split(`:`);return h.has(t.toLowerCase())?{type:`tag`,name:t,args:n}:{type:`text`,value:`<${e}>`}}}).filter(e=>e!=null)}function _(e){let[t,n]=e;return{fontDescription:t,fontSize:n?Math.max(11,Math.min(parseInt(n.trim(),10),16)):void 0}}function v(e){let t=g(e),n={type:`span`,source:`root`,style:{},children:[]},r=n,i=[r],a=e=>e.children!=null&&e.children.some(e=>typeof e==`string`||a(e));for(let e of t)switch(e.type){case`text`:r.children.push(e.value);break;case`tag`:switch(e.name){case`spush`:{let e={type:`span`,source:`spush`,style:{},children:[]};r.children.push(e),r=e,i.push(r);break}case`spop`:if(r.source!==`root`){let e=i.pop();for(;e.source!==`spush`;)e=i.pop();r=i[i.length-1]}break;case`lmargin`:break;case`font`:{let t=_(e.args).fontSize;if(!a(r))r.style.fontSize=t;else{let e={type:`span`,source:`spush`,style:{fontSize:t},children:[]};r.children.push(e),r=e,i.push(r)}break}case`color`:if(!a(r))r.style.color=`#${e.args[0].trim()}`;else{let t={type:`span`,source:`spush`,style:{color:`#${e.args[0].trim()}`},children:[]};r.children.push(t),r=t,i.push(r)}break;case`bitmap`:{let t={type:`bitmap`,value:e.args[0]};r.children.push(t);break}case`a`:{let t=e.args[0].trim().split(` `),n={type:`a`,source:`a`,value:`http://${t.length===2&&t[0]===`wwwlink`?t[1]:t[0]}`,style:{},children:[]};r.children.push(n),r=n,i.push(r);break}case`/a`:{let e=i.pop();for(;e.source!==`a`;)e=i.pop();r=i[i.length-1];break}}}return y(n)}function y(e){switch(e.type){case`span`:return f.createElement(`span`,{style:Object.keys(e.style).length===0?void 0:e.style},...e.children.map(e=>typeof e==`string`?e:y(e)));case`a`:return f.createElement(`a`,{href:e.value,style:Object.keys(e.style).length===0?void 0:e.style,rel:`noopener noreferrer`,target:`_blank`},...e.children.map(e=>typeof e==`string`?e:y(e)));case`bitmap`:return(0,m.jsx)(S,{name:e.value})}}var b=new Map;function x(e){if(b.has(e))return b.get(e);let t;try{t=c(a(`textures/gui/${e}`))}catch{t=null}return b.set(e,t),t}function S(e){let t=(0,d.c)(5),{name:n}=e,r;t[0]===n?r=t[1]:(r=x(n),t[0]=n,t[1]=r);let i=r;if(i){let e;return t[2]===i?e=t[3]:(e=(0,m.jsx)(`img`,{src:i,alt:``,className:p.Bitmap}),t[2]=i,t[3]=e),e}if(/bullet/i.test(n)){let e;return t[4]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,m.jsx)(`span`,{className:p.Bullet,children:`•`}),t[4]=e):e=t[4],e}return null}var C=/<(?:font|color|bitmap|just|lmargin|a):/i;function w(e){return C.test(e)}function T(e,t){let n=t.toUpperCase();return e.split(`
|
||||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{t as i}from"./useQuery-FY4YqwDi.js";import{c as a}from"./manifest-CirqV3Ls.js";import{U as o,W as s}from"./index-B1XI52_L.js";import{i as c,l,n as u}from"./loaders-CIpiZadQ.js";var d=t(),f=e(n(),1),p={GuiMarkup:`_GuiMarkup_jg4va_1`,Bullet:`_Bullet_jg4va_12`},m=r(),h=new Set([`spop`,`spush`,`lmargin`,`font`,`color`,`bitmap`,`a`,`/a`]);function g(e){return e.split(/<([^><]+)>/g).map((e,t)=>{if(t%2==0)return e?{type:`text`,value:e}:null;{let[t,...n]=e.split(`:`);return h.has(t.toLowerCase())?{type:`tag`,name:t,args:n}:{type:`text`,value:`<${e}>`}}}).filter(e=>e!=null)}function _(e){let[t,n]=e;return{fontDescription:t,fontSize:n?Math.max(11,Math.min(parseInt(n.trim(),10),16)):void 0}}function v(e){let t=g(e),n={type:`span`,source:`root`,style:{},children:[]},r=n,i=[r],a=e=>e.children!=null&&e.children.some(e=>typeof e==`string`||a(e));for(let e of t)switch(e.type){case`text`:r.children.push(e.value);break;case`tag`:switch(e.name){case`spush`:{let e={type:`span`,source:`spush`,style:{},children:[]};r.children.push(e),r=e,i.push(r);break}case`spop`:if(r.source!==`root`){let e=i.pop();for(;e.source!==`spush`;)e=i.pop();r=i[i.length-1]}break;case`lmargin`:break;case`font`:{let t=_(e.args).fontSize;if(!a(r))r.style.fontSize=t;else{let e={type:`span`,source:`spush`,style:{fontSize:t},children:[]};r.children.push(e),r=e,i.push(r)}break}case`color`:if(!a(r))r.style.color=`#${e.args[0].trim()}`;else{let t={type:`span`,source:`spush`,style:{color:`#${e.args[0].trim()}`},children:[]};r.children.push(t),r=t,i.push(r)}break;case`bitmap`:{let t={type:`bitmap`,value:e.args[0]};r.children.push(t);break}case`a`:{let t=e.args[0].trim().split(` `),n={type:`a`,source:`a`,value:`http://${t.length===2&&t[0]===`wwwlink`?t[1]:t[0]}`,style:{},children:[]};r.children.push(n),r=n,i.push(r);break}case`/a`:{let e=i.pop();for(;e.source!==`a`;)e=i.pop();r=i[i.length-1];break}}}return y(n)}function y(e){switch(e.type){case`span`:return f.createElement(`span`,{style:Object.keys(e.style).length===0?void 0:e.style},...e.children.map(e=>typeof e==`string`?e:y(e)));case`a`:return f.createElement(`a`,{href:e.value,style:Object.keys(e.style).length===0?void 0:e.style,rel:`noopener noreferrer`,target:`_blank`},...e.children.map(e=>typeof e==`string`?e:y(e)));case`bitmap`:return(0,m.jsx)(S,{name:e.value})}}var b=new Map;function x(e){if(b.has(e))return b.get(e);let t;try{t=c(a(`textures/gui/${e}`))}catch{t=null}return b.set(e,t),t}function S(e){let t=(0,d.c)(5),{name:n}=e,r;t[0]===n?r=t[1]:(r=x(n),t[0]=n,t[1]=r);let i=r;if(i){let e;return t[2]===i?e=t[3]:(e=(0,m.jsx)(`img`,{src:i,alt:``,className:p.Bitmap}),t[2]=i,t[3]=e),e}if(/bullet/i.test(n)){let e;return t[4]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,m.jsx)(`span`,{className:p.Bullet,children:`•`}),t[4]=e):e=t[4],e}return null}var C=/<(?:font|color|bitmap|just|lmargin|a):/i;function w(e){return C.test(e)}function T(e,t){let n=t.toUpperCase();return e.split(`
|
||||
`).flatMap(e=>{let t=e.match(/^\[([^\]]+)\]/);return t&&!t[1].toUpperCase().split(/\s+/).includes(n)?[]:[e.replace(/^\[[^\]]+\]/,``)]}).join(`
|
||||
`)}function E(e){let t=(0,d.c)(4),{markup:n}=e,r;t[0]===n?r=t[1]:(r=v(n),t[0]=n,t[1]=r);let i=r,a;return t[2]===i?a=t[3]:(a=(0,m.jsx)(`div`,{className:p.GuiMarkup,children:i}),t[2]=i,t[3]=a),a}var D={Dialog:`_Dialog_tbn5d_1 _Dialog_6c89x_1`,Overlay:`_Overlay_tbn5d_10 _Overlay_6c89x_20`,Body:`_Body_tbn5d_14`,Left:`_Left_tbn5d_22`,PreviewImage:`_PreviewImage_tbn5d_29`,PreviewImageFloating:`_PreviewImageFloating_tbn5d_35`,Title:`_Title_tbn5d_45`,MapMeta:`_MapMeta_tbn5d_53`,MapPlanet:`_MapPlanet_tbn5d_63`,MapQuote:`_MapQuote_tbn5d_67`,MapBlurb:`_MapBlurb_tbn5d_86`,Section:`_Section_tbn5d_91`,SectionTitle:`_SectionTitle_tbn5d_95`,MusicTrack:`_MusicTrack_tbn5d_105`,MusicButton:`_MusicButton_tbn5d_119`,Footer:`_Footer_tbn5d_146`,CloseButton:`_CloseButton_tbn5d_158 _DialogButton_6c89x_31`,Hint:`_Hint_tbn5d_162`,MusicTrackName:`_MusicTrackName_tbn5d_168`};function ee(e){let t=(0,d.c)(2),n;return t[0]===e?n=t[1]:(n={queryKey:[`parsedMission`,e],queryFn:()=>l(e)},t[0]=e,t[1]=n),i(n)}function te(e){for(let t of e.body){if(t.type!==`ObjectDeclaration`)continue;let{instanceName:e,body:n}=t;if(e&&e.type===`Identifier`&&e.name.toLowerCase()===`missiongroup`){let e={};for(let t of n){if(t.type!==`Assignment`)continue;let{target:n,value:r}=t;n.type===`Identifier`&&r.type===`StringLiteral`&&(e[n.name.toLowerCase()]=r.value)}return e}}return{}}function ne(e,t){if(e)try{return c(a(`textures/gui/${e}`))}catch{}try{return c(a(`textures/gui/Load_${t}`))}catch{}return null}function re(e){let t=(0,d.c)(7),{src:n,alt:r,className:i}=e,a=i===void 0?D.PreviewImage:i,[o,s]=(0,f.useState)(null),c,l;if(t[0]===n?(c=t[1],l=t[2]):(c=()=>{let e=!1,t;return fetch(n).then(j).then(A).then(k).then(n=>{e||!n||(t=URL.createObjectURL(n),s(t))}).catch(O),()=>{e=!0,t&&URL.revokeObjectURL(t)}},l=[n],t[0]=n,t[1]=c,t[2]=l),(0,f.useEffect)(c,l),!o)return null;let u;return t[3]!==r||t[4]!==a||t[5]!==o?(u=(0,m.jsx)(`img`,{src:o,alt:r,className:a}),t[3]=r,t[4]=a,t[5]=o,t[6]=u):u=t[6],u}function O(){}function k(e){return new Promise(t=>{let n=document.createElement(`canvas`);n.width=e.width,n.height=e.height,n.getContext(`2d`)?.drawImage(e,0,0),e.close(),n.toBlob(t)})}function A(e){return createImageBitmap(e,{colorSpaceConversion:`none`})}function j(e){return e.blob()}function ie(e){let t=(0,d.c)(22),{track:n}=e,[r,i]=(0,f.useState)(!1),[a,c]=(0,f.useState)(!0),l=(0,f.useRef)(null),p;t[0]===n?p=t[1]:(p=n.toLowerCase(),t[0]=n,t[1]=p);let h=`${u}music/${p}.mp3`,g,_;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g=()=>{let e=l.current;if(e)return()=>{e.pause()}},_=[],t[2]=g,t[3]=_):(g=t[2],_=t[3]),(0,f.useEffect)(g,_);let v;t[4]===r?v=t[5]:(v=()=>{let e=l.current;e&&(r?e.pause():e.play().catch(()=>c(!1)))},t[4]=r,t[5]=v);let y=v,b,x,S;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(b=()=>i(!0),x=()=>i(!1),S=()=>c(!1),t[6]=b,t[7]=x,t[8]=S):(b=t[6],x=t[7],S=t[8]);let C;t[9]===h?C=t[10]:(C=(0,m.jsx)(`audio`,{ref:l,src:h,loop:!0,onPlay:b,onPause:x,onError:S}),t[9]=h,t[10]=C);let w;t[11]===n?w=t[12]:(w=(0,m.jsx)(`span`,{className:D.MusicTrackName,children:n}),t[11]=n,t[12]=w);let T;t[13]!==a||t[14]!==r||t[15]!==y?(T=a&&(0,m.jsx)(`button`,{className:D.MusicButton,onClick:y,"aria-label":r?`Pause music`:`Play music`,children:r?(0,m.jsx)(s,{}):(0,m.jsx)(o,{})}),t[13]=a,t[14]=r,t[15]=y,t[16]=T):T=t[16];let E;return t[17]!==r||t[18]!==T||t[19]!==C||t[20]!==w?(E=(0,m.jsxs)(`div`,{className:D.MusicTrack,"data-playing":r,children:[C,w,T]}),t[17]=r,t[18]=T,t[19]=C,t[20]=w,t[21]=E):E=t[21],E}function M(e){let t=(0,d.c)(100),{onClose:n,missionName:r,missionType:i}=e,{data:a}=ee(r),o=(0,f.useRef)(null),s,c;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(s=()=>{o.current?.focus();try{document.exitPointerLock()}catch{}},c=[],t[0]=s,t[1]=c):(s=t[0],c=t[1]),(0,f.useEffect)(s,c);let l,u;t[2]===n?(l=t[3],u=t[4]):(l=()=>{let e=e=>{if(e.key===`Escape`)n();else if(e.key===`k`&&(e.metaKey||e.ctrlKey)){n();return}e.stopImmediatePropagation()},t=se;return window.addEventListener(`keydown`,e,{capture:!0}),window.addEventListener(`keyup`,t,{capture:!0}),()=>{window.removeEventListener(`keydown`,e,{capture:!0}),window.removeEventListener(`keyup`,t,{capture:!0})}},u=[n],t[2]=n,t[3]=l,t[4]=u),(0,f.useEffect)(l,u);let p;t[5]===a?p=t[6]:(p=a?te(a.ast):{},t[5]=a,t[6]=p);let h=p,g;t[7]!==r||t[8]!==a?(g=a?ne(a.bitmap,r):null,t[7]=r,t[8]=a,t[9]=g):g=t[9];let _=g,v=a?.displayName??r,y;t[10]===i?y=t[11]:(y=i.toLowerCase(),t[10]=i,t[11]=y);let b=y===`singleplayer`,x=h.musictrack,S,C,O,k,A,j,M,N,P,F,I,L,R,z,B,V,H,U;if(t[12]!==_||t[13]!==v||t[14]!==b||t[15]!==i||t[16]!==n||t[17]!==a){let e=a?.missionString?T(a.missionString,i):null,r,s,c,l;if(t[36]!==a?.missionQuote){if(l=a?.missionQuote?.trim()??``,s=w(l),c=``,r=``,!s)for(let e of l.split(`
|
||||
`)}function E(e){let t=(0,d.c)(4),{markup:n}=e,r;t[0]===n?r=t[1]:(r=v(n),t[0]=n,t[1]=r);let i=r,a;return t[2]===i?a=t[3]:(a=(0,m.jsx)(`div`,{className:p.GuiMarkup,children:i}),t[2]=i,t[3]=a),a}var D={Dialog:`_Dialog_tbn5d_1 _Dialog_1t9wa_1`,Overlay:`_Overlay_tbn5d_10 _Overlay_1t9wa_22`,Body:`_Body_tbn5d_14`,Left:`_Left_tbn5d_22`,PreviewImage:`_PreviewImage_tbn5d_29`,PreviewImageFloating:`_PreviewImageFloating_tbn5d_35`,Title:`_Title_tbn5d_45`,MapMeta:`_MapMeta_tbn5d_53`,MapPlanet:`_MapPlanet_tbn5d_63`,MapQuote:`_MapQuote_tbn5d_67`,MapBlurb:`_MapBlurb_tbn5d_86`,Section:`_Section_tbn5d_91`,SectionTitle:`_SectionTitle_tbn5d_95`,MusicTrack:`_MusicTrack_tbn5d_105`,MusicButton:`_MusicButton_tbn5d_119`,Footer:`_Footer_tbn5d_146`,CloseButton:`_CloseButton_tbn5d_158 _DialogButton_1t9wa_33`,Hint:`_Hint_tbn5d_162`,MusicTrackName:`_MusicTrackName_tbn5d_168`};function ee(e){let t=(0,d.c)(2),n;return t[0]===e?n=t[1]:(n={queryKey:[`parsedMission`,e],queryFn:()=>l(e)},t[0]=e,t[1]=n),i(n)}function te(e){for(let t of e.body){if(t.type!==`ObjectDeclaration`)continue;let{instanceName:e,body:n}=t;if(e&&e.type===`Identifier`&&e.name.toLowerCase()===`missiongroup`){let e={};for(let t of n){if(t.type!==`Assignment`)continue;let{target:n,value:r}=t;n.type===`Identifier`&&r.type===`StringLiteral`&&(e[n.name.toLowerCase()]=r.value)}return e}}return{}}function ne(e,t){if(e)try{return c(a(`textures/gui/${e}`))}catch{}try{return c(a(`textures/gui/Load_${t}`))}catch{}return null}function re(e){let t=(0,d.c)(7),{src:n,alt:r,className:i}=e,a=i===void 0?D.PreviewImage:i,[o,s]=(0,f.useState)(null),c,l;if(t[0]===n?(c=t[1],l=t[2]):(c=()=>{let e=!1,t;return fetch(n).then(j).then(A).then(k).then(n=>{e||!n||(t=URL.createObjectURL(n),s(t))}).catch(O),()=>{e=!0,t&&URL.revokeObjectURL(t)}},l=[n],t[0]=n,t[1]=c,t[2]=l),(0,f.useEffect)(c,l),!o)return null;let u;return t[3]!==r||t[4]!==a||t[5]!==o?(u=(0,m.jsx)(`img`,{src:o,alt:r,className:a}),t[3]=r,t[4]=a,t[5]=o,t[6]=u):u=t[6],u}function O(){}function k(e){return new Promise(t=>{let n=document.createElement(`canvas`);n.width=e.width,n.height=e.height,n.getContext(`2d`)?.drawImage(e,0,0),e.close(),n.toBlob(t)})}function A(e){return createImageBitmap(e,{colorSpaceConversion:`none`})}function j(e){return e.blob()}function ie(e){let t=(0,d.c)(22),{track:n}=e,[r,i]=(0,f.useState)(!1),[a,c]=(0,f.useState)(!0),l=(0,f.useRef)(null),p;t[0]===n?p=t[1]:(p=n.toLowerCase(),t[0]=n,t[1]=p);let h=`${u}music/${p}.mp3`,g,_;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g=()=>{let e=l.current;if(e)return()=>{e.pause()}},_=[],t[2]=g,t[3]=_):(g=t[2],_=t[3]),(0,f.useEffect)(g,_);let v;t[4]===r?v=t[5]:(v=()=>{let e=l.current;e&&(r?e.pause():e.play().catch(()=>c(!1)))},t[4]=r,t[5]=v);let y=v,b,x,S;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(b=()=>i(!0),x=()=>i(!1),S=()=>c(!1),t[6]=b,t[7]=x,t[8]=S):(b=t[6],x=t[7],S=t[8]);let C;t[9]===h?C=t[10]:(C=(0,m.jsx)(`audio`,{ref:l,src:h,loop:!0,onPlay:b,onPause:x,onError:S}),t[9]=h,t[10]=C);let w;t[11]===n?w=t[12]:(w=(0,m.jsx)(`span`,{className:D.MusicTrackName,children:n}),t[11]=n,t[12]=w);let T;t[13]!==a||t[14]!==r||t[15]!==y?(T=a&&(0,m.jsx)(`button`,{className:D.MusicButton,onClick:y,"aria-label":r?`Pause music`:`Play music`,children:r?(0,m.jsx)(s,{}):(0,m.jsx)(o,{})}),t[13]=a,t[14]=r,t[15]=y,t[16]=T):T=t[16];let E;return t[17]!==r||t[18]!==T||t[19]!==C||t[20]!==w?(E=(0,m.jsxs)(`div`,{className:D.MusicTrack,"data-playing":r,children:[C,w,T]}),t[17]=r,t[18]=T,t[19]=C,t[20]=w,t[21]=E):E=t[21],E}function M(e){let t=(0,d.c)(100),{onClose:n,missionName:r,missionType:i}=e,{data:a}=ee(r),o=(0,f.useRef)(null),s,c;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(s=()=>{o.current?.focus();try{document.exitPointerLock()}catch{}},c=[],t[0]=s,t[1]=c):(s=t[0],c=t[1]),(0,f.useEffect)(s,c);let l,u;t[2]===n?(l=t[3],u=t[4]):(l=()=>{let e=e=>{if(e.key===`Escape`)n();else if(e.key===`k`&&(e.metaKey||e.ctrlKey)){n();return}e.stopImmediatePropagation()},t=se;return window.addEventListener(`keydown`,e,{capture:!0}),window.addEventListener(`keyup`,t,{capture:!0}),()=>{window.removeEventListener(`keydown`,e,{capture:!0}),window.removeEventListener(`keyup`,t,{capture:!0})}},u=[n],t[2]=n,t[3]=l,t[4]=u),(0,f.useEffect)(l,u);let p;t[5]===a?p=t[6]:(p=a?te(a.ast):{},t[5]=a,t[6]=p);let h=p,g;t[7]!==r||t[8]!==a?(g=a?ne(a.bitmap,r):null,t[7]=r,t[8]=a,t[9]=g):g=t[9];let _=g,v=a?.displayName??r,y;t[10]===i?y=t[11]:(y=i.toLowerCase(),t[10]=i,t[11]=y);let b=y===`singleplayer`,x=h.musictrack,S,C,O,k,A,j,M,N,P,F,I,L,R,z,B,V,H,U;if(t[12]!==_||t[13]!==v||t[14]!==b||t[15]!==i||t[16]!==n||t[17]!==a){let e=a?.missionString?T(a.missionString,i):null,r,s,c,l;if(t[36]!==a?.missionQuote){if(l=a?.missionQuote?.trim()??``,s=w(l),c=``,r=``,!s)for(let e of l.split(`
|
||||
`)){let t=e.trim();t.match(/^--[^-]/)?r=t.replace(/^-+\s*/,``).trim():t&&(c+=(c?`
|
||||
`:``)+t)}t[36]=a?.missionQuote,t[37]=r,t[38]=s,t[39]=c,t[40]=l}else r=t[37],s=t[38],c=t[39],l=t[40];B=D.Overlay,V=n,M=o,N=D.Dialog,P=oe,F=ae,I=`dialog`,L=`true`,R=`Map Information`,z=-1,j=D.Body,H=D.Left,t[41]!==_||t[42]!==v||t[43]!==b?(U=_&&b&&(0,m.jsx)(re,{className:D.PreviewImageFloating,src:_,alt:`${v} preview`},_),t[41]=_,t[42]=v,t[43]=b,t[44]=U):U=t[44],t[45]===v?S=t[46]:(S=(0,m.jsx)(`h1`,{className:D.Title,children:v}),t[45]=v,t[46]=S);let u;t[47]===a?u=t[48]:(u=a?.planetName&&(0,m.jsx)(`span`,{className:D.MapPlanet,children:a.planetName}),t[47]=a,t[48]=u),t[49]===u?C=t[50]:(C=(0,m.jsx)(`div`,{className:D.MapMeta,children:u}),t[49]=u,t[50]=C),t[51]!==r||t[52]!==s||t[53]!==c||t[54]!==l?(O=s?(0,m.jsx)(`blockquote`,{className:D.MapQuote,children:(0,m.jsx)(E,{markup:l})}):c?(0,m.jsxs)(`blockquote`,{className:D.MapQuote,children:[(0,m.jsx)(`p`,{children:c}),r&&(0,m.jsxs)(`cite`,{children:[`— `,r]})]}):null,t[51]=r,t[52]=s,t[53]=c,t[54]=l,t[55]=O):O=t[55],t[56]===a?k=t[57]:(k=a?.missionBlurb&&(0,m.jsx)(`div`,{className:D.MapBlurb,children:w(a.missionBlurb)?(0,m.jsx)(E,{markup:a.missionBlurb.trim()}):a.missionBlurb.trim()}),t[56]=a,t[57]=k),A=e&&e.trim()&&(0,m.jsx)(`div`,{className:D.Section,children:(0,m.jsx)(E,{markup:e})}),t[12]=_,t[13]=v,t[14]=b,t[15]=i,t[16]=n,t[17]=a,t[18]=S,t[19]=C,t[20]=O,t[21]=k,t[22]=A,t[23]=j,t[24]=M,t[25]=N,t[26]=P,t[27]=F,t[28]=I,t[29]=L,t[30]=R,t[31]=z,t[32]=B,t[33]=V,t[34]=H,t[35]=U}else S=t[18],C=t[19],O=t[20],k=t[21],A=t[22],j=t[23],M=t[24],N=t[25],P=t[26],F=t[27],I=t[28],L=t[29],R=t[30],z=t[31],B=t[32],V=t[33],H=t[34],U=t[35];let W;t[58]===a?W=t[59]:(W=a?.missionBriefing&&(0,m.jsxs)(`div`,{className:D.Section,children:[(0,m.jsx)(`h2`,{className:D.SectionTitle,children:`Mission Briefing`}),(0,m.jsx)(E,{markup:a.missionBriefing})]}),t[58]=a,t[59]=W);let G;t[60]===x?G=t[61]:(G=x&&(0,m.jsx)(ie,{track:x}),t[60]=x,t[61]=G);let K;t[62]!==S||t[63]!==C||t[64]!==O||t[65]!==k||t[66]!==A||t[67]!==W||t[68]!==G||t[69]!==H||t[70]!==U?(K=(0,m.jsxs)(`div`,{className:H,children:[U,S,C,O,k,A,W,G]}),t[62]=S,t[63]=C,t[64]=O,t[65]=k,t[66]=A,t[67]=W,t[68]=G,t[69]=H,t[70]=U,t[71]=K):K=t[71];let q;t[72]!==_||t[73]!==v||t[74]!==b?(q=_&&!b&&(0,m.jsx)(re,{src:_,alt:`${v} preview`},_),t[72]=_,t[73]=v,t[74]=b,t[75]=q):q=t[75];let J;t[76]!==j||t[77]!==K||t[78]!==q?(J=(0,m.jsxs)(`div`,{className:j,children:[K,q]}),t[76]=j,t[77]=K,t[78]=q,t[79]=J):J=t[79];let Y;t[80]===n?Y=t[81]:(Y=(0,m.jsx)(`button`,{className:D.CloseButton,onClick:n,children:`Close`}),t[80]=n,t[81]=Y);let X;t[82]===Symbol.for(`react.memo_cache_sentinel`)?(X=(0,m.jsx)(`span`,{className:D.Hint,children:`Esc to close`}),t[82]=X):X=t[82];let Z;t[83]===Y?Z=t[84]:(Z=(0,m.jsxs)(`div`,{className:D.Footer,children:[Y,X]}),t[83]=Y,t[84]=Z);let Q;t[85]!==M||t[86]!==N||t[87]!==P||t[88]!==F||t[89]!==I||t[90]!==L||t[91]!==R||t[92]!==z||t[93]!==J||t[94]!==Z?(Q=(0,m.jsxs)(`div`,{ref:M,className:N,onClick:P,onKeyDown:F,role:I,"aria-modal":L,"aria-label":R,tabIndex:z,children:[J,Z]}),t[85]=M,t[86]=N,t[87]=P,t[88]=F,t[89]=I,t[90]=L,t[91]=R,t[92]=z,t[93]=J,t[94]=Z,t[95]=Q):Q=t[95];let $;return t[96]!==B||t[97]!==V||t[98]!==Q?($=(0,m.jsx)(`div`,{className:B,onClick:V,children:Q}),t[96]=B,t[97]=V,t[98]=Q,t[99]=$):$=t[99],$}function ae(e){return e.stopPropagation()}function oe(e){return e.stopPropagation()}function se(e){e.stopImmediatePropagation()}export{M as MapInfoDialog};
|
||||
|
|
@ -1 +0,0 @@
|
|||
._GuiMarkup_jg4va_1{white-space:pre-wrap;font-size:14px;line-height:1.5}._GuiMarkup_jg4va_1 a{color:inherit;text-decoration:underline}._Bullet_jg4va_12{margin-left:.5em;margin-right:.5em}._Dialog_6c89x_1{color:#b0d5c9;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;max-width:calc(100dvw - 40px);max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}._Overlay_6c89x_20{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._DialogButton_6c89x_31{color:#99fff1;text-shadow:0 -1px 1px #0006;cursor:pointer;background:linear-gradient(#30a497cc,#1f9688cc 33%,#218377cc 67%,#046564cc);border:1px solid #387c74cc;border-top-color:#57b7b9cc;border-radius:4px;padding:4px 18px;font-family:inherit;font-size:14px;font-weight:500;box-shadow:inset 0 0 4px #02808e80}._DialogButton_6c89x_31:hover:not(:disabled){color:#b1fff5;border:1px solid #409188e6;border-top-color:#5ac6c2e6;box-shadow:inset 0 0 4px #02808e80,0 0 5px #3effbf80}._DialogButton_6c89x_31:active:not(:disabled){transform:translateY(1px)}._DialogButton_6c89x_31:disabled{opacity:.4;cursor:not-allowed}._Secondary_6c89x_70{box-shadow:none;color:#a2e2cfcc;text-shadow:none;background:0 0;border:1px solid #387c74cc}._Secondary_6c89x_70:hover:not(:disabled){color:#a9ffe5cc;border:1px solid #3f9087e6}._Actions_6c89x_84{align-items:center;gap:10px;display:flex}@media (width<=719px){._Dialog_6c89x_1{border-radius:0;max-width:calc(100dvw - 20px);max-height:calc(100dvh - 20px)}}@media (width<=639px){._Overlay_6c89x_20{padding:10px}}._Dialog_tbn5d_1{grid-template-rows:1fr auto;grid-template-columns:100%;width:800px;height:600px;display:grid}._Body_tbn5d_14{grid-template-rows:100%;grid-template-columns:1fr auto;min-height:0;display:grid;overflow:hidden}._Left_tbn5d_22{z-index:1;padding:24px 28px;position:relative;overflow-y:auto}._PreviewImage_tbn5d_29{border-left:1px solid #00bedc40;height:100%;display:block}._PreviewImageFloating_tbn5d_35{float:right;clear:right;width:auto;max-width:30%;max-height:260px;margin:0 0 16px 20px;display:block}._Title_tbn5d_45{color:#7dffff;text-shadow:0 1px 6px #0006;margin:0;font-size:26px;font-weight:500}._MapMeta_tbn5d_53{flex-wrap:wrap;gap:8px 16px;margin-bottom:4px;font-size:15px;font-weight:400;display:flex}._MapPlanet_tbn5d_63{color:#dbcaa8b3}._MapQuote_tbn5d_67{border-left:2px solid #00bedc59;margin:16px 0;padding:0 0 0 14px;font-style:italic}._MapQuote_tbn5d_67 p{white-space:pre-line;margin:0 0 4px}._MapQuote_tbn5d_67 cite{color:#d7edcb80;font-size:12px;font-style:normal;display:block}._MapBlurb_tbn5d_86{margin:0 0 16px;font-size:13px}._Section_tbn5d_91{margin-top:20px}._SectionTitle_tbn5d_95{color:#7dffff;letter-spacing:.04em;text-transform:uppercase;text-shadow:0 0 16px #00d2f040;margin:0 0 8px;font-size:16px;font-weight:500}._MusicTrack_tbn5d_105{color:#d7edcb80;align-items:center;gap:6px;margin-top:16px;font-size:14px;font-style:italic;display:flex}._MusicTrack_tbn5d_105[data-playing=true]{color:#f7fdd8b3}._MusicButton_tbn5d_119{cursor:pointer;color:#557663;opacity:.5;background:0 0;border:0;border-radius:20px;flex-shrink:0;place-content:center;width:32px;height:32px;padding:0;font-size:20px;font-style:normal;line-height:1;display:grid}._MusicTrack_tbn5d_105[data-playing=true] ._MusicButton_tbn5d_119{color:#6dffaa;opacity:1}._MusicTrack_tbn5d_105[data-playing=true] ._MusicButton_tbn5d_119:hover{opacity:.7}._Footer_tbn5d_146{z-index:1;background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;align-items:center;gap:16px;padding:10px 12px;display:flex;position:relative}._Hint_tbn5d_162{color:#c9dcd84d;margin-left:auto;font-size:12px}._MusicTrackName_tbn5d_168{text-transform:capitalize}@media (width<=719px){._Body_tbn5d_14{grid-template:"body"1fr/1fr;overflow:auto}._Hint_tbn5d_162{display:none}._Left_tbn5d_22{background:linear-gradient(#0009,#0000);grid-area:body;margin:0;padding:16px 20px}._PreviewImage_tbn5d_29{z-index:0;opacity:.9;border:0;grid-area:body;width:100%;height:auto;position:relative}._CloseButton_tbn5d_158{width:220px;height:36px;margin:0 auto}}
|
||||
1
docs/assets/MapInfoDialog-qPSE5ow_.css
Normal file
1
docs/assets/MapInfoDialog-qPSE5ow_.css
Normal file
|
|
@ -0,0 +1 @@
|
|||
._GuiMarkup_jg4va_1{white-space:pre-wrap;font-size:14px;line-height:1.5}._GuiMarkup_jg4va_1 a{color:inherit;text-decoration:underline}._Bullet_jg4va_12{margin-left:.5em;margin-right:.5em}._Dialog_1t9wa_1{color:#b0d5c9;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;min-width:120px;max-width:calc(100dvw - 40px);min-height:120px;max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}._Overlay_1t9wa_22{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._DialogButton_1t9wa_33{color:#99fff1;text-shadow:0 -1px 1px #0006;cursor:pointer;background:linear-gradient(#30a497cc,#1f9688cc 33%,#218377cc 67%,#046564cc);border:1px solid #387c74cc;border-top-color:#57b7b9cc;border-radius:4px;padding:4px 18px;font-family:inherit;font-size:14px;font-weight:500;box-shadow:inset 0 0 4px #02808e80}._DialogButton_1t9wa_33:hover:not(:disabled){color:#b1fff5;border:1px solid #409188e6;border-top-color:#5ac6c2e6;box-shadow:inset 0 0 4px #02808e80,0 0 5px #3effbf80}._DialogButton_1t9wa_33:active:not(:disabled){transform:translateY(1px)}._DialogButton_1t9wa_33:disabled{opacity:.4;cursor:not-allowed}._Secondary_1t9wa_72{box-shadow:none;color:#a2e2cfcc;text-shadow:none;background:0 0;border:1px solid #387c74cc}._Secondary_1t9wa_72:hover:not(:disabled){color:#a9ffe5cc;border:1px solid #3f9087e6}._Actions_1t9wa_86{align-items:center;gap:10px;display:flex}@media (width<=719px){._Dialog_1t9wa_1{border-radius:0;max-width:calc(100dvw - 20px);max-height:calc(100dvh - 20px)}}@media (width<=639px){._Overlay_1t9wa_22{padding:10px}}._Dialog_tbn5d_1{grid-template-rows:1fr auto;grid-template-columns:100%;width:800px;height:600px;display:grid}._Body_tbn5d_14{grid-template-rows:100%;grid-template-columns:1fr auto;min-height:0;display:grid;overflow:hidden}._Left_tbn5d_22{z-index:1;padding:24px 28px;position:relative;overflow-y:auto}._PreviewImage_tbn5d_29{border-left:1px solid #00bedc40;height:100%;display:block}._PreviewImageFloating_tbn5d_35{float:right;clear:right;width:auto;max-width:30%;max-height:260px;margin:0 0 16px 20px;display:block}._Title_tbn5d_45{color:#7dffff;text-shadow:0 1px 6px #0006;margin:0;font-size:26px;font-weight:500}._MapMeta_tbn5d_53{flex-wrap:wrap;gap:8px 16px;margin-bottom:4px;font-size:15px;font-weight:400;display:flex}._MapPlanet_tbn5d_63{color:#dbcaa8b3}._MapQuote_tbn5d_67{border-left:2px solid #00bedc59;margin:16px 0;padding:0 0 0 14px;font-style:italic}._MapQuote_tbn5d_67 p{white-space:pre-line;margin:0 0 4px}._MapQuote_tbn5d_67 cite{color:#d7edcb80;font-size:12px;font-style:normal;display:block}._MapBlurb_tbn5d_86{margin:0 0 16px;font-size:13px}._Section_tbn5d_91{margin-top:20px}._SectionTitle_tbn5d_95{color:#7dffff;letter-spacing:.04em;text-transform:uppercase;text-shadow:0 0 16px #00d2f040;margin:0 0 8px;font-size:16px;font-weight:500}._MusicTrack_tbn5d_105{color:#d7edcb80;align-items:center;gap:6px;margin-top:16px;font-size:14px;font-style:italic;display:flex}._MusicTrack_tbn5d_105[data-playing=true]{color:#f7fdd8b3}._MusicButton_tbn5d_119{cursor:pointer;color:#557663;opacity:.5;background:0 0;border:0;border-radius:20px;flex-shrink:0;place-content:center;width:32px;height:32px;padding:0;font-size:20px;font-style:normal;line-height:1;display:grid}._MusicTrack_tbn5d_105[data-playing=true] ._MusicButton_tbn5d_119{color:#6dffaa;opacity:1}._MusicTrack_tbn5d_105[data-playing=true] ._MusicButton_tbn5d_119:hover{opacity:.7}._Footer_tbn5d_146{z-index:1;background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;align-items:center;gap:16px;padding:10px 12px;display:flex;position:relative}._Hint_tbn5d_162{color:#c9dcd84d;margin-left:auto;font-size:12px}._MusicTrackName_tbn5d_168{text-transform:capitalize}@media (width<=719px){._Body_tbn5d_14{grid-template:"body"1fr/1fr;overflow:auto}._Hint_tbn5d_162{display:none}._Left_tbn5d_22{background:linear-gradient(#0009,#0000);grid-area:body;margin:0;padding:16px 20px}._PreviewImage_tbn5d_29{z-index:0;opacity:.9;border:0;grid-area:body;width:100%;height:auto;position:relative}._CloseButton_tbn5d_158{width:220px;height:36px;margin:0 auto}}
|
||||
1
docs/assets/Mission-Coy6f_9U.js
Normal file
1
docs/assets/Mission-Coy6f_9U.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
docs/assets/PlayerHUD-ZLAOgfFu.js
Normal file
2
docs/assets/PlayerHUD-ZLAOgfFu.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/PlayerModel-CbQhsRlW.js
Normal file
1
docs/assets/PlayerModel-CbQhsRlW.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
docs/assets/Projectiles-DWQwPDtG.js
Normal file
1
docs/assets/Projectiles-DWQwPDtG.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CgPHUpXo.js";import{_ as a,h as o,m as s}from"./GenericShape-BC0gDQiR.js";import{Ot as c,St as l,Ut as u,b as d}from"./three.module-07hRbor4.js";import{p as f}from"./loaders-CIpiZadQ.js";import{t as p}from"./Texture-CIsc25mc.js";var m=t(),h=e(n(),1),g=r(),_=new u,v=new u,y=new u,b=new u,x=new u,S=new u,C=new u(0,1,0);function w(e){let t=(0,m.c)(14),{entity:n}=e,{visual:r}=n,i;t[0]===r.texture?i=t[1]:(i=f(r.texture),t[0]=r.texture,t[1]=i);let a=p(i,T),o=Array.isArray(a)?a[0]:a,s;t[2]!==r.color.b||t[3]!==r.color.g||t[4]!==r.color.r?(s=new d().setRGB(r.color.r,r.color.g,r.color.b,c),t[2]=r.color.b,t[3]=r.color.g,t[4]=r.color.r,t[5]=s):s=t[5];let l=s,u;t[6]===r.size?u=t[7]:(u=[r.size,r.size,1],t[6]=r.size,t[7]=u);let h;t[8]!==l||t[9]!==o?(h=(0,g.jsx)(`spriteMaterial`,{map:o,color:l,transparent:!0,blending:2,depthWrite:!1,toneMapped:!1}),t[8]=l,t[9]=o,t[10]=h):h=t[10];let _;return t[11]!==u||t[12]!==h?(_=(0,g.jsx)(`sprite`,{scale:u,children:h}),t[11]=u,t[12]=h,t[13]=_):_=t[13],_}function T(e){o(Array.isArray(e)?e[0]:e)}function E(e){let t=(0,m.c)(29),{entity:n}=e,{visual:r}=n,o=(0,h.useRef)(null),c=(0,h.useRef)(null),u=(0,h.useRef)(null),d;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(d=new l,t[0]=d):d=t[0];let w=(0,h.useRef)(d),T;t[1]===r.texture?T=t[2]:(T=f(r.texture),t[1]=r.texture,t[2]=T);let E=r.crossTexture??r.texture,O;t[3]===E?O=t[4]:(O=f(E),t[3]=E,t[4]=O);let k;t[5]!==T||t[6]!==O?(k=[T,O],t[5]=T,t[6]=O,t[7]=k):k=t[7];let A=p(k,D),j;t[8]===A?j=t[9]:(j=Array.isArray(A)?A:[A,A],t[8]=A,t[9]=j);let[M,N]=j,P;t[10]!==n.direction||t[11]!==n.keyframes?.[0]||t[12]!==r.crossSize||t[13]!==r.crossViewAng||t[14]!==r.renderCross||t[15]!==r.tracerLength||t[16]!==r.tracerWidth?(P=e=>{let{camera:t}=e,i=o.current,l=c.current;if(!i||!l)return;let d=n.keyframes?.[0],f=d?.position,p=n.direction??d?.velocity;if(!f||!p){i.visible=!1,u.current&&(u.current.visible=!1);return}if(a(p,_),_.lengthSq()<1e-8){i.visible=!1,u.current&&(u.current.visible=!1);return}_.normalize(),i.visible=!0,a(f,S),v.copy(S).sub(t.position),y.crossVectors(v,_),y.lengthSq()<1e-8&&(y.crossVectors(C,_),y.lengthSq()<1e-8&&y.set(1,0,0)),y.normalize().multiplyScalar(r.tracerWidth);let m=r.tracerLength*.5;b.copy(_).multiplyScalar(-m),x.copy(_).multiplyScalar(m);let h=l.array;h[0]=b.x+y.x,h[1]=b.y+y.y,h[2]=b.z+y.z,h[3]=b.x-y.x,h[4]=b.y-y.y,h[5]=b.z-y.z,h[6]=x.x-y.x,h[7]=x.y-y.y,h[8]=x.z-y.z,h[9]=x.x+y.x,h[10]=x.y+y.y,h[11]=x.z+y.z,l.needsUpdate=!0;let g=u.current;if(!g)return;if(!r.renderCross){g.visible=!1;return}v.normalize();let T=_.dot(v);if(T>-r.crossViewAng&&T<r.crossViewAng){g.visible=!1;return}g.visible=!0,s(_,w.current),g.quaternion.copy(w.current),g.scale.setScalar(r.crossSize)},t[10]=n.direction,t[11]=n.keyframes?.[0],t[12]=r.crossSize,t[13]=r.crossViewAng,t[14]=r.renderCross,t[15]=r.tracerLength,t[16]=r.tracerWidth,t[17]=P):P=t[17],i(P);let F;t[18]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,g.jsx)(`bufferAttribute`,{ref:c,attach:`attributes-position`,args:[new Float32Array(12),3]}),t[18]=F):F=t[18];let I;t[19]===Symbol.for(`react.memo_cache_sentinel`)?(I=(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),t[19]=I):I=t[19];let L;t[20]===Symbol.for(`react.memo_cache_sentinel`)?(L=(0,g.jsxs)(`bufferGeometry`,{children:[F,I,(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),t[20]=L):L=t[20];let R;t[21]===M?R=t[22]:(R=(0,g.jsxs)(`mesh`,{ref:o,children:[L,(0,g.jsx)(`meshBasicMaterial`,{map:M,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}),t[21]=M,t[22]=R);let z;t[23]!==N||t[24]!==r.renderCross?(z=r.renderCross?(0,g.jsxs)(`mesh`,{ref:u,children:[(0,g.jsxs)(`bufferGeometry`,{children:[(0,g.jsx)(`bufferAttribute`,{attach:`attributes-position`,args:[new Float32Array([-.5,0,-.5,.5,0,-.5,.5,0,.5,-.5,0,.5]),3]}),(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),(0,g.jsx)(`meshBasicMaterial`,{map:N,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}):null,t[23]=N,t[24]=r.renderCross,t[25]=z):z=t[25];let B;return t[26]!==R||t[27]!==z?(B=(0,g.jsxs)(g.Fragment,{children:[R,z]}),t[26]=R,t[27]=z,t[28]=B):B=t[28],B}function D(e){let t=Array.isArray(e)?e:[e];for(let e of t)o(e)}export{w as SpriteProjectile,E as TracerProjectile};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i}from"./react-three-fiber.esm-CgPHUpXo.js";import"./SettingsProvider-CCHVZuSg.js";import{_ as a,h as o,m as s}from"./GenericShape-CJNMldco.js";import"./logger-z_EpIdIa.js";import"./traditional-BTL5qX2E.js";import{Ot as c,St as l,Ut as u,b as d}from"./three.module-07hRbor4.js";import"./mission-D8vr00S1.js";import"./engineStore-Dkm20jvr.js";import{p as f}from"./loaders-VxR5Bl13.js";import{t as p}from"./Texture-CIsc25mc.js";import"./FloatingLabel-C9VkDpCy.js";import"./globalFogUniforms-CtxQvsRj.js";var m=t(),h=e(n(),1),g=r(),_=new u,v=new u,y=new u,b=new u,x=new u,S=new u,C=new u(0,1,0);function w(e){let t=(0,m.c)(14),{entity:n}=e,{visual:r}=n,i;t[0]===r.texture?i=t[1]:(i=f(r.texture),t[0]=r.texture,t[1]=i);let a=p(i,T),o=Array.isArray(a)?a[0]:a,s;t[2]!==r.color.b||t[3]!==r.color.g||t[4]!==r.color.r?(s=new d().setRGB(r.color.r,r.color.g,r.color.b,c),t[2]=r.color.b,t[3]=r.color.g,t[4]=r.color.r,t[5]=s):s=t[5];let l=s,u;t[6]===r.size?u=t[7]:(u=[r.size,r.size,1],t[6]=r.size,t[7]=u);let h;t[8]!==l||t[9]!==o?(h=(0,g.jsx)(`spriteMaterial`,{map:o,color:l,transparent:!0,blending:2,depthWrite:!1,toneMapped:!1}),t[8]=l,t[9]=o,t[10]=h):h=t[10];let _;return t[11]!==u||t[12]!==h?(_=(0,g.jsx)(`sprite`,{scale:u,children:h}),t[11]=u,t[12]=h,t[13]=_):_=t[13],_}function T(e){o(Array.isArray(e)?e[0]:e)}function E(e){let t=(0,m.c)(29),{entity:n}=e,{visual:r}=n,o=(0,h.useRef)(null),c=(0,h.useRef)(null),u=(0,h.useRef)(null),d;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(d=new l,t[0]=d):d=t[0];let w=(0,h.useRef)(d),T;t[1]===r.texture?T=t[2]:(T=f(r.texture),t[1]=r.texture,t[2]=T);let E=r.crossTexture??r.texture,O;t[3]===E?O=t[4]:(O=f(E),t[3]=E,t[4]=O);let k;t[5]!==T||t[6]!==O?(k=[T,O],t[5]=T,t[6]=O,t[7]=k):k=t[7];let A=p(k,D),j;t[8]===A?j=t[9]:(j=Array.isArray(A)?A:[A,A],t[8]=A,t[9]=j);let[M,N]=j,P;t[10]!==n.direction||t[11]!==n.keyframes?.[0]||t[12]!==r.crossSize||t[13]!==r.crossViewAng||t[14]!==r.renderCross||t[15]!==r.tracerLength||t[16]!==r.tracerWidth?(P=e=>{let{camera:t}=e,i=o.current,l=c.current;if(!i||!l)return;let d=n.keyframes?.[0],f=d?.position,p=n.direction??d?.velocity;if(!f||!p){i.visible=!1,u.current&&(u.current.visible=!1);return}if(a(p,_),_.lengthSq()<1e-8){i.visible=!1,u.current&&(u.current.visible=!1);return}_.normalize(),i.visible=!0,a(f,S),v.copy(S).sub(t.position),y.crossVectors(v,_),y.lengthSq()<1e-8&&(y.crossVectors(C,_),y.lengthSq()<1e-8&&y.set(1,0,0)),y.normalize().multiplyScalar(r.tracerWidth);let m=r.tracerLength*.5;b.copy(_).multiplyScalar(-m),x.copy(_).multiplyScalar(m);let h=l.array;h[0]=b.x+y.x,h[1]=b.y+y.y,h[2]=b.z+y.z,h[3]=b.x-y.x,h[4]=b.y-y.y,h[5]=b.z-y.z,h[6]=x.x-y.x,h[7]=x.y-y.y,h[8]=x.z-y.z,h[9]=x.x+y.x,h[10]=x.y+y.y,h[11]=x.z+y.z,l.needsUpdate=!0;let g=u.current;if(!g)return;if(!r.renderCross){g.visible=!1;return}v.normalize();let T=_.dot(v);if(T>-r.crossViewAng&&T<r.crossViewAng){g.visible=!1;return}g.visible=!0,s(_,w.current),g.quaternion.copy(w.current),g.scale.setScalar(r.crossSize)},t[10]=n.direction,t[11]=n.keyframes?.[0],t[12]=r.crossSize,t[13]=r.crossViewAng,t[14]=r.renderCross,t[15]=r.tracerLength,t[16]=r.tracerWidth,t[17]=P):P=t[17],i(P);let F;t[18]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,g.jsx)(`bufferAttribute`,{ref:c,attach:`attributes-position`,args:[new Float32Array(12),3]}),t[18]=F):F=t[18];let I;t[19]===Symbol.for(`react.memo_cache_sentinel`)?(I=(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),t[19]=I):I=t[19];let L;t[20]===Symbol.for(`react.memo_cache_sentinel`)?(L=(0,g.jsxs)(`bufferGeometry`,{children:[F,I,(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),t[20]=L):L=t[20];let R;t[21]===M?R=t[22]:(R=(0,g.jsxs)(`mesh`,{ref:o,children:[L,(0,g.jsx)(`meshBasicMaterial`,{map:M,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}),t[21]=M,t[22]=R);let z;t[23]!==N||t[24]!==r.renderCross?(z=r.renderCross?(0,g.jsxs)(`mesh`,{ref:u,children:[(0,g.jsxs)(`bufferGeometry`,{children:[(0,g.jsx)(`bufferAttribute`,{attach:`attributes-position`,args:[new Float32Array([-.5,0,-.5,.5,0,-.5,.5,0,.5,-.5,0,.5]),3]}),(0,g.jsx)(`bufferAttribute`,{attach:`attributes-uv`,args:[new Float32Array([0,0,0,1,1,1,1,0]),2]}),(0,g.jsx)(`bufferAttribute`,{attach:`index`,args:[new Uint16Array([0,1,2,0,2,3]),1]})]}),(0,g.jsx)(`meshBasicMaterial`,{map:N,transparent:!0,blending:2,side:2,depthWrite:!1,toneMapped:!1})]}):null,t[23]=N,t[24]=r.renderCross,t[25]=z):z=t[25];let B;return t[26]!==R||t[27]!==z?(B=(0,g.jsxs)(g.Fragment,{children:[R,z]}),t[26]=R,t[27]=z,t[28]=B):B=t[28],B}function D(e){let t=Array.isArray(e)?e:[e];for(let e of t)o(e)}export{w as SpriteProjectile,E as TracerProjectile};
|
||||
1
docs/assets/ScoreScreen-94psq8zp.js
Normal file
1
docs/assets/ScoreScreen-94psq8zp.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
docs/assets/ScoreScreen-FWyMMObP.css
Normal file
1
docs/assets/ScoreScreen-FWyMMObP.css
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/ServerBrowser-B1ZZ25fp.css
Normal file
1
docs/assets/ServerBrowser-B1ZZ25fp.css
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/ServerBrowser-BK-yGyhv.js
Normal file
1
docs/assets/ServerBrowser-BK-yGyhv.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
docs/assets/ShapeModel-BCrUHJyp.js
Normal file
1
docs/assets/ShapeModel-BCrUHJyp.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
import{n as e}from"./jsx-runtime-BpGWiA-R.js";import{i as t}from"./react-three-fiber.esm-CgPHUpXo.js";import{r as n}from"./SettingsProvider-CCHVZuSg.js";import"./traditional-BTL5qX2E.js";import{n as r}from"./JoystickContext-YJ6eVLFP.js";import{f as i,h as a}from"./index-lyciGARn.js";var o=e(),s=.004,c=2.5,l=.08,u=.15,d=.15;function f(){let e=(0,o.c)(9),{speedMultiplier:f,touchMode:p,invertDrag:m,invertJoystick:h}=n(),{moveState:g,lookState:_}=r(),v=a(),[,y]=i(),b;return e[0]!==y||e[1]!==m||e[2]!==h||e[3]!==_.current||e[4]!==g.current||e[5]!==v||e[6]!==f||e[7]!==p?(b=(e,t)=>{let{force:n,angle:r}=g.current,{force:i,angle:a}=_.current,o=y().touchLook,b=m?1:-1,x=0,S=0;p===`moveLookStick`&&o&&o.dragging&&(x=b*o.deltaX*s,S=b*o.deltaY*s);let C=0,w=0;if(p===`dualStick`){if(i>u){let e=(i-u)/(1-u),n=Math.cos(a),r=Math.sin(a),o=h?1:-1;x-=o*n*e*c*t,S+=o*r*e*c*t}if(n>l){let e=(n-l)/(1-l),t=Math.cos(r),i=Math.sin(r);C=Math.max(-1,Math.min(1,t*e*f)),w=Math.max(-1,Math.min(1,i*e*f))}}else if(p===`moveLookStick`&&n>0&&(w=Math.max(-1,Math.min(1,.5*f)),n>=d)){let e=Math.cos(r),i=Math.sin(r),a=(n-d)/(1-d),o=h?1:-1;x-=o*e*a*c*.5*t,S+=o*i*a*c*.5*t}!(x!==0||S!==0)&&!(C!==0||w!==0)||v({deltaYaw:x,deltaPitch:S,x:C,y:w,z:0,triggers:[],delta:t})},e[0]=y,e[1]=m,e[2]=h,e[3]=_.current,e[4]=g.current,e[5]=v,e[6]=f,e[7]=p,e[8]=b):b=e[8],t(b),null}export{f as TouchHandler};
|
||||
1
docs/assets/TouchHandler-CV_1nnl6.js
Normal file
1
docs/assets/TouchHandler-CV_1nnl6.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{n as e}from"./jsx-runtime-BpGWiA-R.js";import{i as t}from"./react-three-fiber.esm-CgPHUpXo.js";import{r as n}from"./SettingsProvider-CCHVZuSg.js";import{n as r}from"./JoystickContext-YJ6eVLFP.js";import{f as i,h as a}from"./index-B1XI52_L.js";var o=e(),s=.004,c=2.5,l=.08,u=.15,d=.15;function f(){let e=(0,o.c)(9),{speedMultiplier:f,touchMode:p,invertDrag:m,invertJoystick:h}=n(),{moveState:g,lookState:_}=r(),v=a(),[,y]=i(),b;return e[0]!==y||e[1]!==m||e[2]!==h||e[3]!==_.current||e[4]!==g.current||e[5]!==v||e[6]!==f||e[7]!==p?(b=(e,t)=>{let{force:n,angle:r}=g.current,{force:i,angle:a}=_.current,o=y().touchLook,b=m?1:-1,x=0,S=0;p===`moveLookStick`&&o&&o.dragging&&(x=b*o.deltaX*s,S=b*o.deltaY*s);let C=0,w=0;if(p===`dualStick`){if(i>u){let e=(i-u)/(1-u),n=Math.cos(a),r=Math.sin(a),o=h?1:-1;x-=o*n*e*c*t,S+=o*r*e*c*t}if(n>l){let e=(n-l)/(1-l),t=Math.cos(r),i=Math.sin(r);C=Math.max(-1,Math.min(1,t*e*f)),w=Math.max(-1,Math.min(1,i*e*f))}}else if(p===`moveLookStick`&&n>0&&(w=Math.max(-1,Math.min(1,.5*f)),n>=d)){let e=Math.cos(r),i=Math.sin(r),a=(n-d)/(1-d),o=h?1:-1;x-=o*e*a*c*.5*t,S+=o*i*a*c*.5*t}!(x!==0||S!==0)&&!(C!==0||w!==0)||v({deltaYaw:x,deltaPitch:S,x:C,y:w,z:0,triggers:[],delta:t})},e[0]=y,e[1]=m,e[2]=h,e[3]=_.current,e[4]=g.current,e[5]=v,e[6]=f,e[7]=p,e[8]=b):b=e[8],t(b),null}export{f as TouchHandler};
|
||||
|
|
@ -1,2 +1,2 @@
|
|||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/nipplejs-l2bgT5Z7.js","assets/chunk-DECur_0Z.js"])))=>i.map(i=>d[i]);
|
||||
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{r}from"./SettingsProvider-CCHVZuSg.js";import{t as i}from"./preload-helper-CwUjIIrH.js";import{n as a}from"./JoystickContext-YJ6eVLFP.js";var o=e(t(),1),s={Joystick:`_Joystick_155b9_1`,Left:`_Left_155b9_11 _Joystick_155b9_1`,Right:`_Right_155b9_17 _Joystick_155b9_1`},c=n();function l(e){let t=e.querySelector(`.back`);t&&(t.style.background=`rgba(3, 79, 76, 0.6)`,t.style.border=`1px solid rgba(0, 219, 223, 0.5)`,t.style.boxShadow=`inset 0 0 10px rgba(0, 0, 0, 0.7)`);let n=e.querySelector(`.front`);n&&(n.style.background=`radial-gradient(circle at 50% 50%, rgba(23, 247, 198, 0.9) 0%, rgba(9, 184, 170, 0.95) 100%)`,n.style.border=`2px solid rgba(255, 255, 255, 0.4)`,n.style.boxShadow=`0 2px 4px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15), inset 0 -1px 2px rgba(0, 0, 0, 0.3)`)}function u(){let{touchMode:t}=r(),[n,u]=(0,o.useState)(null),[d,f]=(0,o.useState)(null),{moveState:p,lookState:m,setMoveState:h,setLookState:g}=a();(0,o.useEffect)(()=>{if(!n)return;let t=null,r=!1;return i(()=>import(`./nipplejs-l2bgT5Z7.js`).then(t=>e(t.default,1)).then(e=>{r||(t=e.default.create({zone:n,mode:`static`,position:{left:`70px`,bottom:`70px`},size:120,restOpacity:.9,dynamicPage:!0}),l(n),t.on(`move`,(e,t)=>{h({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{h({force:0})}))}),__vite__mapDeps([0,1])),()=>{r=!0,t?.destroy()}},[p,n,h]),(0,o.useEffect)(()=>{if(!d)return;let t=null,n=!1;return i(()=>import(`./nipplejs-l2bgT5Z7.js`).then(t=>e(t.default,1)).then(e=>{n||(t=e.default.create({zone:d,mode:`static`,position:{right:`70px`,bottom:`70px`},size:120,restOpacity:.9,dynamicPage:!0}),l(d),t.on(`move`,(e,t)=>{g({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{g({force:0})}))}),__vite__mapDeps([0,1])),()=>{n=!0,t?.destroy()}},[m,d,g]);let _=()=>{document.activeElement instanceof HTMLElement&&document.activeElement.blur()};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(`div`,{ref:u,className:t===`dualStick`?s.Left:s.Joystick,onContextMenu:e=>e.preventDefault(),onTouchStart:_},t),t===`dualStick`?(0,c.jsx)(`div`,{ref:f,className:s.Right,onContextMenu:e=>e.preventDefault(),onTouchStart:_}):null]})}export{u as TouchJoystick};
|
||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/nipplejs-DYp3oo-D.js","assets/chunk-DECur_0Z.js"])))=>i.map(i=>d[i]);
|
||||
import{r as e}from"./chunk-DECur_0Z.js";import{r as t,t as n}from"./jsx-runtime-BpGWiA-R.js";import{r}from"./SettingsProvider-CCHVZuSg.js";import{t as i}from"./preload-helper-CwUjIIrH.js";import{n as a}from"./JoystickContext-YJ6eVLFP.js";var o=e(t(),1),s={Joystick:`_Joystick_155b9_1`,Left:`_Left_155b9_11 _Joystick_155b9_1`,Right:`_Right_155b9_17 _Joystick_155b9_1`},c=n();function l(e){let t=e.querySelector(`.back`);t&&(t.style.background=`rgba(3, 79, 76, 0.6)`,t.style.border=`1px solid rgba(0, 219, 223, 0.5)`,t.style.boxShadow=`inset 0 0 10px rgba(0, 0, 0, 0.7)`);let n=e.querySelector(`.front`);n&&(n.style.background=`radial-gradient(circle at 50% 50%, rgba(23, 247, 198, 0.9) 0%, rgba(9, 184, 170, 0.95) 100%)`,n.style.border=`2px solid rgba(255, 255, 255, 0.4)`,n.style.boxShadow=`0 2px 4px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15), inset 0 -1px 2px rgba(0, 0, 0, 0.3)`)}function u(){let{touchMode:t}=r(),[n,u]=(0,o.useState)(null),[d,f]=(0,o.useState)(null),{moveState:p,lookState:m,setMoveState:h,setLookState:g}=a();(0,o.useEffect)(()=>{if(!n)return;let t=null,r=!1;return i(()=>import(`./nipplejs-DYp3oo-D.js`).then(t=>e(t.default,1)).then(e=>{r||(t=e.default.create({zone:n,mode:`static`,position:{left:`70px`,bottom:`70px`},size:120,restOpacity:.9,dynamicPage:!0}),l(n),t.on(`move`,(e,t)=>{h({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{h({force:0})}))}),__vite__mapDeps([0,1])),()=>{r=!0,t?.destroy()}},[p,n,h]),(0,o.useEffect)(()=>{if(!d)return;let t=null,n=!1;return i(()=>import(`./nipplejs-DYp3oo-D.js`).then(t=>e(t.default,1)).then(e=>{n||(t=e.default.create({zone:d,mode:`static`,position:{right:`70px`,bottom:`70px`},size:120,restOpacity:.9,dynamicPage:!0}),l(d),t.on(`move`,(e,t)=>{g({angle:t.angle.radian,force:Math.min(1,t.force)})}),t.on(`end`,()=>{g({force:0})}))}),__vite__mapDeps([0,1])),()=>{n=!0,t?.destroy()}},[m,d,g]);let _=()=>{document.activeElement instanceof HTMLElement&&document.activeElement.blur()};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(`div`,{ref:u,className:t===`dualStick`?s.Left:s.Joystick,onContextMenu:e=>e.preventDefault(),onTouchStart:_},t),t===`dualStick`?(0,c.jsx)(`div`,{ref:f,className:s.Right,onContextMenu:e=>e.preventDefault(),onTouchStart:_}):null]})}export{u as TouchJoystick};
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i,o as a}from"./react-three-fiber.esm-CgPHUpXo.js";import{a as o,i as s}from"./SettingsProvider-CCHVZuSg.js";import"./logger-z_EpIdIa.js";import"./traditional-BTL5qX2E.js";import{At as c,Dt as l,b as u,gt as ee,nt as d}from"./three.module-07hRbor4.js";import{n as te,r as ne,t as re}from"./scene-BdOVRsxo.js";import"./mission-D8vr00S1.js";import{p as f}from"./loaders-VxR5Bl13.js";import{t as p}from"./extends-COZGby3T.js";import{t as m}from"./Texture-CIsc25mc.js";import{a as h,c as g,f as _,t as v}from"./globalFogUniforms-CtxQvsRj.js";var y=e(n());function b(e,t){let n=e+`Geometry`;return y.forwardRef(({args:e,children:r,...i},a)=>{let o=y.useRef(null);return y.useImperativeHandle(a,()=>o.current),y.useLayoutEffect(()=>void t?.(o.current)),y.createElement(`mesh`,p({ref:o},i),y.createElement(n,{attach:`geometry`,args:e}),r)})}var x=b(`box`),S=t(),C=`
|
||||
import{r as e}from"./chunk-DECur_0Z.js";import{n as t,r as n,t as r}from"./jsx-runtime-BpGWiA-R.js";import{i,o as a}from"./react-three-fiber.esm-CgPHUpXo.js";import{a as o,i as s}from"./SettingsProvider-CCHVZuSg.js";import{At as c,Dt as l,b as u,gt as ee,nt as d}from"./three.module-07hRbor4.js";import{n as te,r as ne,t as re}from"./scene-BdOVRsxo.js";import{p as f}from"./loaders-CIpiZadQ.js";import{t as p}from"./extends-COZGby3T.js";import{t as m}from"./Texture-CIsc25mc.js";import{a as h,c as g,f as _,t as v}from"./globalFogUniforms-CtxQvsRj.js";var y=e(n());function b(e,t){let n=e+`Geometry`;return y.forwardRef(({args:e,children:r,...i},a)=>{let o=y.useRef(null);return y.useImperativeHandle(a,()=>o.current),y.useLayoutEffect(()=>void t?.(o.current)),y.createElement(`mesh`,p({ref:o},i),y.createElement(n,{attach:`geometry`,args:e}),r)})}var x=b(`box`),S=t(),C=`
|
||||
#include <fog_pars_vertex>
|
||||
|
||||
#ifdef USE_FOG
|
||||
File diff suppressed because one or more lines are too long
1
docs/assets/demoStreaming-vQjQowT8.js
Normal file
1
docs/assets/demoStreaming-vQjQowT8.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
12
docs/assets/index-B1XI52_L.js
Normal file
12
docs/assets/index-B1XI52_L.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/index-DvT5LFSb.css
Normal file
1
docs/assets/index-DvT5LFSb.css
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
import{c as e,n as t,s as n,t as r}from"./manifest-CirqV3Ls.js";import{i}from"./stringUtils-EmGsjr9D.js";import{t as a}from"./logger-z_EpIdIa.js";import{a as o}from"./mission-D8vr00S1.js";function s(e){return e.split(/(?:\r\n|\r|\n)/g).map(e=>e.trim()).filter(Boolean).filter(e=>!e.startsWith(`;`)).map(e=>{let t=e.match(/^(.+)\s(\d+)$/);if(t){let e=parseInt(t[2],10);return{name:t[1],frameCount:e}}else return{name:e,frameCount:1}})}var c=256;function l(e){let t=new DataView(e),n=0,r=t.getUint8(n++),i=new Uint16Array(c*c),a=[],o=e=>{let r=``;for(let i=0;i<e;i++){let e=t.getUint8(n+i);if(e===0)break;r+=String.fromCharCode(e)}return n+=e,r};for(let e=0;e<c*c;e++){let r=t.getUint16(n,!0);n+=2,i[e]=r}n+=256*256;let s=i;for(let e=0;e<8;e++){let r=t.getUint8(n++),i=o(r);e<6&&r>0&&a.push(i)}let l=[];for(let e of a){let e=new Uint8Array(c*c);for(let r=0;r<c*c;r++)e[r]=t.getUint8(n++);l.push(e)}return{version:r,textureNames:a,heightMap:s,alphaMaps:l}}var u=a(`loaders`),d=`/t2-mapper`,f=`${d}/base/`,p=`${d}/magenta.png`;function m(e,t){let i;try{i=r(e)}catch(n){if(t)return u.warn(`Resource "%s" not found — rendering fallback`,e),t;throw n}let[a,o]=n(i);return a?`${f}@vl2/${a}/${o}`:`${f}${o}`}function h(e){return m(`interiors/${e}`).replace(/\.dif$/i,`.glb`)}function g(e){return m(`shapes/${e}`).replace(/\.dts$/i,`.glb`)}function _(t){return t=t.replace(/^terrain\./,``),m(e(`textures/terrain/${t}`),p)}function v(t,n){let r=i(n).split(`/`);return m(e(`${r.length>1?r.slice(0,-1).join(`/`)+`/`:``}${t}`),p)}function y(t){return m(e(`textures/${t}`),p)}function b(e){return m(`audio/${e}`).replace(/\.wav$/i,`.m4a`)}async function x(e){let t=m(`textures/${e}`);return(await(await fetch(t)).text()).split(/(?:\r\n|\r|\n)/).map(e=>{if(e=e.trim(),!e.startsWith(`;`))return e}).filter(Boolean)}async function S(e){let n=t(e),r=await(await fetch(m(n.resourcePath))).arrayBuffer(),i;try{i=new TextDecoder(`utf-8`,{fatal:!0}).decode(r)}catch{i=new TextDecoder(`windows-1252`).decode(r)}return i=i.replaceAll(`<EFBFBD>`,`'`),o(i)}async function C(e){let t=m(`terrains/${e}`);u.debug(`Fetching terrain: %s`,t);let n=await fetch(t);if(!n.ok)throw Error(`[loadTerrain] Failed to fetch ${t}: ${n.status} ${n.statusText}`);let r=await n.arrayBuffer();return u.debug(`Loaded terrain %s: %d bytes`,e,r.byteLength),l(r)}async function w(e){let t=m(e);return s(await(await fetch(t)).text())}export{v as a,w as c,g as d,_ as f,m as i,S as l,f as n,h as o,y as p,b as r,x as s,p as t,C as u};
|
||||
import{c as e,n as t,s as n,t as r}from"./manifest-CirqV3Ls.js";import{i}from"./stringUtils-EmGsjr9D.js";import{t as a}from"./logger-z_EpIdIa.js";import{a as o}from"./mission-Bem2ztlS.js";function s(e){return e.split(/(?:\r\n|\r|\n)/g).map(e=>e.trim()).filter(Boolean).filter(e=>!e.startsWith(`;`)).map(e=>{let t=e.match(/^(.+)\s(\d+)$/);if(t){let e=parseInt(t[2],10);return{name:t[1],frameCount:e}}else return{name:e,frameCount:1}})}var c=256;function l(e){let t=new DataView(e),n=0,r=t.getUint8(n++),i=new Uint16Array(c*c),a=[],o=e=>{let r=``;for(let i=0;i<e;i++){let e=t.getUint8(n+i);if(e===0)break;r+=String.fromCharCode(e)}return n+=e,r};for(let e=0;e<c*c;e++){let r=t.getUint16(n,!0);n+=2,i[e]=r}n+=256*256;let s=i;for(let e=0;e<8;e++){let r=t.getUint8(n++),i=o(r);e<6&&r>0&&a.push(i)}let l=[];for(let e of a){let e=new Uint8Array(c*c);for(let r=0;r<c*c;r++)e[r]=t.getUint8(n++);l.push(e)}return{version:r,textureNames:a,heightMap:s,alphaMaps:l}}var u=a(`loaders`),d=`/t2-mapper`,f=`${d}/base/`,p=`${d}/magenta.png`;function m(e,t){let i;try{i=r(e)}catch(n){if(t)return u.warn(`Resource "%s" not found — rendering fallback`,e),t;throw n}let[a,o]=n(i);return a?`${f}@vl2/${a}/${o}`:`${f}${o}`}function h(e){return m(`interiors/${e}`).replace(/\.dif$/i,`.glb`)}function g(e){return m(`shapes/${e}`).replace(/\.dts$/i,`.glb`)}function _(t){return t=t.replace(/^terrain\./,``),m(e(`textures/terrain/${t}`),p)}function v(t,n){let r=i(n).split(`/`);return m(e(`${r.length>1?r.slice(0,-1).join(`/`)+`/`:``}${t}`),p)}function y(t){return m(e(`textures/${t}`),p)}function b(e){return m(`audio/${e}`).replace(/\.wav$/i,`.m4a`)}async function x(e){let t=m(`textures/${e}`);return(await(await fetch(t)).text()).split(/(?:\r\n|\r|\n)/).map(e=>{if(e=e.trim(),!e.startsWith(`;`))return e}).filter(Boolean)}async function S(e){let n=t(e),r=await(await fetch(m(n.resourcePath))).arrayBuffer(),i;try{i=new TextDecoder(`utf-8`,{fatal:!0}).decode(r)}catch{i=new TextDecoder(`windows-1252`).decode(r)}return i=i.replaceAll(`<EFBFBD>`,`'`),o(i)}async function C(e){let t=m(`terrains/${e}`);u.debug(`Fetching terrain: %s`,t);let n=await fetch(t);if(!n.ok)throw Error(`[loadTerrain] Failed to fetch ${t}: ${n.status} ${n.statusText}`);let r=await n.arrayBuffer();return u.debug(`Loaded terrain %s: %d bytes`,e,r.byteLength),l(r)}async function w(e){let t=m(e);return s(await(await fetch(t)).text())}export{v as a,w as c,g as d,_ as f,m as i,S as l,f as n,h as o,y as p,b as r,x as s,p as t,C as u};
|
||||
29
docs/assets/mission-Bem2ztlS.js
Normal file
29
docs/assets/mission-Bem2ztlS.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
docs/assets/nipplejs-DYp3oo-D.js
Normal file
1
docs/assets/nipplejs-DYp3oo-D.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
docs/assets/streamHelpers-D2N8suZp.js
Normal file
1
docs/assets/streamHelpers-D2N8suZp.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/useBaseQuery-NrPec9_7.js
Normal file
1
docs/assets/useBaseQuery-NrPec9_7.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
import{r as e,t}from"./useBaseQuery-Tbey-UIc.js";function n(n,r){return t(n,e,r)}export{n as t};
|
||||
1
docs/assets/useQuery-FY4YqwDi.js
Normal file
1
docs/assets/useQuery-FY4YqwDi.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e,t}from"./useBaseQuery-NrPec9_7.js";function n(n,r){return t(n,e,r)}export{n as t};
|
||||
|
|
@ -19,16 +19,16 @@
|
|||
<link rel="apple-touch-icon" href="/t2-mapper/icon-512.png" />
|
||||
<meta name="theme-color" content="#067272" />
|
||||
<link rel="preconnect" href="https://www.gstatic.com" crossorigin />
|
||||
<script type="module" crossorigin src="/t2-mapper/assets/index-lyciGARn.js"></script>
|
||||
<script type="module" crossorigin src="/t2-mapper/assets/index-B1XI52_L.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/chunk-DECur_0Z.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/preload-helper-CwUjIIrH.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/three.module-07hRbor4.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/streamHelpers-AIec78DP.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/logger-z_EpIdIa.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/mission-D8vr00S1.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/mission-Bem2ztlS.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/jsx-runtime-BpGWiA-R.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/three.module-07hRbor4.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/traditional-BTL5qX2E.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/react-three-fiber.esm-CgPHUpXo.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/streamHelpers-D2N8suZp.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/stringUtils-EmGsjr9D.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/manifest-CirqV3Ls.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/SettingsProvider-CCHVZuSg.js">
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/scene-BdOVRsxo.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/cameraTourStore-PEzPVGnX.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/engineStore-Dkm20jvr.js">
|
||||
<link rel="stylesheet" crossorigin href="/t2-mapper/assets/index-E-nhzQZH.css">
|
||||
<link rel="stylesheet" crossorigin href="/t2-mapper/assets/index-DvT5LFSb.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
|
|
|||
513
package-lock.json
generated
513
package-lock.json
generated
File diff suppressed because it is too large
Load diff
20
package.json
20
package.json
|
|
@ -30,17 +30,17 @@
|
|||
"typecheck": "tsc --build --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ariakit/react": "^0.4.23",
|
||||
"@ariakit/react": "^0.4.24",
|
||||
"@radix-ui/react-accordion": "^1.2.12",
|
||||
"@react-three/drei": "^10.7.7",
|
||||
"@react-three/fiber": "^9.5.0",
|
||||
"@tanstack/react-query": "^5.90.21",
|
||||
"@tanstack/react-query": "^5.95.2",
|
||||
"ignore": "^7.0.5",
|
||||
"lodash.orderby": "^4.6.0",
|
||||
"match-sorter": "^8.2.0",
|
||||
"nipplejs": "^0.10.2",
|
||||
"nuqs": "^2.8.9",
|
||||
"picomatch": "^4.0.3",
|
||||
"picomatch": "^4.0.4",
|
||||
"pino": "^10.3.1",
|
||||
"pino-pretty": "^13.1.3",
|
||||
"react": "^19.2.4",
|
||||
|
|
@ -51,14 +51,14 @@
|
|||
"three": "^0.182.0",
|
||||
"tsx": "^4.21.0",
|
||||
"unzipper": "^0.12.3",
|
||||
"ws": "^8.19.0",
|
||||
"ws": "^8.20.0",
|
||||
"zustand": "^5.0.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.29.0",
|
||||
"@eslint/js": "^9.39.4",
|
||||
"@inquirer/prompts": "^8.3.2",
|
||||
"@rolldown/plugin-babel": "^0.2.1",
|
||||
"@rolldown/plugin-babel": "^0.2.2",
|
||||
"@types/babel__core": "^7.20.5",
|
||||
"@types/express": "^5.0.6",
|
||||
"@types/lodash.orderby": "^4.6.9",
|
||||
|
|
@ -66,7 +66,7 @@
|
|||
"@types/picomatch": "^4.0.2",
|
||||
"@types/react": "^19.2.14",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/three": "^0.182.0",
|
||||
"@types/three": "^0.183.1",
|
||||
"@types/unzipper": "^0.10.11",
|
||||
"@types/ws": "^8.18.1",
|
||||
"@vitejs/plugin-react": "^6.0.1",
|
||||
|
|
@ -82,11 +82,11 @@
|
|||
"peggy": "^5.1.0",
|
||||
"prettier": "^3.8.1",
|
||||
"prettier-plugin-glsl": "^0.2.4",
|
||||
"puppeteer": "^24.39.1",
|
||||
"puppeteer": "^24.40.0",
|
||||
"rimraf": "^6.1.3",
|
||||
"typescript": "~5.9.3",
|
||||
"typescript-eslint": "^8.57.0",
|
||||
"vite": "^8.0.0",
|
||||
"vitest": "^4.1.0"
|
||||
"typescript-eslint": "^8.57.2",
|
||||
"vite": "^8.0.2",
|
||||
"vitest": "^4.1.1"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
160
src/components/Button.module.css
Normal file
160
src/components/Button.module.css
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
@layer button {
|
||||
.Button {
|
||||
flex: 1 1 auto;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: auto;
|
||||
height: auto;
|
||||
min-width: 28px;
|
||||
min-height: 32px;
|
||||
gap: 8px;
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding: 4px 8px;
|
||||
border-radius: 5px;
|
||||
background: rgba(0, 98, 179, 0.8);
|
||||
border: 1px solid rgba(255, 255, 255, 0.4);
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
transform: translate(0, 0);
|
||||
transition:
|
||||
background 0.2s,
|
||||
border-color 0.2s;
|
||||
}
|
||||
|
||||
.Button svg {
|
||||
opacity: 0.8;
|
||||
flex: 0 0 auto;
|
||||
pointer-events: none;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.Button:disabled {
|
||||
opacity: 0.6;
|
||||
box-shadow: inset 0 0 12px 1px rgba(54, 54, 54, 0.5);
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.Button {
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-left: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-right: 1px solid rgba(200, 200, 200, 0.3);
|
||||
border-bottom: 1px solid rgba(200, 200, 200, 0.3);
|
||||
background: rgba(3, 82, 147, 0.6);
|
||||
}
|
||||
|
||||
.Button:not(:disabled):hover {
|
||||
background: rgba(0, 98, 179, 0.8);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.Button svg {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.Button:not(:disabled):hover svg {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.Button:not(:disabled):active,
|
||||
.Button[aria-expanded="true"] {
|
||||
background: rgba(0, 98, 179, 0.7);
|
||||
border-color: rgba(255, 255, 255, 0.3);
|
||||
transform: translate(0, 1px);
|
||||
}
|
||||
|
||||
.Button[data-active="true"] {
|
||||
background: rgba(0, 117, 213, 0.9);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.Icon {
|
||||
}
|
||||
|
||||
.ButtonLabel {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.ButtonHint {
|
||||
font-size: 10px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.ButtonGroup {
|
||||
width: 100%;
|
||||
flex: 1 0 auto;
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.ButtonGroup .Button {
|
||||
flex: 1 0 0;
|
||||
flex-direction: column;
|
||||
gap: 1px;
|
||||
font-size: 22px;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
background: rgba(27, 79, 135, 0.7);
|
||||
box-shadow: inset 0 0 10px rgba(4, 40, 71, 0.5);
|
||||
}
|
||||
|
||||
.ButtonGroup .Button svg {
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.ButtonGroup .Button[data-active="true"] {
|
||||
background: rgba(0, 101, 203, 0.8);
|
||||
box-shadow:
|
||||
inset 0 2px 3px rgba(8, 189, 255, 0.5),
|
||||
inset 0 -2px 6px rgba(0, 18, 40, 0.5);
|
||||
}
|
||||
|
||||
.ButtonGroup .Button[data-active="true"] svg {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.ButtonGroup .Button:not(:first-child) {
|
||||
border-left: 0;
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.ButtonGroup .Button:not(:last-child) {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
.DestructiveActionButton {
|
||||
composes: Button;
|
||||
flex: 0 0 auto;
|
||||
margin: 0 10px 0 0;
|
||||
font-size: 16px;
|
||||
min-width: 28px;
|
||||
min-height: 28px;
|
||||
padding: 2px;
|
||||
background: rgba(213, 66, 58, 0.7);
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.DestructiveActionButton:not(:disabled):hover {
|
||||
background: rgba(229, 70, 59, 0.9);
|
||||
}
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
.DestructiveActionButton {
|
||||
min-width: 36px;
|
||||
min-height: 36px;
|
||||
margin-right: 6px;
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
23
src/components/ChooseMapButton.tsx
Normal file
23
src/components/ChooseMapButton.tsx
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
import { RiLandscapeFill } from "react-icons/ri";
|
||||
import styles from "./Button.module.css";
|
||||
|
||||
export function ChooseMapButton({
|
||||
isActive = false,
|
||||
onClick,
|
||||
}: {
|
||||
isActive?: boolean;
|
||||
onClick?: () => void;
|
||||
}) {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Button}
|
||||
onClick={onClick}
|
||||
data-active={isActive}
|
||||
>
|
||||
<RiLandscapeFill />
|
||||
<span className={styles.ButtonLabel}>Explore</span>
|
||||
<span className={styles.ButtonHint}>Browse maps</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
@ -1,31 +1,26 @@
|
|||
.Root {
|
||||
composes: IconButton from "./InspectorControls.module.css";
|
||||
composes: LabelledButton from "./InspectorControls.module.css";
|
||||
.Button {
|
||||
composes: Button from "./Button.module.css";
|
||||
}
|
||||
|
||||
.Root[data-copied="true"] {
|
||||
.Button[data-copied="true"] {
|
||||
background: rgba(0, 117, 213, 0.9);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.ClipboardCheck {
|
||||
.ClipboardIcon {
|
||||
display: none;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.Root[data-copied="true"] .ClipboardCheck {
|
||||
.Button[data-copied="true"] .ClipboardIcon {
|
||||
display: block;
|
||||
animation: showClipboardCheck 220ms linear infinite;
|
||||
}
|
||||
|
||||
.Root[data-copied="true"] .MapPin {
|
||||
.Button[data-copied="true"] .PinIcon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ButtonLabel {
|
||||
composes: ButtonLabel from "./InspectorControls.module.css";
|
||||
}
|
||||
|
||||
@keyframes showClipboardCheck {
|
||||
0% {
|
||||
opacity: 1;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import { FaMapPin } from "react-icons/fa";
|
|||
import { FaClipboardCheck } from "react-icons/fa6";
|
||||
import { Camera, Quaternion, Vector3 } from "three";
|
||||
import { useSettings } from "./SettingsProvider";
|
||||
import buttonStyles from "./Button.module.css";
|
||||
import styles from "./CopyCoordinatesButton.module.css";
|
||||
|
||||
function encodeViewHash({
|
||||
|
|
@ -58,7 +59,7 @@ export function CopyCoordinatesButton({
|
|||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Root}
|
||||
className={styles.Button}
|
||||
aria-label="Link to coordinates"
|
||||
title="Copy the current coordinates to URL"
|
||||
onClick={handleCopyLink}
|
||||
|
|
@ -66,9 +67,9 @@ export function CopyCoordinatesButton({
|
|||
data-copied={showCopied ? "true" : "false"}
|
||||
id="copyCoordinatesButton"
|
||||
>
|
||||
<FaMapPin className={styles.MapPin} />
|
||||
<FaClipboardCheck className={styles.ClipboardCheck} />
|
||||
<span className={styles.ButtonLabel}> Link to coordinates</span>
|
||||
<FaMapPin className={styles.PinIcon} />
|
||||
<FaClipboardCheck className={styles.ClipboardIcon} />
|
||||
<span className={buttonStyles.ButtonLabel}> Link to coordinates</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,30 +2,39 @@
|
|||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
padding: 8px 12px;
|
||||
padding: 8px 10px;
|
||||
font-size: 13px;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
.Root {
|
||||
padding: 6px 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.PlayPause {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
flex-shrink: 0;
|
||||
composes: Button from "./Button.module.css";
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 0;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
font-size: 12px;
|
||||
/* border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-radius: 4px;
|
||||
background: rgba(3, 82, 147, 0.6);
|
||||
color: #fff;
|
||||
font-size: 11px;
|
||||
cursor: pointer;
|
||||
cursor: pointer; */
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.PlayPause:hover {
|
||||
background: rgba(0, 98, 179, 0.8);
|
||||
@media (pointer: coarse) {
|
||||
.PlayPause {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -35,6 +44,18 @@
|
|||
white-space: nowrap;
|
||||
}
|
||||
|
||||
@media (max-width: 599px) {
|
||||
.Time {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 399px) {
|
||||
.Time {
|
||||
font-size: 11px;
|
||||
}
|
||||
}
|
||||
|
||||
.Seek[type="range"] {
|
||||
flex: 1 0 20px;
|
||||
width: 20px;
|
||||
|
|
@ -53,6 +74,14 @@
|
|||
font-size: 13px;
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
.Speed,
|
||||
.CameraMode {
|
||||
font-size: 14px;
|
||||
padding: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.Field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
|||
24
src/components/ExitTourButton.module.css
Normal file
24
src/components/ExitTourButton.module.css
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
.Button {
|
||||
composes: DestructiveActionButton from "./Button.module.css";
|
||||
gap: 6px;
|
||||
padding: 4px 10px 4px 6px;
|
||||
margin: 0 10px 0 auto;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.ButtonLabel {
|
||||
composes: ButtonLabel from "./Button.module.css";
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
@media (max-width: 799px) {
|
||||
.Button {
|
||||
padding-right: 6px;
|
||||
margin: 0 10px 0 0;
|
||||
}
|
||||
|
||||
.Button .ButtonLabel {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
16
src/components/ExitTourButton.tsx
Normal file
16
src/components/ExitTourButton.tsx
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import { cameraTourStore } from "../state/cameraTourStore";
|
||||
import { HiMiniArrowLeftEndOnRectangle } from "react-icons/hi2";
|
||||
import styles from "./ExitTourButton.module.css";
|
||||
|
||||
export function ExitTourButton() {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Button}
|
||||
onClick={() => cameraTourStore.getState().cancel()}
|
||||
>
|
||||
<HiMiniArrowLeftEndOnRectangle />
|
||||
<span className={styles.ButtonLabel}>Exit tour</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
@ -2,6 +2,8 @@
|
|||
position: relative;
|
||||
max-width: calc(100dvw - 40px);
|
||||
max-height: calc(100dvh - 40px);
|
||||
min-width: 120px;
|
||||
min-height: 120px;
|
||||
background: rgba(20, 37, 38, 0.8);
|
||||
border: 1px solid rgba(65, 131, 139, 0.6);
|
||||
border-radius: 4px;
|
||||
|
|
|
|||
17
src/components/GameDialogSpinner.tsx
Normal file
17
src/components/GameDialogSpinner.tsx
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import { LoadingIndicator } from "./LoadingIndicator";
|
||||
import styles from "./GameDialog.module.css";
|
||||
|
||||
export function GameDialogSpinner({ onClose }: { onClose?: () => void }) {
|
||||
return (
|
||||
<div
|
||||
className={styles.Overlay}
|
||||
onClick={(event) => {
|
||||
onClose?.();
|
||||
}}
|
||||
>
|
||||
<div className={styles.Dialog}>
|
||||
<LoadingIndicator isLoading />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -425,9 +425,12 @@ export function InputConsumer() {
|
|||
for (const frame of frames) {
|
||||
dYaw += frame.deltaYaw;
|
||||
dPitch += frame.deltaPitch;
|
||||
x = frame.x; // latest wins
|
||||
y = frame.y;
|
||||
z = frame.z;
|
||||
// Use the value with the largest magnitude across all producers.
|
||||
// This prevents a keyboard-only frame (x=0) from overwriting
|
||||
// joystick movement from another producer in the same frame.
|
||||
if (Math.abs(frame.x) > Math.abs(x)) x = frame.x;
|
||||
if (Math.abs(frame.y) > Math.abs(y)) y = frame.y;
|
||||
if (Math.abs(frame.z) > Math.abs(z)) z = frame.z;
|
||||
frameDelta += frame.delta;
|
||||
for (let i = 0; i < frame.triggers.length; i++) {
|
||||
if (frame.triggers[i]) frameTriggers[i] = true;
|
||||
|
|
|
|||
|
|
@ -13,50 +13,6 @@
|
|||
gap: 0;
|
||||
}
|
||||
|
||||
.ButtonGroup {
|
||||
width: 100%;
|
||||
flex: 1 0 auto;
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.ButtonGroup .IconButton {
|
||||
flex: 1 0 0;
|
||||
flex-direction: column;
|
||||
gap: 1px;
|
||||
font-size: 22px;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
background: rgba(27, 79, 135, 0.7);
|
||||
box-shadow: inset 0 0 10px rgba(4, 40, 71, 0.5);
|
||||
}
|
||||
|
||||
.ButtonGroup .IconButton svg {
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.ButtonGroup .IconButton[data-active="true"] {
|
||||
background: rgba(0, 101, 203, 0.8);
|
||||
box-shadow:
|
||||
inset 0 2px 3px rgba(8, 189, 255, 0.5),
|
||||
inset 0 -2px 6px rgba(0, 18, 40, 0.5);
|
||||
}
|
||||
|
||||
.ButtonGroup .IconButton[data-active="true"] svg {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.ButtonGroup .IconButton:not(:first-child) {
|
||||
border-left: 0;
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.ButtonGroup .IconButton:not(:last-child) {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
.Group {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
|
@ -65,12 +21,6 @@
|
|||
gap: 20px;
|
||||
}
|
||||
|
||||
.LabelledButton {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.CheckboxField {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
|
|
@ -161,100 +111,9 @@
|
|||
grid-row: 2;
|
||||
}
|
||||
|
||||
.IconButton {
|
||||
flex: 1 1 auto;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: auto;
|
||||
height: auto;
|
||||
min-width: 28px;
|
||||
min-height: 32px;
|
||||
gap: 8px;
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding: 4px 8px;
|
||||
border-radius: 5px;
|
||||
background: rgba(0, 98, 179, 0.8);
|
||||
border: 1px solid rgba(255, 255, 255, 0.4);
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
transform: translate(0, 0);
|
||||
transition:
|
||||
background 0.2s,
|
||||
border-color 0.2s;
|
||||
}
|
||||
|
||||
.IconButton svg {
|
||||
opacity: 0.8;
|
||||
flex: 0 0 auto;
|
||||
pointer-events: none;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.IconButton:disabled {
|
||||
opacity: 0.6;
|
||||
box-shadow: inset 0 0 12px 1px rgba(54, 54, 54, 0.5);
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.IconButton {
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-left: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-right: 1px solid rgba(200, 200, 200, 0.3);
|
||||
border-bottom: 1px solid rgba(200, 200, 200, 0.3);
|
||||
background: rgba(3, 82, 147, 0.6);
|
||||
}
|
||||
|
||||
.IconButton:not(:disabled):hover {
|
||||
background: rgba(0, 98, 179, 0.8);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.IconButton svg {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.IconButton:not(:disabled):hover svg {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.IconButton:not(:disabled):active,
|
||||
.IconButton[aria-expanded="true"] {
|
||||
background: rgba(0, 98, 179, 0.7);
|
||||
border-color: rgba(255, 255, 255, 0.3);
|
||||
transform: translate(0, 1px);
|
||||
}
|
||||
|
||||
.IconButton[data-active="true"] {
|
||||
background: rgba(0, 117, 213, 0.9);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.ButtonLabel {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.ButtonHint {
|
||||
font-size: 10px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.Toggle {
|
||||
composes: IconButton;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.MapInfoButton {
|
||||
composes: IconButton;
|
||||
composes: LabelledButton;
|
||||
.MapInfoButton,
|
||||
.ShowScoresButton {
|
||||
composes: Button from "./Button.module.css";
|
||||
}
|
||||
|
||||
.ForceRenderButton {
|
||||
|
|
@ -269,6 +128,19 @@
|
|||
cursor: pointer;
|
||||
}
|
||||
|
||||
.CloseSidebarButton {
|
||||
composes: Button from "./Button.module.css";
|
||||
margin: 12px;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
@media (min-width: 900px) {
|
||||
.CloseSidebarButton {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
.Tools {
|
||||
padding-top: 12px;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
import { useEffect, useState, useRef, RefObject, memo } from "react";
|
||||
import { RiLandscapeFill } from "react-icons/ri";
|
||||
import { FaRotateRight } from "react-icons/fa6";
|
||||
import { LuClipboardList, LuUsers } from "react-icons/lu";
|
||||
import { Camera } from "three";
|
||||
import {
|
||||
useControls,
|
||||
|
|
@ -20,6 +18,10 @@ import { useRecording } from "./RecordingProvider";
|
|||
import { useDataSource, useMissionName } from "../state/gameEntityStore";
|
||||
import { useLiveSelector } from "../state/liveConnectionStore";
|
||||
import { hasMission } from "../manifest";
|
||||
import { ChooseMapButton } from "./ChooseMapButton";
|
||||
import { MapInfoButton } from "./MapInfoButton";
|
||||
import { ShowScoresButton } from "./ShowScoresButton";
|
||||
import buttonStyles from "./Button.module.css";
|
||||
import styles from "./InspectorControls.module.css";
|
||||
|
||||
const DEFAULT_PANELS = ["controls", "preferences", "audio", "timeline"];
|
||||
|
|
@ -35,6 +37,7 @@ export const InspectorControls = memo(function InspectorControls({
|
|||
choosingMap,
|
||||
cameraRef,
|
||||
invalidateRef,
|
||||
onClose,
|
||||
}: {
|
||||
missionName: string;
|
||||
missionType?: string;
|
||||
|
|
@ -46,6 +49,7 @@ export const InspectorControls = memo(function InspectorControls({
|
|||
choosingMap?: boolean;
|
||||
cameraRef: RefObject<Camera | null>;
|
||||
invalidateRef: RefObject<(() => void) | null>;
|
||||
onClose: () => void;
|
||||
}) {
|
||||
const isTouch = useTouchDevice();
|
||||
const dataSource = useDataSource();
|
||||
|
|
@ -130,19 +134,13 @@ export const InspectorControls = memo(function InspectorControls({
|
|||
data-open={settingsOpen}
|
||||
>
|
||||
<div className={styles.Tools}>
|
||||
<div className={styles.ButtonGroup}>
|
||||
<button
|
||||
type="button"
|
||||
className={styles.IconButton}
|
||||
data-active={
|
||||
(dataSource === "map" && !recording) || choosingMap
|
||||
<div className={buttonStyles.ButtonGroup}>
|
||||
<ChooseMapButton
|
||||
isActive={
|
||||
(dataSource === "map" && !recording) || (choosingMap ?? false)
|
||||
}
|
||||
onClick={onChooseMap}
|
||||
>
|
||||
<RiLandscapeFill />
|
||||
<span className={styles.ButtonLabel}>Explore</span>
|
||||
<span className={styles.ButtonHint}>Browse maps</span>
|
||||
</button>
|
||||
/>
|
||||
<LoadDemoButton
|
||||
isActive={!choosingMap && recording?.source === "demo"}
|
||||
choosingMap={choosingMap}
|
||||
|
|
@ -161,26 +159,9 @@ export const InspectorControls = memo(function InspectorControls({
|
|||
cameraRef={cameraRef}
|
||||
disabled={!missionInManifest}
|
||||
/>
|
||||
<button
|
||||
type="button"
|
||||
className={styles.MapInfoButton}
|
||||
aria-label="Show map info"
|
||||
onClick={onOpenMapInfo}
|
||||
disabled={!missionInManifest}
|
||||
>
|
||||
<LuClipboardList />
|
||||
<span className={styles.ButtonLabel}>Show map info</span>
|
||||
</button>
|
||||
<MapInfoButton missionName={missionName} onClick={onOpenMapInfo} />
|
||||
{onOpenScoreScreen && (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.MapInfoButton}
|
||||
aria-label="Show scores"
|
||||
onClick={onOpenScoreScreen}
|
||||
>
|
||||
<LuUsers />
|
||||
<span className={styles.ButtonLabel}>Show scores</span>
|
||||
</button>
|
||||
<ShowScoresButton onClick={onOpenScoreScreen} />
|
||||
)}
|
||||
</div>
|
||||
<div className={styles.Accordions}>
|
||||
|
|
@ -476,6 +457,9 @@ export const InspectorControls = memo(function InspectorControls({
|
|||
</Accordion>
|
||||
</AccordionGroup>
|
||||
</div>
|
||||
<button className={styles.CloseSidebarButton} onClick={onClose}>
|
||||
<span className={buttonStyles.ButtonLabel}>Close</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,23 +1,15 @@
|
|||
.Root {
|
||||
composes: IconButton from "./InspectorControls.module.css";
|
||||
composes: LabelledButton from "./InspectorControls.module.css";
|
||||
.JoinServerButton {
|
||||
composes: Button from "./Button.module.css";
|
||||
}
|
||||
/* Text label ("Connect", "Connecting...") follows standard breakpoint rules. */
|
||||
.TextLabel {
|
||||
composes: ButtonLabel from "./InspectorControls.module.css";
|
||||
|
||||
.Icon {
|
||||
composes: Icon from "./Button.module.css";
|
||||
}
|
||||
/* Ping label is always visible regardless of breakpoint. */
|
||||
.PingLabel {
|
||||
composes: ButtonLabel from "./InspectorControls.module.css";
|
||||
display: flex !important;
|
||||
margin-right: 2px;
|
||||
}
|
||||
.LiveIcon {
|
||||
/* font-size: 15px; */
|
||||
}
|
||||
.Pulsing {
|
||||
|
||||
.JoinServerButton[data-connected="true"] .Icon {
|
||||
animation: blink 1.2s ease-out infinite;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
0% {
|
||||
opacity: 1;
|
||||
|
|
@ -26,7 +18,3 @@
|
|||
opacity: 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
.ButtonHint {
|
||||
composes: ButtonHint from "./InspectorControls.module.css";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { BsFillLightningChargeFill } from "react-icons/bs";
|
||||
import { cameraTourStore } from "../state/cameraTourStore";
|
||||
import { useLiveSelector } from "../state/liveConnectionStore";
|
||||
import buttonStyles from "./Button.module.css";
|
||||
import styles from "./JoinServerButton.module.css";
|
||||
|
||||
export function JoinServerButton({
|
||||
|
|
@ -22,9 +23,10 @@ export function JoinServerButton({
|
|||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Root}
|
||||
className={styles.JoinServerButton}
|
||||
aria-label={isLive ? "Connected – click to disconnect" : "Join server"}
|
||||
title={isLive ? "Connected – click to disconnect" : "Join server"}
|
||||
data-connected={isLive}
|
||||
onClick={() => {
|
||||
cameraTourStore.getState().cancel();
|
||||
if (isLive) {
|
||||
|
|
@ -35,12 +37,10 @@ export function JoinServerButton({
|
|||
}}
|
||||
data-active={isActive}
|
||||
>
|
||||
<BsFillLightningChargeFill
|
||||
className={`${styles.LiveIcon} ${isLive ? styles.Pulsing : ""}`}
|
||||
/>
|
||||
<BsFillLightningChargeFill className={styles.Icon} />
|
||||
<>
|
||||
<span className={styles.TextLabel}>Live</span>
|
||||
<span className={styles.ButtonHint}>
|
||||
<span className={buttonStyles.ButtonLabel}>Live</span>
|
||||
<span className={buttonStyles.ButtonHint}>
|
||||
{isConnecting ? "Connecting…" : isLive ? "Connected" : "Join a game"}
|
||||
</span>
|
||||
</>
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
.Root {
|
||||
composes: IconButton from "./InspectorControls.module.css";
|
||||
composes: LabelledButton from "./InspectorControls.module.css";
|
||||
}
|
||||
|
||||
.ButtonLabel {
|
||||
composes: ButtonLabel from "./InspectorControls.module.css";
|
||||
}
|
||||
|
||||
.ButtonHint {
|
||||
composes: ButtonHint from "./InspectorControls.module.css";
|
||||
}
|
||||
|
||||
.DemoIcon {
|
||||
/* font-size: 20px; */
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@ import { cameraTourStore } from "../state/cameraTourStore";
|
|||
import { demoTimelineStore } from "../state/demoTimelineStore";
|
||||
import { liveConnectionStore } from "../state/liveConnectionStore";
|
||||
import { usePlaybackActions, useRecording } from "./RecordingProvider";
|
||||
import styles from "./LoadDemoButton.module.css";
|
||||
import styles from "./Button.module.css";
|
||||
|
||||
const log = createLogger("LoadDemoButton");
|
||||
|
||||
|
|
@ -113,7 +113,7 @@ export function LoadDemoButton({
|
|||
/>
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Root}
|
||||
className={styles.Button}
|
||||
aria-label={isDemoLoaded ? "Unload demo" : "Load demo (.rec)"}
|
||||
title={isDemoLoaded ? "Unload demo" : "Load demo (.rec)"}
|
||||
onClick={handleClick}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,11 @@
|
|||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
|
||||
.LoadingIndicator[data-indeterminate="true"] .Progress,
|
||||
.LoadingIndicator[data-indeterminate="true"] .ProgressText {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
|
|
|
|||
|
|
@ -2,21 +2,24 @@ import styles from "./LoadingIndicator.module.css";
|
|||
|
||||
export function LoadingIndicator({
|
||||
isLoading,
|
||||
progress,
|
||||
progress = null,
|
||||
}: {
|
||||
isLoading: boolean;
|
||||
progress: number;
|
||||
progress?: number | null;
|
||||
}) {
|
||||
const percent = (progress ?? 0) * 100;
|
||||
|
||||
return (
|
||||
<div className={styles.LoadingIndicator} data-complete={!isLoading}>
|
||||
<div
|
||||
className={styles.LoadingIndicator}
|
||||
data-complete={!isLoading}
|
||||
data-indeterminate={progress == null}
|
||||
>
|
||||
<div className={styles.Spinner} />
|
||||
<div className={styles.Progress}>
|
||||
<div
|
||||
className={styles.ProgressBar}
|
||||
style={{ width: `${progress * 100}%` }}
|
||||
/>
|
||||
<div className={styles.ProgressBar} style={{ width: `${percent}%` }} />
|
||||
</div>
|
||||
<div className={styles.ProgressText}>{Math.round(progress * 100)}%</div>
|
||||
<div className={styles.ProgressText}>{Math.round(percent)}%</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
35
src/components/MapInfoButton.tsx
Normal file
35
src/components/MapInfoButton.tsx
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
import { LuClipboardList } from "react-icons/lu";
|
||||
import { hasMission } from "../manifest";
|
||||
import { useDataSource, useMissionName } from "../state/gameEntityStore";
|
||||
import styles from "./Button.module.css";
|
||||
|
||||
export function MapInfoButton({
|
||||
missionName,
|
||||
onClick,
|
||||
}: {
|
||||
missionName: string;
|
||||
onClick: () => void;
|
||||
}) {
|
||||
const dataSource = useDataSource();
|
||||
const storeMissionName = useMissionName();
|
||||
const hasStreamData = dataSource === "demo" || dataSource === "live";
|
||||
// When streaming, the URL query param may not reflect the actual map.
|
||||
// Use the store's mission name (from the server) for the manifest check.
|
||||
const effectiveMissionName = hasStreamData ? storeMissionName : missionName;
|
||||
const missionInManifest = effectiveMissionName
|
||||
? hasMission(effectiveMissionName)
|
||||
: false;
|
||||
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Button}
|
||||
aria-label="Show map info"
|
||||
onClick={onClick}
|
||||
disabled={!missionInManifest}
|
||||
>
|
||||
<LuClipboardList />
|
||||
<span className={styles.ButtonLabel}>Show map info</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
@ -26,25 +26,6 @@
|
|||
view-transition-class: layout;
|
||||
}
|
||||
|
||||
.CancelButton {
|
||||
padding: 4px 6px;
|
||||
font-size: 12px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-radius: 3px;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.CancelButton:hover {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.Sidebar {
|
||||
position: relative;
|
||||
grid-area: sidebar;
|
||||
|
|
@ -87,67 +68,10 @@
|
|||
z-index: 1;
|
||||
}
|
||||
|
||||
.ToggleSidebarButton {
|
||||
flex: 0 0 auto;
|
||||
display: grid;
|
||||
place-content: center;
|
||||
min-width: 30px;
|
||||
min-height: 30px;
|
||||
padding: 2px;
|
||||
margin: 0 0 0 8px;
|
||||
font-size: 24px;
|
||||
border-radius: 4px;
|
||||
background: transparent;
|
||||
color: #fff;
|
||||
border: 0;
|
||||
cursor: pointer;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.ToggleSidebarButton:active,
|
||||
.ToggleSidebarButton[data-active="true"] {
|
||||
opacity: 1;
|
||||
transform: translateY(1px);
|
||||
}
|
||||
|
||||
.ToggleSidebarButton[data-orientation="top"] {
|
||||
display: none;
|
||||
min-height: 48px;
|
||||
min-width: 48px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.ToggleSidebarButton:not(:disabled):hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.ToggleSidebarButton svg {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.Backdrop {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.CloseSidebarButton {
|
||||
composes: IconButton from "./InspectorControls.module.css";
|
||||
composes: LabelledButton from "./InspectorControls.module.css";
|
||||
width: calc(100% - 24px);
|
||||
margin: 12px;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.ButtonLabel {
|
||||
composes: ButtonLabel from "./InspectorControls.module.css";
|
||||
}
|
||||
|
||||
.CloseSidebarButton .ButtonLabel {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
@media (max-width: 899px) {
|
||||
.Frame {
|
||||
display: grid;
|
||||
|
|
@ -175,14 +99,6 @@
|
|||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.ToggleSidebarButton[data-orientation="left"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ToggleSidebarButton[data-orientation="top"] {
|
||||
display: grid;
|
||||
}
|
||||
|
||||
.Backdrop {
|
||||
display: block;
|
||||
position: fixed;
|
||||
|
|
@ -193,44 +109,4 @@
|
|||
background: rgba(0, 0, 0, 0.7);
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.CancelButton {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 900px) {
|
||||
.CloseSidebarButton {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
.ToggleSidebarButton {
|
||||
font-size: 28px;
|
||||
}
|
||||
}
|
||||
|
||||
.ExitTourButton {
|
||||
composes: ActionButton from "./StreamingMissionInfo.module.css";
|
||||
gap: 6px;
|
||||
padding: 4px 10px 4px 6px;
|
||||
margin: 0 10px 0 auto;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.ExitTourButton .ButtonLabel {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
@media (max-width: 799px) {
|
||||
.ExitTourButton {
|
||||
padding-right: 6px;
|
||||
margin: 0 10px 0 0;
|
||||
}
|
||||
|
||||
.ExitTourButton .ButtonLabel {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,15 +42,11 @@ import {
|
|||
useMissionType,
|
||||
} from "../state/gameEntityStore";
|
||||
import { getMissionInfo } from "../manifest";
|
||||
import {
|
||||
LuPanelLeftClose,
|
||||
LuPanelLeftOpen,
|
||||
LuPanelTopClose,
|
||||
LuPanelTopOpen,
|
||||
} from "react-icons/lu";
|
||||
import { cameraTourStore, useCameraTour } from "../state/cameraTourStore";
|
||||
import { useTouchDevice } from "./useTouchDevice";
|
||||
import { HiMiniArrowLeftEndOnRectangle } from "react-icons/hi2";
|
||||
import { GameDialogSpinner } from "./GameDialogSpinner";
|
||||
import { ToggleSidebarButton } from "./ToggleSidebarButton";
|
||||
import { ExitTourButton } from "./ExitTourButton";
|
||||
import styles from "./MapInspector.module.css";
|
||||
|
||||
function ViewTransition({ children }: { children: ReactNode }) {
|
||||
|
|
@ -233,30 +229,20 @@ export function MapInspector() {
|
|||
<main className={styles.Frame}>
|
||||
<RecordingProvider>
|
||||
<header className={styles.Toolbar}>
|
||||
<button
|
||||
type="button"
|
||||
className={styles.ToggleSidebarButton}
|
||||
data-orientation="top"
|
||||
aria-label={sidebarOpen ? "Close sidebar" : "Open sidebar"}
|
||||
title={sidebarOpen ? "Close sidebar" : "Open sidebar"}
|
||||
onClick={(event) => {
|
||||
<ToggleSidebarButton
|
||||
orientation="top"
|
||||
isOpen={sidebarOpen}
|
||||
onClick={() => {
|
||||
setSidebarOpen((open) => !open);
|
||||
}}
|
||||
>
|
||||
{sidebarOpen ? <LuPanelTopClose /> : <LuPanelTopOpen />}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className={styles.ToggleSidebarButton}
|
||||
data-orientation="left"
|
||||
aria-label={sidebarOpen ? "Close sidebar" : "Open sidebar"}
|
||||
title={sidebarOpen ? "Close sidebar" : "Open sidebar"}
|
||||
onClick={(event) => {
|
||||
/>
|
||||
<ToggleSidebarButton
|
||||
orientation="left"
|
||||
isOpen={sidebarOpen}
|
||||
onClick={() => {
|
||||
setSidebarOpen((open) => !open);
|
||||
}}
|
||||
>
|
||||
{sidebarOpen ? <LuPanelLeftClose /> : <LuPanelLeftOpen />}
|
||||
</button>
|
||||
/>
|
||||
<Activity mode={hasStreamData && !choosingMap ? "visible" : "hidden"}>
|
||||
<StreamingMissionInfo />
|
||||
</Activity>
|
||||
|
|
@ -268,28 +254,8 @@ export function MapInspector() {
|
|||
autoFocus={choosingMap}
|
||||
onCancel={handleCancelChoosingMap}
|
||||
/>
|
||||
{choosingMap && (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.CancelButton}
|
||||
onClick={() => {
|
||||
setChoosingMap(false);
|
||||
}}
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
)}
|
||||
</Activity>
|
||||
{isTourActive && (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.ExitTourButton}
|
||||
onClick={() => cameraTourStore.getState().cancel()}
|
||||
>
|
||||
<HiMiniArrowLeftEndOnRectangle />
|
||||
<span className={styles.ButtonLabel}>Exit tour</span>
|
||||
</button>
|
||||
)}
|
||||
{isTourActive && <ExitTourButton />}
|
||||
</header>
|
||||
{sidebarOpen ? <div className={styles.Backdrop} /> : null}
|
||||
<Activity mode={sidebarOpen ? "visible" : "hidden"}>
|
||||
|
|
@ -309,15 +275,10 @@ export function MapInspector() {
|
|||
}
|
||||
onChooseMap={handleChooseMap}
|
||||
onCancelChoosingMap={handleCancelChoosingMap}
|
||||
/>
|
||||
<button
|
||||
className={styles.CloseSidebarButton}
|
||||
onClick={(event) => {
|
||||
onClose={() => {
|
||||
setSidebarOpen(false);
|
||||
}}
|
||||
>
|
||||
<span className={styles.ButtonLabel}>Close</span>
|
||||
</button>
|
||||
/>
|
||||
</div>
|
||||
</Activity>
|
||||
<InputProvider>
|
||||
|
|
@ -360,7 +321,11 @@ export function MapInspector() {
|
|||
</footer>
|
||||
{mapInfoOpen ? (
|
||||
<ViewTransition>
|
||||
<Suspense>
|
||||
<Suspense
|
||||
fallback={
|
||||
<GameDialogSpinner onClose={() => setMapInfoOpen(false)} />
|
||||
}
|
||||
>
|
||||
<MapInfoDialog
|
||||
onClose={() => setMapInfoOpen(false)}
|
||||
missionName={missionName}
|
||||
|
|
@ -371,14 +336,24 @@ export function MapInspector() {
|
|||
) : null}
|
||||
{serverBrowserOpen ? (
|
||||
<ViewTransition>
|
||||
<Suspense>
|
||||
<Suspense
|
||||
fallback={
|
||||
<GameDialogSpinner
|
||||
onClose={() => setServerBrowserOpen(false)}
|
||||
/>
|
||||
}
|
||||
>
|
||||
<ServerBrowser onClose={() => setServerBrowserOpen(false)} />
|
||||
</Suspense>
|
||||
</ViewTransition>
|
||||
) : null}
|
||||
{scoreScreenOpen ? (
|
||||
<ViewTransition>
|
||||
<Suspense>
|
||||
<Suspense
|
||||
fallback={
|
||||
<GameDialogSpinner onClose={() => setScoreScreenOpen(false)} />
|
||||
}
|
||||
>
|
||||
<ScoreScreen onClose={() => setScoreScreenOpen(false)} />
|
||||
</Suspense>
|
||||
</ViewTransition>
|
||||
|
|
|
|||
|
|
@ -82,8 +82,9 @@
|
|||
|
||||
.Popover {
|
||||
z-index: 100;
|
||||
min-width: 320px;
|
||||
min-width: 360px;
|
||||
max-height: var(--popover-available-height, 90vh);
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
overscroll-behavior: contain;
|
||||
background: rgba(20, 20, 20, 0.95);
|
||||
|
|
@ -92,6 +93,20 @@
|
|||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
|
||||
@media (max-width: 499px) {
|
||||
.PopoverWrapper {
|
||||
transform: translate3d(0, 44px, 0) !important;
|
||||
left: 8px !important;
|
||||
right: 8px !important;
|
||||
width: auto !important;
|
||||
max-width: none !important;
|
||||
}
|
||||
|
||||
.Popover {
|
||||
min-width: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.List {
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
|
@ -203,12 +218,19 @@
|
|||
display: grid;
|
||||
place-content: center;
|
||||
background: transparent;
|
||||
padding: 4px 16px 4px 4px;
|
||||
margin: 0 0 0 -8px;
|
||||
padding: 6px;
|
||||
border: 0;
|
||||
font-size: 24px;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
@media (pointer: fine) {
|
||||
.CloseButton {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.CloseButton[data-open="false"] {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
|
@ -224,9 +246,3 @@
|
|||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 900px) {
|
||||
.CloseButton {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -180,6 +180,11 @@ export function MissionSelect({
|
|||
const combobox = useComboboxStore({
|
||||
resetValueOnHide: true,
|
||||
selectedValue: value,
|
||||
setOpen: (open) => {
|
||||
if (!open) {
|
||||
onCancel?.();
|
||||
}
|
||||
},
|
||||
setSelectedValue: (newValue) => {
|
||||
if (newValue) {
|
||||
let newMissionType = missionTypeRef.current;
|
||||
|
|
@ -325,11 +330,27 @@ export function MissionSelect({
|
|||
)}
|
||||
<kbd className={styles.Shortcut}>{isMac ? "⌘K" : "^K"}</kbd>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
className={styles.CloseButton}
|
||||
data-open={isOpen}
|
||||
onClick={() => {
|
||||
combobox.hide();
|
||||
onCancel?.();
|
||||
}}
|
||||
>
|
||||
<IoMdCloseCircle />
|
||||
</button>
|
||||
<ComboboxPopover
|
||||
gutter={4}
|
||||
fitViewport
|
||||
sameWidth
|
||||
fixed
|
||||
autoFocusOnHide={false}
|
||||
className={styles.Popover}
|
||||
wrapperProps={{
|
||||
className: styles.PopoverWrapper,
|
||||
}}
|
||||
onKeyDown={(event) => {
|
||||
if (!event.metaKey) {
|
||||
event.stopPropagation();
|
||||
|
|
@ -358,17 +379,6 @@ export function MissionSelect({
|
|||
)}
|
||||
</ComboboxList>
|
||||
</ComboboxPopover>
|
||||
<button
|
||||
type="button"
|
||||
className={styles.CloseButton}
|
||||
data-open={isOpen}
|
||||
onClick={() => {
|
||||
combobox.hide();
|
||||
onCancel?.();
|
||||
}}
|
||||
>
|
||||
<IoMdCloseCircle />
|
||||
</button>
|
||||
</ComboboxProvider>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
16
src/components/ShowScoresButton.tsx
Normal file
16
src/components/ShowScoresButton.tsx
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import { LuUsers } from "react-icons/lu";
|
||||
import styles from "./Button.module.css";
|
||||
|
||||
export function ShowScoresButton({ onClick }: { onClick: () => void }) {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Button}
|
||||
aria-label="Show scores"
|
||||
onClick={onClick}
|
||||
>
|
||||
<LuUsers />
|
||||
<span className={styles.ButtonLabel}>Show scores</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
@ -54,21 +54,9 @@
|
|||
color: #eceae7;
|
||||
}
|
||||
|
||||
.ActionButton {
|
||||
composes: IconButton from "./InspectorControls.module.css";
|
||||
flex: 0 0 auto;
|
||||
margin: 0 10px 0 0;
|
||||
font-size: 16px;
|
||||
min-width: 28px;
|
||||
min-height: 28px;
|
||||
padding: 2px;
|
||||
background: rgba(213, 66, 58, 0.7);
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.ActionButton:not(:disabled):hover {
|
||||
background: rgba(229, 70, 59, 0.9);
|
||||
}
|
||||
.EjectButton,
|
||||
.DisconnectButton {
|
||||
composes: DestructiveActionButton from "./Button.module.css";
|
||||
}
|
||||
|
||||
.EjectIcon {
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ export function StreamingMissionInfo() {
|
|||
{dataSource === "demo" ? (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.ActionButton}
|
||||
className={styles.EjectButton}
|
||||
title="Unload demo"
|
||||
aria-label="Unload demo"
|
||||
onClick={handleEject}
|
||||
|
|
@ -121,7 +121,7 @@ export function StreamingMissionInfo() {
|
|||
) : isLive ? (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.ActionButton}
|
||||
className={styles.DisconnectButton}
|
||||
title="Disconnect"
|
||||
aria-label="Disconnect"
|
||||
onClick={handleDisconnect}
|
||||
|
|
|
|||
55
src/components/ToggleSidebarButton.module.css
Normal file
55
src/components/ToggleSidebarButton.module.css
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
.Button {
|
||||
flex: 0 0 auto;
|
||||
display: grid;
|
||||
place-content: center;
|
||||
min-width: 30px;
|
||||
min-height: 30px;
|
||||
padding: 2px;
|
||||
margin: 0 0 0 8px;
|
||||
font-size: 24px;
|
||||
border-radius: 4px;
|
||||
background: transparent;
|
||||
color: #fff;
|
||||
border: 0;
|
||||
cursor: pointer;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.Button:active,
|
||||
.Button[data-active="true"] {
|
||||
opacity: 1;
|
||||
transform: translateY(1px);
|
||||
}
|
||||
|
||||
.Button[data-orientation="top"] {
|
||||
display: none;
|
||||
min-height: 48px;
|
||||
min-width: 48px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
.Button:not(:disabled):hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.Button svg {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@media (max-width: 899px) {
|
||||
.Button[data-orientation="left"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.Button[data-orientation="top"] {
|
||||
display: grid;
|
||||
}
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
.Button {
|
||||
font-size: 28px;
|
||||
}
|
||||
}
|
||||
40
src/components/ToggleSidebarButton.tsx
Normal file
40
src/components/ToggleSidebarButton.tsx
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
import {
|
||||
LuPanelLeftClose,
|
||||
LuPanelLeftOpen,
|
||||
LuPanelTopClose,
|
||||
LuPanelTopOpen,
|
||||
} from "react-icons/lu";
|
||||
import styles from "./ToggleSidebarButton.module.css";
|
||||
|
||||
export function ToggleSidebarButton({
|
||||
isOpen,
|
||||
orientation,
|
||||
onClick,
|
||||
}: {
|
||||
isOpen: boolean;
|
||||
orientation: "left" | "top";
|
||||
onClick: () => void;
|
||||
}) {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.Button}
|
||||
data-orientation={orientation}
|
||||
aria-label={isOpen ? "Close sidebar" : "Open sidebar"}
|
||||
title={isOpen ? "Close sidebar" : "Open sidebar"}
|
||||
onClick={onClick}
|
||||
>
|
||||
{orientation === "top" ? (
|
||||
isOpen ? (
|
||||
<LuPanelTopClose />
|
||||
) : (
|
||||
<LuPanelTopOpen />
|
||||
)
|
||||
) : isOpen ? (
|
||||
<LuPanelLeftClose />
|
||||
) : (
|
||||
<LuPanelLeftOpen />
|
||||
)}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
@layer button;
|
||||
|
||||
:root {
|
||||
--monospace-font:
|
||||
ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono",
|
||||
|
|
|
|||
|
|
@ -126,6 +126,17 @@ export interface MutableEntity {
|
|||
audioMinLoopGap?: number;
|
||||
audioMaxLoopGap?: number;
|
||||
sceneData?: SceneObject;
|
||||
/** Force field visual data extracted from ForceFieldBareData datablock. */
|
||||
forceFieldData?: {
|
||||
textures: string[];
|
||||
color: [number, number, number];
|
||||
baseTranslucency: number;
|
||||
dimensions: [number, number, number];
|
||||
framesPerSec: number;
|
||||
scrollSpeed: number;
|
||||
umapping: number;
|
||||
vmapping: number;
|
||||
};
|
||||
}
|
||||
|
||||
export type RuntimeControlObject = {
|
||||
|
|
@ -949,6 +960,37 @@ export abstract class StreamEngine implements StreamingPlayback {
|
|||
entity.maintainEmitterId = trailEmitterId;
|
||||
}
|
||||
}
|
||||
|
||||
// Force field visual data from ForceFieldBareData datablock.
|
||||
if (entity.className === "ForceFieldBare" && blockData) {
|
||||
const color1 = blockData.color1 as
|
||||
| { r: number; g: number; b: number }
|
||||
| undefined;
|
||||
const textures: string[] = [];
|
||||
for (let i = 0; i < 5; i++) {
|
||||
const tex = blockData[`texture${i}`] as string | undefined;
|
||||
if (tex) textures.push(tex);
|
||||
}
|
||||
// Use scale from ghost data as box dimensions (same as mission bridge).
|
||||
const scale = data.scale as
|
||||
| { x: number; y: number; z: number }
|
||||
| undefined;
|
||||
entity.forceFieldData = {
|
||||
textures,
|
||||
color: color1
|
||||
? [color1.r, color1.g, color1.b]
|
||||
: [1, 1, 1],
|
||||
baseTranslucency:
|
||||
(blockData.baseTranslucency as number) ?? 1,
|
||||
dimensions: scale
|
||||
? [scale.y, scale.z, scale.x]
|
||||
: [1, 1, 1],
|
||||
framesPerSec: (blockData.framesPerSec as number) ?? 1,
|
||||
scrollSpeed: (blockData.scrollSpeed as number) ?? 0,
|
||||
umapping: (blockData.umapping as number) ?? 1,
|
||||
vmapping: (blockData.vmapping as number) ?? 1,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Weapon images (Player)
|
||||
|
|
@ -2212,6 +2254,7 @@ export abstract class StreamEngine implements StreamingPlayback {
|
|||
audioMinLoopGap: entity.audioMinLoopGap,
|
||||
audioMaxLoopGap: entity.audioMaxLoopGap,
|
||||
sceneData: entity.sceneData,
|
||||
forceFieldData: entity.forceFieldData,
|
||||
});
|
||||
}
|
||||
return entities;
|
||||
|
|
|
|||
|
|
@ -158,6 +158,19 @@ export function streamEntityToGameEntity(
|
|||
return {
|
||||
...positionedBase(entity, spawnTime),
|
||||
renderType: "ForceFieldBare",
|
||||
forceFieldData: entity.forceFieldData
|
||||
? {
|
||||
textures: entity.forceFieldData.textures,
|
||||
color: entity.forceFieldData.color,
|
||||
baseTranslucency: entity.forceFieldData.baseTranslucency,
|
||||
numFrames: entity.forceFieldData.textures.length,
|
||||
framesPerSec: entity.forceFieldData.framesPerSec,
|
||||
scrollSpeed: entity.forceFieldData.scrollSpeed,
|
||||
umapping: entity.forceFieldData.umapping,
|
||||
vmapping: entity.forceFieldData.vmapping,
|
||||
dimensions: entity.forceFieldData.dimensions,
|
||||
}
|
||||
: undefined,
|
||||
} satisfies ForceFieldBareEntity;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -155,6 +155,17 @@ export interface StreamEntity {
|
|||
audioMaxLoopGap?: number;
|
||||
/** Scene infrastructure data (terrain, interior, sky, etc.). */
|
||||
sceneData?: SceneObject;
|
||||
/** Force field visual data from ForceFieldBareData datablock. */
|
||||
forceFieldData?: {
|
||||
textures: string[];
|
||||
color: [number, number, number];
|
||||
baseTranslucency: number;
|
||||
dimensions: [number, number, number];
|
||||
framesPerSec: number;
|
||||
scrollSpeed: number;
|
||||
umapping: number;
|
||||
vmapping: number;
|
||||
};
|
||||
}
|
||||
|
||||
export interface StreamCamera {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"version": "v1",
|
||||
"packages": {
|
||||
"t2-demo-parser": {
|
||||
"signature": "b0026a52c40b7329d00f4799f2a27d10",
|
||||
"signature": "f9f389ebeb34e934d3ebc34814eedd5b",
|
||||
"file": true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue