mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-07-08 21:24:32 +00:00
simplify and unify entity management
This commit is contained in:
parent
dbff4e9fe3
commit
b6975da8ed
135 changed files with 2535 additions and 1545 deletions
|
|
@ -1 +0,0 @@
|
|||
import{c as e,d as t,f as n,g as r,h as i,l as a,m as o,o as s,p as c,s as l,u}from"./SettingsProvider-DVIFsPwe.js";export{s as AudioEmitter,l as audioBufferCache,e as getCachedAudioBuffer,a as getEffectiveSoundRate,u as getSoundGeneration,t as playOneShotSound,n as resolveAudioProfile,c as setAdjustAudioSpeedFlag,o as stopAllTrackedSounds,i as trackSound,r as untrackSound};
|
||||
1
docs/assets/AudioEmitter-C10MNZ17.js
Normal file
1
docs/assets/AudioEmitter-C10MNZ17.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{s as e}from"./SettingsProvider-D-grt5cc.js";import{a as t,c as n,i as r,l as i,n as a,o,r as s,s as c,t as l}from"./AudioEmitter-EsMJ6jds.js";export{l as AudioEmitter,a as audioBufferCache,s as getCachedAudioBuffer,e as getEffectiveSoundRate,r as getSoundGeneration,t as playOneShotSound,o as resolveAudioProfile,c as stopAllTrackedSounds,n as trackSound,i as untrackSound};
|
||||
1
docs/assets/AudioEmitter-EsMJ6jds.js
Normal file
1
docs/assets/AudioEmitter-EsMJ6jds.js
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -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{k as i}from"./index-Ds_qp2Yy.js";var a=e(n(),1),o=t(),s={InputForm:`_InputForm_18kom_1`,Input:`_Input_18kom_1`},c=r();function l(){let e=(0,o.c)(8),[t,n]=(0,a.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};
|
||||
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{U as i}from"./index-BEKjcnfN.js";var a=e(n(),1),o=t(),s={InputForm:`_InputForm_18kom_1`,Input:`_Input_18kom_1`},c=r();function l(){let e=(0,o.c)(8),[t,n]=(0,a.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{r as t}from"./jsx-runtime-BpGWiA-R.js";import{a as n,b as r,c as i,g as a,h as o,l as s,u as c}from"./SettingsProvider-DVIFsPwe.js";import{r as l}from"./loaders-BhaVxgpz.js";import{c as u}from"./three.module-DRRYkRPO.js";import{i as d,r as f}from"./engineStore-DeZJbWme.js";var p=e(t(),1);function m(){let{audioLoader:e,audioListener:t}=r(),{audioEnabled:m}=n(),h=d(e=>e.playback.streamSnapshot?.chatMessages),g=d(e=>e.playback.streamSnapshot?.timeSec),_=(0,p.useRef)(new WeakSet),v=(0,p.useRef)(new Map);return(0,p.useEffect)(()=>{if(!m||!e||!t||!h?.length||g==null)return;let n=_.current,r=v.current;for(let d of h)if(!n.has(d)&&(n.add(d),d.soundPath&&!(Math.abs(g-d.timeSec)>2)))try{let n=l(d.soundPath),p=d.soundPitch??1;f.getState().playback.rate;let m=d.sender,h=c();i(n,e,e=>{if(h!==c())return;if(m){let e=r.get(m);if(e){try{e.stop()}catch{}a(e);try{e.disconnect()}catch{}r.delete(m)}}let n=new u(t);n.setBuffer(e),n.setPlaybackRate(s(p)),o(n,p),m&&r.set(m,n),n.play(),n.source.onended=()=>{a(n);try{n.disconnect()}catch{}m&&r.get(m)===n&&r.delete(m)}})}catch{}},[m,e,t,h,g]),null}export{m as ChatSoundPlayer};
|
||||
1
docs/assets/ChatSoundPlayer-D4Cfif0J.js
Normal file
1
docs/assets/ChatSoundPlayer-D4Cfif0J.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,s as r}from"./SettingsProvider-D-grt5cc.js";import{i}from"./engineStore-Mono9lyt.js";import{c as a}from"./three.module-C9W4LJrj.js";import{r as o}from"./index-BEKjcnfN.js";import{c as s,i as c,l,p as u,r as d}from"./AudioEmitter-EsMJ6jds.js";var f=e(t(),1);function p(){let{audioLoader:e,audioListener:t}=u(),{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 u of m)if(!n.has(u)&&(n.add(u),u.soundPath&&!(Math.abs(h-u.timeSec)>2)))try{let n=o(u.soundPath),f=u.soundPitch??1,p=u.sender,m=c();d(n,e,e=>{if(m!==c())return;if(p){let e=i.get(p);if(e){try{e.stop()}catch{}l(e);try{e.disconnect()}catch{}i.delete(p)}}let n=new a(t);n.setBuffer(e),n.setPlaybackRate(r(f)),s(n,f),p&&i.set(p,n),n.play(),n.source.onended=()=>{l(n);try{n.disconnect()}catch{}p&&i.get(p)===n&&i.delete(p)}})}catch{}},[p,e,t,m,h]),null}export{p as ChatSoundPlayer};
|
||||
1
docs/assets/DebugBounds-BnJbEQUF.js
Normal file
1
docs/assets/DebugBounds-BnJbEQUF.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{E as i,Ft as a,p as o}from"./three.module-C9W4LJrj.js";var s=t(),c=e(n(),1),l=r(),u=(0,l.jsx)(`lineBasicMaterial`,{color:`#ff0000`,depthTest:!1,depthWrite:!1,fog:!1,transparent:!0});function d({size:e}){return(0,l.jsx)(`lineSegments`,{geometry:(0,c.useMemo)(()=>new i(new o(...e)),[e[0],e[1],e[2]]),renderOrder:9999,children:u})}function f(e){let t=(0,s.c)(4),{radius:n}=e,r=n===void 0?1:n,o;t[0]===r?o=t[1]:(o=new i(new a(r,8,6)),t[0]=r,t[1]=o);let c=o,d;return t[2]===c?d=t[3]:(d=(0,l.jsx)(`lineSegments`,{geometry:c,renderOrder:9999,children:u}),t[2]=c,t[3]=d),d}export{f as n,d as t};
|
||||
1
docs/assets/DebugElements-BFAGz36f.js
Normal file
1
docs/assets/DebugElements-BFAGz36f.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-CD18QK1u.js";import{t as s}from"./Html-DcxB1JCg.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};
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -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{C as i,D as a,E as o,O as s,S as c,T as l,u,w as d}from"./index-Ds_qp2Yy.js";import{n as f,t as p}from"./gr-P7ZS2BjD.js";var m=e(n(),1),h=t(),g={Root:`_Root_flggk_1`,PlayPause:`_PlayPause_flggk_16 _Button_p0g82_2`,Time:`_Time_flggk_36`,Seek:`_Seek_flggk_54`,Speed:`_Speed_flggk_61`,CameraMode:`_CameraMode_flggk_62`,Field:`_Field_flggk_80`},_=r();function v(e){return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,`0`)}`}function y(){let e=(0,h.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,m.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,`×`]},e)}export{y as DemoPlaybackControls};
|
||||
1
docs/assets/DemoPlaybackControls-q8VgZTNM.js
Normal file
1
docs/assets/DemoPlaybackControls-q8VgZTNM.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{B as i,H as a,I as o,L as s,R as c,V as l,w as u,z as d}from"./index-BEKjcnfN.js";import{n as f,t as p}from"./gr-C6l4behh.js";var m=e(n(),1),h=t(),g={Root:`_Root_flggk_1`,PlayPause:`_PlayPause_flggk_16 _Button_p0g82_2`,Time:`_Time_flggk_36`,Seek:`_Seek_flggk_54`,Speed:`_Speed_flggk_61`,CameraMode:`_CameraMode_flggk_62`,Field:`_Field_flggk_80`},_=r();function v(e){return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,`0`)}`}function y(){let e=(0,h.c)(42),t=l(),n=d(),r=s(),y=c(),x=a(),{play:S,pause:C,seek:w,setSpeed:T}=i(),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,m.useEffect)(E,D);let O;e[6]!==T||e[7]!==x?(O=()=>{let e=o.indexOf(x);e>0&&T(o[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=o.indexOf(x);e<o.length-1&&T(o[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=o.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,`×`]},e)}export{y as DemoPlaybackControls};
|
||||
75
docs/assets/ForceFieldBare-Bpn0b911.js
Normal file
75
docs/assets/ForceFieldBare-Bpn0b911.js
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
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-CD18QK1u.js";import{a}from"./SettingsProvider-D-grt5cc.js";import{r as o}from"./cameraTourStore-DQ989o2x.js";import{Ot as s,Ut as c,b as l,jt as u,p as d}from"./three.module-C9W4LJrj.js";import{t as f}from"./Texture-D2i1vM3o.js";import{p}from"./index-BEKjcnfN.js";import{t as m}from"./DebugBounds-BnJbEQUF.js";import{t as h}from"./DebugSuspense-D7OBM5vj.js";var g=e(n(),1),_=t(),v=`
|
||||
#include <fog_pars_vertex>
|
||||
|
||||
varying vec2 vUv;
|
||||
|
||||
void main() {
|
||||
vUv = uv;
|
||||
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
|
||||
gl_Position = projectionMatrix * mvPosition;
|
||||
#include <fog_vertex>
|
||||
}
|
||||
`,y=`
|
||||
#include <fog_pars_fragment>
|
||||
|
||||
uniform sampler2D frame0;
|
||||
uniform sampler2D frame1;
|
||||
uniform sampler2D frame2;
|
||||
uniform sampler2D frame3;
|
||||
uniform sampler2D frame4;
|
||||
uniform int currentFrame;
|
||||
uniform float vScroll;
|
||||
uniform vec2 uvScale;
|
||||
uniform vec3 tintColor;
|
||||
uniform float opacity;
|
||||
uniform float opacityFactor;
|
||||
|
||||
varying vec2 vUv;
|
||||
|
||||
void main() {
|
||||
// Scale and scroll UVs
|
||||
vec2 scrolledUv = vec2(vUv.x * uvScale.x, vUv.y * uvScale.y + vScroll);
|
||||
|
||||
// Sample the current frame
|
||||
vec4 texColor;
|
||||
if (currentFrame == 0) {
|
||||
texColor = texture2D(frame0, scrolledUv);
|
||||
} else if (currentFrame == 1) {
|
||||
texColor = texture2D(frame1, scrolledUv);
|
||||
} else if (currentFrame == 2) {
|
||||
texColor = texture2D(frame2, scrolledUv);
|
||||
} else if (currentFrame == 3) {
|
||||
texColor = texture2D(frame3, scrolledUv);
|
||||
} else {
|
||||
texColor = texture2D(frame4, scrolledUv);
|
||||
}
|
||||
|
||||
// Tribes 2 GL_MODULATE: output = texture * vertexColor
|
||||
// No gamma correction - textures use NoColorSpace and values pass through
|
||||
// directly to display, matching how WaterBlock handles sRGB textures.
|
||||
vec3 modulatedColor = texColor.rgb * tintColor;
|
||||
|
||||
float adjustedOpacity = opacity * opacityFactor;
|
||||
|
||||
gl_FragColor = vec4(modulatedColor, adjustedOpacity);
|
||||
|
||||
// Custom fog for additive blending: fade out rather than blend to fog color.
|
||||
// Standard fog (mix toward fogColor) doesn't work with additive blending
|
||||
// because we'd still be adding fogColor to the framebuffer.
|
||||
// Uses Torque's quadratic haze formula for consistency.
|
||||
#ifdef USE_FOG
|
||||
float dist = vFogDepth;
|
||||
float fogFactor = 0.0;
|
||||
if (dist > fogNear) {
|
||||
if (dist >= fogFar) {
|
||||
fogFactor = 1.0;
|
||||
} else {
|
||||
float fogScale = 1.0 / (fogFar - fogNear);
|
||||
float distFactor = (dist - fogNear) * fogScale - 1.0;
|
||||
fogFactor = 1.0 - distFactor * distFactor;
|
||||
}
|
||||
}
|
||||
gl_FragColor.a *= 1.0 - fogFactor;
|
||||
#endif
|
||||
}
|
||||
`;function b({textures:e,scale:t,umapping:n,vmapping:r,color:i,baseTranslucency:a}){let o=[...t].sort((e,t)=>t-e),s=new c(o[0]*n,o[1]*r),d=e[0];return new u({uniforms:{frame0:{value:d},frame1:{value:e[1]??d},frame2:{value:e[2]??d},frame3:{value:e[3]??d},frame4:{value:e[4]??d},currentFrame:{value:0},vScroll:{value:0},uvScale:{value:s},tintColor:{value:new l(...i)},opacity:{value:a},opacityFactor:{value:1},fogColor:{value:new l},fogNear:{value:1},fogFar:{value:2e3}},vertexShader:v,fragmentShader:y,transparent:!0,blending:2,side:2,depthWrite:!1,fog:!0})}var x=r();function S(e){e.wrapS=e.wrapT=s,e.colorSpace=``,e.flipY=!1,e.needsUpdate=!0}function C(e){let t=(0,_.c)(7),[n,r,i]=e,a;t[0]!==n||t[1]!==r||t[2]!==i?(a=new d(n,r,i),a.translate(n/2,r/2,i/2),t[0]=n,t[1]=r,t[2]=i,t[3]=a):a=t[3];let o=a,s,c;return t[4]===o?(s=t[5],c=t[6]):(s=()=>()=>o.dispose(),c=[o],t[4]=o,t[5]=s,t[6]=c),(0,g.useEffect)(s,c),o}function w(e){let t=(0,_.c)(10),{scale:n,color:r,baseTranslucency:i}=e,a=C(n),o;t[0]!==r[0]||t[1]!==r[1]||t[2]!==r[2]?(o=new l(r[0],r[1],r[2]),t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=o):o=t[3];let s=o,c=i*1,u;t[4]!==s||t[5]!==c?(u=(0,x.jsx)(`meshBasicMaterial`,{color:s,transparent:!0,opacity:c,blending:2,side:2,depthWrite:!1,fog:!1}),t[4]=s,t[5]=c,t[6]=u):u=t[6];let d;return t[7]!==a||t[8]!==u?(d=(0,x.jsx)(`mesh`,{geometry:a,renderOrder:1,children:u}),t[7]=a,t[8]=u,t[9]=d):d=t[9],d}function T({scale:e,data:t}){let{animationEnabled:n}=a(),r=C(e),o=f((0,g.useMemo)(()=>t.textures.map(e=>p(e)),[t.textures]),e=>{e.forEach(e=>S(e))}),s=(0,g.useMemo)(()=>b({textures:o,scale:e,umapping:t.umapping,vmapping:t.vmapping,color:t.color,baseTranslucency:t.baseTranslucency}),[o,e,t]);(0,g.useEffect)(()=>()=>s.dispose(),[s]);let c=(0,g.useRef)(0);return i((e,r)=>{if(!n){c.current=0,s.uniforms.currentFrame.value=0,s.uniforms.vScroll.value=0;return}c.current+=r,s.uniforms.currentFrame.value=Math.floor(c.current*t.framesPerSec)%t.numFrames,s.uniforms.vScroll.value=c.current*t.scrollSpeed}),(0,x.jsx)(`mesh`,{geometry:r,material:s,renderOrder:1})}function E(e){let t=(0,_.c)(20),{entity:n}=e,r=n.forceFieldData,i=r.dimensions,a=o(n.id);if(r.textures.map(D).length===0){let e;return t[0]!==r.baseTranslucency||t[1]!==r.color||t[2]!==i?(e=(0,x.jsx)(w,{scale:i,color:r.color,baseTranslucency:r.baseTranslucency}),t[0]=r.baseTranslucency,t[1]=r.color,t[2]=i,t[3]=e):e=t[3],e}let s;t[4]!==r.baseTranslucency||t[5]!==r.color||t[6]!==i?(s=(0,x.jsx)(w,{scale:i,color:r.color,baseTranslucency:r.baseTranslucency}),t[4]=r.baseTranslucency,t[5]=r.color,t[6]=i,t[7]=s):s=t[7];let c;t[8]!==r||t[9]!==i?(c=(0,x.jsx)(T,{scale:i,data:r}),t[8]=r,t[9]=i,t[10]=c):c=t[10];let l;t[11]!==s||t[12]!==c?(l=(0,x.jsx)(h,{name:`ForceField`,fallback:s,children:c}),t[11]=s,t[12]=c,t[13]=l):l=t[13];let u;t[14]!==a||t[15]!==i?(u=a&&i&&(0,x.jsx)(m,{size:i}),t[14]=a,t[15]=i,t[16]=u):u=t[16];let d;return t[17]!==l||t[18]!==u?(d=(0,x.jsxs)(x.Fragment,{children:[l,u]}),t[17]=l,t[18]=u,t[19]=d):d=t[19],d}function D(e){return p(e)}export{E as ForceFieldBare};
|
||||
|
|
@ -1,75 +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{o as i}from"./Html-DrHEhPVE.js";import{a}from"./SettingsProvider-DVIFsPwe.js";import{p as o}from"./loaders-BhaVxgpz.js";import{At as s,Dt as c,Ht as l,b as u,p as d}from"./three.module-DRRYkRPO.js";import{t as f}from"./Texture-D7437V2F.js";import{t as p}from"./DebugSuspense-CNky_EQQ.js";var m=e(n(),1),h=t(),g=`
|
||||
#include <fog_pars_vertex>
|
||||
|
||||
varying vec2 vUv;
|
||||
|
||||
void main() {
|
||||
vUv = uv;
|
||||
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
|
||||
gl_Position = projectionMatrix * mvPosition;
|
||||
#include <fog_vertex>
|
||||
}
|
||||
`,_=`
|
||||
#include <fog_pars_fragment>
|
||||
|
||||
uniform sampler2D frame0;
|
||||
uniform sampler2D frame1;
|
||||
uniform sampler2D frame2;
|
||||
uniform sampler2D frame3;
|
||||
uniform sampler2D frame4;
|
||||
uniform int currentFrame;
|
||||
uniform float vScroll;
|
||||
uniform vec2 uvScale;
|
||||
uniform vec3 tintColor;
|
||||
uniform float opacity;
|
||||
uniform float opacityFactor;
|
||||
|
||||
varying vec2 vUv;
|
||||
|
||||
void main() {
|
||||
// Scale and scroll UVs
|
||||
vec2 scrolledUv = vec2(vUv.x * uvScale.x, vUv.y * uvScale.y + vScroll);
|
||||
|
||||
// Sample the current frame
|
||||
vec4 texColor;
|
||||
if (currentFrame == 0) {
|
||||
texColor = texture2D(frame0, scrolledUv);
|
||||
} else if (currentFrame == 1) {
|
||||
texColor = texture2D(frame1, scrolledUv);
|
||||
} else if (currentFrame == 2) {
|
||||
texColor = texture2D(frame2, scrolledUv);
|
||||
} else if (currentFrame == 3) {
|
||||
texColor = texture2D(frame3, scrolledUv);
|
||||
} else {
|
||||
texColor = texture2D(frame4, scrolledUv);
|
||||
}
|
||||
|
||||
// Tribes 2 GL_MODULATE: output = texture * vertexColor
|
||||
// No gamma correction - textures use NoColorSpace and values pass through
|
||||
// directly to display, matching how WaterBlock handles sRGB textures.
|
||||
vec3 modulatedColor = texColor.rgb * tintColor;
|
||||
|
||||
float adjustedOpacity = opacity * opacityFactor;
|
||||
|
||||
gl_FragColor = vec4(modulatedColor, adjustedOpacity);
|
||||
|
||||
// Custom fog for additive blending: fade out rather than blend to fog color.
|
||||
// Standard fog (mix toward fogColor) doesn't work with additive blending
|
||||
// because we'd still be adding fogColor to the framebuffer.
|
||||
// Uses Torque's quadratic haze formula for consistency.
|
||||
#ifdef USE_FOG
|
||||
float dist = vFogDepth;
|
||||
float fogFactor = 0.0;
|
||||
if (dist > fogNear) {
|
||||
if (dist >= fogFar) {
|
||||
fogFactor = 1.0;
|
||||
} else {
|
||||
float fogScale = 1.0 / (fogFar - fogNear);
|
||||
float distFactor = (dist - fogNear) * fogScale - 1.0;
|
||||
fogFactor = 1.0 - distFactor * distFactor;
|
||||
}
|
||||
}
|
||||
gl_FragColor.a *= 1.0 - fogFactor;
|
||||
#endif
|
||||
}
|
||||
`;function v({textures:e,scale:t,umapping:n,vmapping:r,color:i,baseTranslucency:a}){let o=[...t].sort((e,t)=>t-e),c=new l(o[0]*n,o[1]*r),d=e[0];return new s({uniforms:{frame0:{value:d},frame1:{value:e[1]??d},frame2:{value:e[2]??d},frame3:{value:e[3]??d},frame4:{value:e[4]??d},currentFrame:{value:0},vScroll:{value:0},uvScale:{value:c},tintColor:{value:new u(...i)},opacity:{value:a},opacityFactor:{value:1},fogColor:{value:new u},fogNear:{value:1},fogFar:{value:2e3}},vertexShader:g,fragmentShader:_,transparent:!0,blending:2,side:2,depthWrite:!1,fog:!0})}var y=r();function b(e){e.wrapS=e.wrapT=c,e.colorSpace=``,e.flipY=!1,e.needsUpdate=!0}function x(e){let t=(0,h.c)(7),[n,r,i]=e,a;t[0]!==n||t[1]!==r||t[2]!==i?(a=new d(n,r,i),a.translate(n/2,r/2,i/2),t[0]=n,t[1]=r,t[2]=i,t[3]=a):a=t[3];let o=a,s,c;return t[4]===o?(s=t[5],c=t[6]):(s=()=>()=>o.dispose(),c=[o],t[4]=o,t[5]=s,t[6]=c),(0,m.useEffect)(s,c),o}function S(e){let t=(0,h.c)(10),{scale:n,color:r,baseTranslucency:i}=e,a=x(n),o;t[0]!==r[0]||t[1]!==r[1]||t[2]!==r[2]?(o=new u(r[0],r[1],r[2]),t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=o):o=t[3];let s=o,c=i*1,l;t[4]!==s||t[5]!==c?(l=(0,y.jsx)(`meshBasicMaterial`,{color:s,transparent:!0,opacity:c,blending:2,side:2,depthWrite:!1,fog:!1}),t[4]=s,t[5]=c,t[6]=l):l=t[6];let d;return t[7]!==a||t[8]!==l?(d=(0,y.jsx)(`mesh`,{geometry:a,renderOrder:1,children:l}),t[7]=a,t[8]=l,t[9]=d):d=t[9],d}function C({scale:e,data:t}){let{animationEnabled:n}=a(),r=x(e),s=f((0,m.useMemo)(()=>t.textures.map(e=>o(e)),[t.textures]),e=>{e.forEach(e=>b(e))}),c=(0,m.useMemo)(()=>v({textures:s,scale:e,umapping:t.umapping,vmapping:t.vmapping,color:t.color,baseTranslucency:t.baseTranslucency}),[s,e,t]);(0,m.useEffect)(()=>()=>c.dispose(),[c]);let l=(0,m.useRef)(0);return i((e,r)=>{if(!n){l.current=0,c.uniforms.currentFrame.value=0,c.uniforms.vScroll.value=0;return}l.current+=r,c.uniforms.currentFrame.value=Math.floor(l.current*t.framesPerSec)%t.numFrames,c.uniforms.vScroll.value=l.current*t.scrollSpeed}),(0,y.jsx)(`mesh`,{geometry:r,material:c,renderOrder:1})}function w(e){let t=(0,h.c)(14),{entity:n}=e,r=n.forceFieldData,i=r.dimensions;if(r.textures.map(T).length===0){let e;return t[0]!==r.baseTranslucency||t[1]!==r.color||t[2]!==i?(e=(0,y.jsx)(S,{scale:i,color:r.color,baseTranslucency:r.baseTranslucency}),t[0]=r.baseTranslucency,t[1]=r.color,t[2]=i,t[3]=e):e=t[3],e}let a;t[4]!==r.baseTranslucency||t[5]!==r.color||t[6]!==i?(a=(0,y.jsx)(S,{scale:i,color:r.color,baseTranslucency:r.baseTranslucency}),t[4]=r.baseTranslucency,t[5]=r.color,t[6]=i,t[7]=a):a=t[7];let o;t[8]!==r||t[9]!==i?(o=(0,y.jsx)(C,{scale:i,data:r}),t[8]=r,t[9]=i,t[10]=o):o=t[10];let s;return t[11]!==a||t[12]!==o?(s=(0,y.jsx)(p,{name:`ForceField`,fallback:a,children:o}),t[11]=a,t[12]=o,t[13]=s):s=t[13],s}function T(e){return o(e)}export{w as ForceFieldBare};
|
||||
526
docs/assets/GameView-CAH9mw-8.js
Normal file
526
docs/assets/GameView-CAH9mw-8.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/GenericShape-C0Oq1K_N.js
Normal file
1
docs/assets/GenericShape-C0Oq1K_N.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
38
docs/assets/Html-DcxB1JCg.js
Normal file
38
docs/assets/Html-DcxB1JCg.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/KeyboardOverlay-DKaTY3Tb.js
Normal file
1
docs/assets/KeyboardOverlay-DKaTY3Tb.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,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-DfKJ2xlM.js";import{b as a,i as o,l as s,n as c}from"./loaders-BhaVxgpz.js";import{U as l,W as u}from"./index-Ds_qp2Yy.js";var d=e(n(),1),f=t(),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 d.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 d.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=o(a(`textures/gui/${e}`))}catch{t=null}return b.set(e,t),t}function S(e){let t=(0,f.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-BomOZ8gL.js";import{c as a}from"./manifest-MMwwguGo.js";import{i as o,it as s,l as c,n as l,rt as u}from"./index-BEKjcnfN.js";var d=e(n(),1),f=t(),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 d.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 d.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=o(a(`textures/gui/${e}`))}catch{t=null}return b.set(e,t),t}function S(e){let t=(0,f.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,f.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,f.c)(2),n;return t[0]===e?n=t[1]:(n={queryKey:[`parsedMission`,e],queryFn:()=>s(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 o(a(`textures/gui/${e}`))}catch{}try{return o(a(`textures/gui/Load_${t}`))}catch{}return null}function re(e){let t=(0,f.c)(7),{src:n,alt:r,className:i}=e,a=i===void 0?D.PreviewImage:i,[o,s]=(0,d.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,d.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,f.c)(22),{track:n}=e,[r,i]=(0,d.useState)(!1),[a,o]=(0,d.useState)(!0),s=(0,d.useRef)(null),p;t[0]===n?p=t[1]:(p=n.toLowerCase(),t[0]=n,t[1]=p);let h=`${c}music/${p}.mp3`,g,_;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g=()=>{let e=s.current;if(e)return()=>{e.pause()}},_=[],t[2]=g,t[3]=_):(g=t[2],_=t[3]),(0,d.useEffect)(g,_);let v;t[4]===r?v=t[5]:(v=()=>{let e=s.current;e&&(r?e.pause():e.play().catch(()=>o(!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=()=>o(!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:s,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)(u,{}):(0,m.jsx)(l,{})}),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,f.c)(100),{onClose:n,missionName:r,missionType:i}=e,{data:a}=ee(r),o=(0,d.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,d.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,d.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,f.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,f.c)(2),n;return t[0]===e?n=t[1]:(n={queryKey:[`parsedMission`,e],queryFn:()=>c(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 o(a(`textures/gui/${e}`))}catch{}try{return o(a(`textures/gui/Load_${t}`))}catch{}return null}function re(e){let t=(0,f.c)(7),{src:n,alt:r,className:i}=e,a=i===void 0?D.PreviewImage:i,[o,s]=(0,d.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,d.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,f.c)(22),{track:n}=e,[r,i]=(0,d.useState)(!1),[a,o]=(0,d.useState)(!0),c=(0,d.useRef)(null),p;t[0]===n?p=t[1]:(p=n.toLowerCase(),t[0]=n,t[1]=p);let h=`${l}music/${p}.mp3`,g,_;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(g=()=>{let e=c.current;if(e)return()=>{e.pause()}},_=[],t[2]=g,t[3]=_):(g=t[2],_=t[3]),(0,d.useEffect)(g,_);let v;t[4]===r?v=t[5]:(v=()=>{let e=c.current;e&&(r?e.pause():e.play().catch(()=>o(!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=()=>o(!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:c,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)(u,{})}),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,f.c)(100),{onClose:n,missionName:r,missionType:i}=e,{data:a}=ee(r),o=(0,d.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,d.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,d.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};
|
||||
File diff suppressed because one or more lines are too long
1
docs/assets/Mission-DazAbIp32.js
Normal file
1
docs/assets/Mission-DazAbIp32.js
Normal file
File diff suppressed because one or more lines are too long
2
docs/assets/PlayerHUD-B-3Ol8YW.js
Normal file
2
docs/assets/PlayerHUD-B-3Ol8YW.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/PlayerModel-DwsYOcG2.js
Normal file
1
docs/assets/PlayerModel-DwsYOcG2.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/Projectiles-BEQnp7Nq.js
Normal file
1
docs/assets/Projectiles-BEQnp7Nq.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-CD18QK1u.js";import{g as a,m as o,p as s}from"./playbackUtils-C1ncI8YZ.js";import{Ct as c,Wt as l,b as u,kt as d}from"./three.module-C9W4LJrj.js";import{t as f}from"./Texture-D2i1vM3o.js";import{p}from"./index-BEKjcnfN.js";var m=t(),h=e(n(),1),g=r(),_=new l,v=new l,y=new l,b=new l,x=new l,S=new l,C=new l(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=p(r.texture),t[0]=r.texture,t[1]=i);let a=f(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 u().setRGB(r.color.r,r.color.g,r.color.b,d),t[2]=r.color.b,t[3]=r.color.g,t[4]=r.color.r,t[5]=s):s=t[5];let c=s,l;t[6]===r.size?l=t[7]:(l=[r.size,r.size,1],t[6]=r.size,t[7]=l);let h;t[8]!==c||t[9]!==o?(h=(0,g.jsx)(`spriteMaterial`,{map:o,color:c,transparent:!0,blending:2,depthWrite:!1,toneMapped:!1}),t[8]=c,t[9]=o,t[10]=h):h=t[10];let _;return t[11]!==l||t[12]!==h?(_=(0,g.jsx)(`sprite`,{scale:l,children:h}),t[11]=l,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),l=(0,h.useRef)(null),u=(0,h.useRef)(null),d;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(d=new c,t[0]=d):d=t[0];let w=(0,h.useRef)(d),T;t[1]===r.texture?T=t[2]:(T=p(r.texture),t[1]=r.texture,t[2]=T);let E=r.crossTexture??r.texture,O;t[3]===E?O=t[4]:(O=p(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=f(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,c=l.current;if(!i||!c)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=c.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,c.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:l,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{o as i}from"./Html-DrHEhPVE.js";import{g as a,h as o,v as s}from"./GenericShape-D0Move-Z.js";import{p as c}from"./loaders-BhaVxgpz.js";import{Ot as l,St as u,Ut as d,b as f}from"./three.module-DRRYkRPO.js";import{t as p}from"./Texture-D7437V2F.js";var m=t(),h=e(n(),1),g=r(),_=new d,v=new d,y=new d,b=new d,x=new d,S=new d,C=new d(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=c(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 f().setRGB(r.color.r,r.color.g,r.color.b,l),t[2]=r.color.b,t[3]=r.color.g,t[4]=r.color.r,t[5]=s):s=t[5];let u=s,d;t[6]===r.size?d=t[7]:(d=[r.size,r.size,1],t[6]=r.size,t[7]=d);let h;t[8]!==u||t[9]!==o?(h=(0,g.jsx)(`spriteMaterial`,{map:o,color:u,transparent:!0,blending:2,depthWrite:!1,toneMapped:!1}),t[8]=u,t[9]=o,t[10]=h):h=t[10];let _;return t[11]!==d||t[12]!==h?(_=(0,g.jsx)(`sprite`,{scale:d,children:h}),t[11]=d,t[12]=h,t[13]=_):_=t[13],_}function T(e){a(Array.isArray(e)?e[0]:e)}function E(e){let t=(0,m.c)(29),{entity:n}=e,{visual:r}=n,a=(0,h.useRef)(null),l=(0,h.useRef)(null),d=(0,h.useRef)(null),f;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(f=new u,t[0]=f):f=t[0];let w=(0,h.useRef)(f),T;t[1]===r.texture?T=t[2]:(T=c(r.texture),t[1]=r.texture,t[2]=T);let E=r.crossTexture??r.texture,O;t[3]===E?O=t[4]:(O=c(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=a.current,c=l.current;if(!i||!c)return;let u=n.keyframes?.[0],f=u?.position,p=n.direction??u?.velocity;if(!f||!p){i.visible=!1,d.current&&(d.current.visible=!1);return}if(s(p,_),_.lengthSq()<1e-8){i.visible=!1,d.current&&(d.current.visible=!1);return}_.normalize(),i.visible=!0,s(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=c.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,c.needsUpdate=!0;let g=d.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,o(_,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:l,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:a,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:d,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)a(e)}export{w as SpriteProjectile,E as TracerProjectile};
|
||||
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/SettingsProvider-D-grt5cc.js
Normal file
2
docs/assets/SettingsProvider-D-grt5cc.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/ShapeModel-B4Q8DxMd.js
Normal file
1
docs/assets/ShapeModel-B4Q8DxMd.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
89
docs/assets/StreamingController-C-cd6zKq.js
Normal file
89
docs/assets/StreamingController-C-cd6zKq.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/Texture-D2i1vM3o.js
Normal file
1
docs/assets/Texture-D2i1vM3o.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,o as r}from"./react-three-fiber.esm-CD18QK1u.js";import{Bt as i,zt as a}from"./three.module-C9W4LJrj.js";var o=e(t()),s=e=>e===Object(e)&&!Array.isArray(e)&&typeof e!=`function`;function c(e,t){let c=r(e=>e.gl),l=n(i,s(e)?Object.values(e):e);return(0,o.useLayoutEffect)(()=>{t?.(l)},[t]),(0,o.useEffect)(()=>{if(`initTexture`in c){let e=[];Array.isArray(l)?e=l:l instanceof a?e=[l]:s(l)&&(e=Object.values(l)),e.forEach(e=>{e instanceof a&&c.initTexture(e)})}},[c,l]),(0,o.useMemo)(()=>{if(s(e)){let t={},n=0;for(let r in e)t[r]=l[n++];return t}else return l},[e,l])}c.preload=e=>n.preload(i,e),c.clear=e=>n.clear(i,e);export{c as t};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{r as e}from"./chunk-DECur_0Z.js";import{r as t}from"./jsx-runtime-BpGWiA-R.js";import{c as n,s as r}from"./Html-DrHEhPVE.js";import{Rt as i,zt as a}from"./three.module-DRRYkRPO.js";var o=e(t()),s=e=>e===Object(e)&&!Array.isArray(e)&&typeof e!=`function`;function c(e,t){let c=n(e=>e.gl),l=r(a,s(e)?Object.values(e):e);return(0,o.useLayoutEffect)(()=>{t?.(l)},[t]),(0,o.useEffect)(()=>{if(`initTexture`in c){let e=[];Array.isArray(l)?e=l:l instanceof i?e=[l]:s(l)&&(e=Object.values(l)),e.forEach(e=>{e instanceof i&&c.initTexture(e)})}},[c,l]),(0,o.useMemo)(()=>{if(s(e)){let t={},n=0;for(let r in e)t[r]=l[n++];return t}else return l},[e,l])}c.preload=e=>r.preload(a,e),c.clear=e=>r.clear(a,e);export{c as t};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{n as e}from"./jsx-runtime-BpGWiA-R.js";import{o as t}from"./Html-DrHEhPVE.js";import{r as n}from"./SettingsProvider-DVIFsPwe.js";import{n as r}from"./JoystickContext-BJFVWHNC.js";import{f as i,h as a}from"./index-Ds_qp2Yy.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*(.8*f+.05))),w=Math.max(-1,Math.min(1,i*e*(.8*f+.05)))}}else if(p===`moveLookStick`&&n>0&&(w=Math.min(1,.5*f+.05),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-DHnTaPUe.js
Normal file
1
docs/assets/TouchHandler-DHnTaPUe.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-CD18QK1u.js";import{r as n}from"./SettingsProvider-D-grt5cc.js";import{n as r}from"./JoystickContext-D1zeSnLk.js";import{E as i,k as a}from"./index-BEKjcnfN.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*(.8*f+.05))),w=Math.max(-1,Math.min(1,i*e*(.8*f+.05)))}}else if(p===`moveLookStick`&&n>0&&(w=Math.min(1,.5*f+.05),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-BmryTG2V.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-DVIFsPwe.js";import{t as i}from"./preload-helper-yuLzSqLi.js";import{n as a}from"./JoystickContext-BJFVWHNC.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-BmryTG2V.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-BmryTG2V.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-cKsequWj.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-D-grt5cc.js";import{t as i}from"./preload-helper-BPkniflS.js";import{n as a}from"./JoystickContext-D1zeSnLk.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-cKsequWj.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-cKsequWj.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};
|
||||
174
docs/assets/WaterBlock-BEenNkk_.js
Normal file
174
docs/assets/WaterBlock-BEenNkk_.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{n as e,r as t}from"./traditional-DhFuLw_p.js";function n(e,t=null){return{targets:e,categoryName:t,currentIndex:0,phase:`traveling`,elapsed:0,phaseDuration:0,curve:null,startPos:null,startQuat:null,orbitCenter:null,orbitRadius:null,orbitStartAngle:0}}var r=t(e=>({animation:null,flyTo(t){e({animation:n([t])})},startTour(t,r){t.length!==0&&e({animation:n(t,r)})},advanceTarget(){e(e=>e.animation?{animation:{...e.animation,currentIndex:e.animation.currentIndex+1,phase:`traveling`,elapsed:0,curve:null,startPos:null,startQuat:null,orbitCenter:null,orbitRadius:null,orbitStartAngle:0}}:e)},cancel(){e({animation:null})}}));function i(t,n){return e(r,t,n)}export{i as n,r as t};
|
||||
1
docs/assets/cameraTourStore-DQ989o2x.js
Normal file
1
docs/assets/cameraTourStore-DQ989o2x.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{n as e}from"./jsx-runtime-BpGWiA-R.js";import{i as t,n}from"./traditional-ec-lUAFC.js";var r=e();function i(e,t=null,n=`feature`){return{targets:e,categoryName:t,tourType:n,currentIndex:0,phase:`traveling`,elapsed:0,phaseDuration:0,curve:null,startPos:null,startQuat:null,orbitCenter:null,orbitRadius:null,orbitStartAngle:0}}var a=t(e=>({animation:null,flyTo(t,n=`feature`){e({animation:i([t],null,n)})},startTour(t,n,r=`feature`){t.length!==0&&e({animation:i(t,n,r)})},advanceTarget(){e(e=>e.animation?{animation:{...e.animation,currentIndex:e.animation.currentIndex+1,phase:`traveling`,elapsed:0,curve:null,startPos:null,startQuat:null,orbitCenter:null,orbitRadius:null,orbitStartAngle:0}}:e)},cancel(){e({animation:null})}}));function o(e,t){return n(a,e,t)}function s(e){let t=(0,r.c)(2),n;return t[0]===e?n=t[1]:(n=t=>{let n=t.animation;return!n||n.tourType!==`debug`?!1:n.targets[n.currentIndex]?.entityId===e},t[0]=e,t[1]=n),o(n)}export{o as n,s as r,a as t};
|
||||
1
docs/assets/demoStreaming-B6DJigkO.js
Normal file
1
docs/assets/demoStreaming-B6DJigkO.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{n as t,r as n}from"./traditional-DhFuLw_p.js";var r=e=>(t,n,r)=>{let i=r.subscribe;return r.subscribe=((e,t,n)=>{let a=e;if(t){let i=n?.equalityFn||Object.is,o=e(r.getState());a=n=>{let r=e(n);if(!i(o,r)){let e=o;t(o=r,e)}},n?.fireImmediately&&t(o,o)}return i(a)}),e(t,n,r)};function i(e){let t=new Map;for(let n of e.state.datablocks.values()){if(n._class!==`tsshapeconstructor`)continue;let e=n.baseshape;if(typeof e!=`string`)continue;let r=e.toLowerCase(),i=r.replace(/\.dts$/i,``)+`_`,a=new Map;for(let e=0;e<=127;e++){let t=n[`sequence${e}`];if(typeof t!=`string`)continue;let r=t.indexOf(` `);if(r===-1)continue;let o=t.slice(0,r).toLowerCase(),s=t.slice(r+1).trim().toLowerCase();if(!s||!o.startsWith(i)||!o.endsWith(`.dsq`))continue;let c=o.slice(i.length,-4);c&&a.set(s,c)}a.size>0&&t.set(r,a)}return t}function a(e,t,n){let r=new Map;for(let n of e){let e=t.clipAction(n);r.set(n.name.toLowerCase(),e)}if(n)for(let[e,t]of n){let n=r.get(t);n&&!r.has(e)&&r.set(e,n)}return r}e();function o(e){return e.toLowerCase()}function s(e){let t=o(e.trim());return t.startsWith(`$`)?t.slice(1):t}function c(e,t,n){return e<t?t:e>n?n:e}function l(e){let t={},n={},r={},i={};for(let n of e.state.objectsById.values())t[n._id]=0,n._name&&(r[o(n._name)]=n._id,n._isDatablock&&(i[o(n._name)]=n._id));for(let t of e.state.globals.keys())n[s(t)]=0;return{objectVersionById:t,globalVersionByName:n,objectIdsByName:r,datablockIdsByName:i}}var u={runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0},playback:{recording:null,status:`stopped`,timeMs:0,rate:1,durationMs:0,streamSnapshot:null}},d=n()(r(e=>({...u,setRuntime(t){let n=l(t),r=i(t);e(e=>({...e,runtime:{runtime:t,sequenceAliases:r,objectVersionById:n.objectVersionById,globalVersionByName:n.globalVersionByName,objectIdsByName:n.objectIdsByName,datablockIdsByName:n.datablockIdsByName,lastRuntimeTick:0}}))},clearRuntime(){e(e=>({...e,runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0}}))},applyRuntimeBatch(t,n){t.length!==0&&e(e=>{let r={...e.runtime.objectVersionById},i={...e.runtime.globalVersionByName},a={...e.runtime.objectIdsByName},c={...e.runtime.datablockIdsByName},l=e=>{e!=null&&(r[e]=(r[e]??0)+1)};for(let e of t){if(e.type===`object.created`){let t=e.object;if(l(e.objectId),t._name){let n=o(t._name);a[n]=e.objectId,t._isDatablock&&(c[n]=e.objectId)}l(t._parent?._id);continue}if(e.type===`object.deleted`){let t=e.object;if(delete r[e.objectId],t?._name){let e=o(t._name);delete a[e],t._isDatablock&&delete c[e]}l(t?._parent?._id);continue}if(e.type===`field.changed`){l(e.objectId);continue}if(e.type===`global.changed`){let t=s(e.name);i[t]=(i[t]??0)+1;continue}}let u=n?.tick??(e.runtime.lastRuntimeTick>0?e.runtime.lastRuntimeTick+1:1);return{...e,runtime:{...e.runtime,objectVersionById:r,globalVersionByName:i,objectIdsByName:a,datablockIdsByName:c,lastRuntimeTick:u}}})},setRecording(t){let n=Math.max(0,(t?.duration??0)*1e3);e(e=>({...e,playback:{recording:t,status:t?`stopped`:e.playback.status,timeMs:t?0:e.playback.timeMs,rate:t?1:e.playback.rate,durationMs:n,streamSnapshot:t?null:e.playback.streamSnapshot}}))},setPlaybackTime(t){e(e=>{let n=c(t,0,e.playback.durationMs);return{...e,playback:{...e.playback,timeMs:n}}})},setPlaybackStatus(t){e(e=>({...e,playback:{...e.playback,status:t}}))},setPlaybackRate(t){let n=Number.isFinite(t)?c(t,.01,16):1;e(e=>({...e,playback:{...e.playback,rate:n}}))},setPlaybackStreamSnapshot(t){e(e=>({...e,playback:{...e.playback,streamSnapshot:t}}))}}))),f=0;function p(){return f}function m(e,t){f+=e*t*1e3}function h(){f=0}d.subscribe(e=>e.playback.status,e=>{e===`stopped`&&h()});function g(){return d}function _(e,n){return t(d,e,n)}export{g as a,_ as i,p as n,a as o,d as r,r as s,m as t};
|
||||
1
docs/assets/engineStore-Mono9lyt.js
Normal file
1
docs/assets/engineStore-Mono9lyt.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{n as e}from"./jsx-runtime-BpGWiA-R.js";import{i as t,n}from"./traditional-ec-lUAFC.js";var r=e=>(t,n,r)=>{let i=r.subscribe;return r.subscribe=((e,t,n)=>{let a=e;if(t){let i=n?.equalityFn||Object.is,o=e(r.getState());a=n=>{let r=e(n);if(!i(o,r)){let e=o;t(o=r,e)}},n?.fireImmediately&&t(o,o)}return i(a)}),e(t,n,r)};function i(e){let t=new Map;for(let n of e.state.datablocks.values()){if(n._class!==`tsshapeconstructor`)continue;let e=n.baseshape;if(typeof e!=`string`)continue;let r=e.toLowerCase(),i=r.replace(/\.dts$/i,``)+`_`,a=new Map;for(let e=0;e<=127;e++){let t=n[`sequence${e}`];if(typeof t!=`string`)continue;let r=t.indexOf(` `);if(r===-1)continue;let o=t.slice(0,r).toLowerCase(),s=t.slice(r+1).trim().toLowerCase();if(!s||!o.startsWith(i)||!o.endsWith(`.dsq`))continue;let c=o.slice(i.length,-4);c&&a.set(s,c)}a.size>0&&t.set(r,a)}return t}function a(e,t,n){let r=new Map;for(let n of e){let e=t.clipAction(n);r.set(n.name.toLowerCase(),e)}if(n)for(let[e,t]of n){let n=r.get(t);n&&!r.has(e)&&r.set(e,n)}return r}e();function o(e){return e.toLowerCase()}function s(e){let t=o(e.trim());return t.startsWith(`$`)?t.slice(1):t}function c(e,t,n){return e<t?t:e>n?n:e}function l(e){let t={},n={},r={},i={};for(let n of e.state.objectsById.values())t[n._id]=0,n._name&&(r[o(n._name)]=n._id,n._isDatablock&&(i[o(n._name)]=n._id));for(let t of e.state.globals.keys())n[s(t)]=0;return{objectVersionById:t,globalVersionByName:n,objectIdsByName:r,datablockIdsByName:i}}var u={runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0},playback:{recording:null,status:`stopped`,timeMs:0,rate:1,durationMs:0,streamSnapshot:null}},d=t()(r(e=>({...u,setRuntime(t){let n=l(t),r=i(t);e(e=>({...e,runtime:{runtime:t,sequenceAliases:r,objectVersionById:n.objectVersionById,globalVersionByName:n.globalVersionByName,objectIdsByName:n.objectIdsByName,datablockIdsByName:n.datablockIdsByName,lastRuntimeTick:0}}))},clearRuntime(){e(e=>({...e,runtime:{runtime:null,sequenceAliases:new Map,objectVersionById:{},globalVersionByName:{},objectIdsByName:{},datablockIdsByName:{},lastRuntimeTick:0}}))},applyRuntimeBatch(t,n){t.length!==0&&e(e=>{let r={...e.runtime.objectVersionById},i={...e.runtime.globalVersionByName},a={...e.runtime.objectIdsByName},c={...e.runtime.datablockIdsByName},l=e=>{e!=null&&(r[e]=(r[e]??0)+1)};for(let e of t){if(e.type===`object.created`){let t=e.object;if(l(e.objectId),t._name){let n=o(t._name);a[n]=e.objectId,t._isDatablock&&(c[n]=e.objectId)}l(t._parent?._id);continue}if(e.type===`object.deleted`){let t=e.object;if(delete r[e.objectId],t?._name){let e=o(t._name);delete a[e],t._isDatablock&&delete c[e]}l(t?._parent?._id);continue}if(e.type===`field.changed`){l(e.objectId);continue}if(e.type===`global.changed`){let t=s(e.name);i[t]=(i[t]??0)+1;continue}}let u=n?.tick??(e.runtime.lastRuntimeTick>0?e.runtime.lastRuntimeTick+1:1);return{...e,runtime:{...e.runtime,objectVersionById:r,globalVersionByName:i,objectIdsByName:a,datablockIdsByName:c,lastRuntimeTick:u}}})},setRecording(t){let n=Math.max(0,(t?.duration??0)*1e3);e(e=>({...e,playback:{recording:t,status:t?`stopped`:e.playback.status,timeMs:t?0:e.playback.timeMs,rate:t?1:e.playback.rate,durationMs:n,streamSnapshot:t?null:e.playback.streamSnapshot}}))},setPlaybackTime(t){e(e=>{let n=c(t,0,e.playback.durationMs);return{...e,playback:{...e.playback,timeMs:n}}})},setPlaybackStatus(t){e(e=>({...e,playback:{...e.playback,status:t}}))},setPlaybackRate(t){let n=Number.isFinite(t)?c(t,.01,16):1;e(e=>({...e,playback:{...e.playback,rate:n}}))},setPlaybackStreamSnapshot(t){e(e=>({...e,playback:{...e.playback,streamSnapshot:t}}))}}))),f=0;function p(){return f}function m(e,t){f+=e*t*1e3}function h(){f=0}d.subscribe(e=>e.playback.status,e=>{e===`stopped`&&h()});function g(){return d}function _(e,t){return n(d,e,t)}export{g as a,_ as i,p as n,a as o,d as r,r as s,m as t};
|
||||
1
docs/assets/extends-DPirtscy.js
Normal file
1
docs/assets/extends-DPirtscy.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
function e(){return e=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},e.apply(null,arguments)}export{e as t};
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
import{t as e}from"./three.module-DRRYkRPO.js";var t=`
|
||||
import{C as e,Dt as t,Ht as n,J as r,Ot as i,P as a,kt as o,q as s,t as c,zt as l}from"./three.module-C9W4LJrj.js";var u=new a;u.setOptions({premultiplyAlpha:`none`});var d=new Map;function f(e,t){let n=d.get(e);if(n)return t&&n.image&&t(n),n;let r=new l;return r.flipY=!1,d.set(e,r),u.load(e,e=>{r.image=e,r.needsUpdate=!0,t?.(r)}),r}function p(e){let t=d.get(e);return t?t.image?Promise.resolve(t):new Promise(e=>{let n=()=>{t.image?e(t):setTimeout(n,16)};n()}):new Promise((t,n)=>{let r=new l;r.flipY=!1,d.set(e,r),u.load(e,e=>{r.image=e,r.needsUpdate=!0,t(r)},void 0,n)})}function m(e,t={}){let{repeat:n=[1,1],disableMipmaps:a=!1,anisotropy:c,noColorSpace:l=!1}=t;return e.wrapS=e.wrapT=i,l||(e.colorSpace=o),e.repeat.set(...n),e.flipY=!1,e.anisotropy=c??1,a?(e.generateMipmaps=!1,e.minFilter=s):(e.generateMipmaps=!0,e.minFilter=r),e.magFilter=s,e.needsUpdate=!0,e}function h(r){let a=new e(r,256,256,t,n);return a.colorSpace=``,a.wrapS=a.wrapT=i,a.generateMipmaps=!1,a.minFilter=s,a.magFilter=s,a.needsUpdate=!0,a}var g=`
|
||||
#ifdef USE_FOG
|
||||
// Check fog enabled uniform - allows toggling without shader recompilation
|
||||
#ifdef USE_VOLUMETRIC_FOG
|
||||
|
|
@ -7,7 +7,9 @@ import{t as e}from"./three.module-DRRYkRPO.js";var t=`
|
|||
} else {
|
||||
#endif
|
||||
|
||||
float dist = vFogDepth;
|
||||
// Scale distance for fog calculations — makes everything appear closer/further
|
||||
// for fog purposes without changing actual geometry positions.
|
||||
float dist = vFogDepth / fogDistanceScale;
|
||||
|
||||
// Discard fragments at or beyond visible distance - matches Torque's behavior
|
||||
// where objects beyond visibleDistance are not rendered at all.
|
||||
|
|
@ -117,7 +119,7 @@ import{t as e}from"./three.module-DRRYkRPO.js";var t=`
|
|||
} // end fogEnabled check
|
||||
#endif
|
||||
#endif
|
||||
`;function n(){e.fog_pars_fragment=`
|
||||
`;function _(){c.fog_pars_fragment=`
|
||||
#ifdef USE_FOG
|
||||
uniform vec3 fogColor;
|
||||
varying float vFogDepth;
|
||||
|
|
@ -138,15 +140,24 @@ import{t as e}from"./three.module-DRRYkRPO.js";var t=`
|
|||
#ifdef USE_FOG_WORLD_POSITION
|
||||
varying vec3 vFogWorldPosition;
|
||||
#endif
|
||||
|
||||
// Fog distance scale — multiplies all distance-based fog calculations.
|
||||
// 1.0 = normal, >1 = less fog. Set by camera tour for distant orbits.
|
||||
#ifdef HAS_FOG_DISTANCE_SCALE
|
||||
uniform float fogDistanceScale;
|
||||
#else
|
||||
#define fogDistanceScale 1.0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
`,e.fog_fragment=t,e.fog_pars_vertex=`
|
||||
`,c.fog_fragment=g,c.fog_pars_vertex=`
|
||||
#ifdef USE_FOG
|
||||
varying float vFogDepth;
|
||||
#ifdef USE_FOG_WORLD_POSITION
|
||||
varying vec3 vFogWorldPosition;
|
||||
#endif
|
||||
#endif
|
||||
`,e.fog_vertex=`
|
||||
`,c.fog_vertex=`
|
||||
#ifdef USE_FOG
|
||||
// Use Euclidean distance from camera, not view-space z-depth
|
||||
// This ensures fog doesn't change when rotating the camera
|
||||
|
|
@ -159,7 +170,7 @@ import{t as e}from"./three.module-DRRYkRPO.js";var t=`
|
|||
vFogWorldPosition = (modelMatrix * _fogPos2).xyz;
|
||||
#endif
|
||||
#endif
|
||||
`}function r(e,t){e.uniforms.fogVolumeData=t.fogVolumeData,e.uniforms.cameraHeight=t.cameraHeight,e.uniforms.fogEnabled=t.fogEnabled}function i(e,n){r(e,n),e.vertexShader=e.vertexShader.replace(`#include <fog_pars_vertex>`,`#include <fog_pars_vertex>
|
||||
`}function v(e,t){e.uniforms.fogVolumeData=t.fogVolumeData,e.uniforms.cameraHeight=t.cameraHeight,e.uniforms.fogEnabled=t.fogEnabled,e.uniforms.fogDistanceScale=t.fogDistanceScale}function y(e,t){v(e,t),e.vertexShader=e.vertexShader.replace(`#include <fog_pars_vertex>`,`#include <fog_pars_vertex>
|
||||
#ifdef USE_FOG
|
||||
#define USE_FOG_WORLD_POSITION
|
||||
#define USE_VOLUMETRIC_FOG
|
||||
|
|
@ -171,7 +182,8 @@ import{t as e}from"./three.module-DRRYkRPO.js";var t=`
|
|||
_fogPos3 = instanceMatrix * _fogPos3;
|
||||
#endif
|
||||
vFogWorldPosition = (modelMatrix * _fogPos3).xyz;
|
||||
#endif`),e.fragmentShader=e.fragmentShader.replace(`#include <fog_pars_fragment>`,`#include <fog_pars_fragment>
|
||||
#endif`),e.fragmentShader=e.fragmentShader.replace(`#include <fog_pars_fragment>`,`#define HAS_FOG_DISTANCE_SCALE
|
||||
#include <fog_pars_fragment>
|
||||
#ifdef USE_FOG
|
||||
#define USE_VOLUMETRIC_FOG
|
||||
uniform float fogVolumeData[12];
|
||||
|
|
@ -179,4 +191,4 @@ import{t as e}from"./three.module-DRRYkRPO.js";var t=`
|
|||
uniform bool fogEnabled;
|
||||
#define USE_FOG_WORLD_POSITION
|
||||
varying vec3 vFogWorldPosition;
|
||||
#endif`),e.fragmentShader=e.fragmentShader.replace(`#include <fog_fragment>`,t)}var a=3,o=4,s={fogVolumeData:{value:new Float32Array(a*o)},cameraHeight:{value:0},fogEnabled:{value:!0}};function c(e,t,n=!0){s.cameraHeight.value=e,s.fogVolumeData.value.set(t),s.fogEnabled.value=n}function l(){s.cameraHeight.value=0,s.fogVolumeData.value.fill(0),s.fogEnabled.value=!0}function u(e){let t=new Float32Array(a*o);for(let n=0;n<a;n++){let r=n*o,i=e[n];i&&(t[r+0]=i.visibleDistance,t[r+1]=i.minHeight,t[r+2]=i.maxHeight,t[r+3]=i.percentage)}return t}export{t as a,c as i,u as n,i as o,l as r,n as s,s as t};
|
||||
#endif`),e.fragmentShader=e.fragmentShader.replace(`#include <fog_fragment>`,g)}var b=3,x=4,S={fogVolumeData:{value:new Float32Array(b*x)},cameraHeight:{value:0},fogEnabled:{value:!0},fogDistanceScale:{value:1}};function C(e,t,n=!0){S.cameraHeight.value=e,S.fogVolumeData.value.set(t),S.fogEnabled.value=n}function w(){S.cameraHeight.value=0,S.fogVolumeData.value.fill(0),S.fogEnabled.value=!0,S.fogDistanceScale.value=1}function T(e){let t=new Float32Array(b*x);for(let n=0;n<b;n++){let r=n*x,i=e[n];i&&(t[r+0]=i.visibleDistance,t[r+1]=i.minHeight,t[r+2]=i.maxHeight,t[r+3]=i.percentage)}return t}export{g as a,f as c,m as d,C as i,p as l,T as n,y as o,w as r,_ as s,S as t,h as u};
|
||||
1
docs/assets/index-BD1vN1aq.css
Normal file
1
docs/assets/index-BD1vN1aq.css
Normal file
File diff suppressed because one or more lines are too long
13
docs/assets/index-BEKjcnfN.js
Normal file
13
docs/assets/index-BEKjcnfN.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
File diff suppressed because one or more lines are too long
1
docs/assets/manifest-MMwwguGo.js
Normal file
1
docs/assets/manifest-MMwwguGo.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
29
docs/assets/mission-S3koG-vu.js
Normal file
29
docs/assets/mission-S3koG-vu.js
Normal file
File diff suppressed because one or more lines are too long
47
docs/assets/playbackUtils-C1ncI8YZ.js
Normal file
47
docs/assets/playbackUtils-C1ncI8YZ.js
Normal file
File diff suppressed because one or more lines are too long
12
docs/assets/react-three-fiber.esm-CD18QK1u.js
Normal file
12
docs/assets/react-three-fiber.esm-CD18QK1u.js
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
import{St as e,nt as t}from"./three.module-DRRYkRPO.js";import{t as n}from"./logger-B058WGzf.js";var r=n(`ghostToScene`);function i(e,t={x:0,y:0,z:0}){return e&&typeof e==`object`&&`x`in e?e:t}function a(e,t={r:0,g:0,b:0}){return e&&typeof e==`object`&&`r`in e?e:t}function o(e,t={r:.5,g:.5,b:.5,a:1}){return e&&typeof e==`object`&&`r`in e?e:t}function s(e){if(e&&typeof e==`object`&&`elements`in e&&Array.isArray(e.elements))return e;if(e&&typeof e==`object`&&`position`in e&&`rotation`in e){let{position:t,rotation:n}=e,r=n.x*n.x,i=n.y*n.y,a=n.z*n.z,o=n.x*n.y,s=n.x*n.z,c=n.y*n.z,l=n.w*n.x,u=n.w*n.y,d=n.w*n.z;return{elements:[1-2*(i+a),2*(o+d),2*(s-u),0,2*(o-d),1-2*(r+a),2*(c+l),0,2*(s+u),2*(c-l),1-2*(r+i),0,t.x,t.y,t.z,1],position:{x:t.x,y:t.y,z:t.z}}}return{elements:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],position:{x:0,y:0,z:0}}}function c(e,t){return{className:`TerrainBlock`,ghostIndex:e,terrFileName:t.terrFileName??``,detailTextureName:t.detailTextureName??``,squareSize:t.squareSize??8,emptySquareRuns:t.emptySquareRuns}}function l(e,t){return{className:`InteriorInstance`,ghostIndex:e,interiorFile:t.interiorFile??``,transform:s(t.transform),scale:i(t.scale,{x:1,y:1,z:1}),showTerrainInside:t.showTerrainInside??!1,skinBase:t.skinBase??``,alarmState:t.alarmState??!1}}function u(e,t){return{className:`TSStatic`,ghostIndex:e,shapeName:t.shapeName??``,transform:s(t.transform),scale:i(t.scale,{x:1,y:1,z:1})}}function d(e,t){let n=Array.isArray(t.fogVolumes)?t.fogVolumes.map(e=>({visibleDistance:e.visibleDistance??0,minHeight:e.minHeight??0,maxHeight:e.maxHeight??0,color:a(e.color)})):[],r=Array.isArray(t.cloudLayers)?t.cloudLayers.map(e=>({texture:e.texture??``,heightPercent:e.heightPercent??0,speed:e.speed??0})):[];return{className:`Sky`,ghostIndex:e,materialList:t.materialList??``,fogColor:a(t.fogColor),visibleDistance:t.visibleDistance??1e3,fogDistance:t.fogDistance??0,skySolidColor:a(t.skySolidColor),useSkyTextures:t.useSkyTextures??!0,fogVolumes:n,cloudLayers:r,windVelocity:i(t.windVelocity)}}function f(e,t){return{className:`Sun`,ghostIndex:e,direction:i(t.direction,{x:.57735,y:.57735,z:-.57735}),color:o(t.color,{r:.7,g:.7,b:.7,a:1}),ambient:o(t.ambient,{r:.5,g:.5,b:.5,a:1}),textures:Array.isArray(t.textures)?t.textures:void 0}}function p(e,t){return{className:`MissionArea`,ghostIndex:e,area:t.area??{x:-512,y:-512,w:1024,h:1024},flightCeiling:t.flightCeiling??2e3,flightCeilingRange:t.flightCeilingRange??50}}function m(e,t){return{className:`WaterBlock`,ghostIndex:e,transform:s(t.transform),scale:i(t.scale,{x:1,y:1,z:1}),surfaceName:t.surfaceName??``,envMapName:t.envMapName??``,surfaceOpacity:t.surfaceOpacity??.75,waveMagnitude:t.waveMagnitude??1,envMapIntensity:t.envMapIntensity??1}}function h(e,t,n){let i;switch(e){case`TerrainBlock`:return i=c(t,n),r.debug(`TerrainBlock #%d: terrFileName=%s`,t,i.terrFileName),i;case`InteriorInstance`:return i=l(t,n),r.debug(`InteriorInstance #%d: interiorFile=%s`,t,i.interiorFile),i;case`TSStatic`:return u(t,n);case`Sky`:{i=d(t,n);let e=i;return r.debug(`Sky #%d: materialList=%s fogColor=(%s, %s, %s) visibleDist=%d fogDist=%d useSkyTextures=%s`,t,e.materialList,e.fogColor.r.toFixed(3),e.fogColor.g.toFixed(3),e.fogColor.b.toFixed(3),e.visibleDistance,e.fogDistance,e.useSkyTextures),i}case`Sun`:{i=f(t,n);let e=i;return r.debug(`Sun #%d: dir=(%s, %s, %s) color=(%s, %s, %s) ambient=(%s, %s, %s)`,t,e.direction.x.toFixed(3),e.direction.y.toFixed(3),e.direction.z.toFixed(3),e.color.r.toFixed(3),e.color.g.toFixed(3),e.color.b.toFixed(3),e.ambient.r.toFixed(3),e.ambient.g.toFixed(3),e.ambient.b.toFixed(3)),i}case`MissionArea`:return p(t,n);case`WaterBlock`:return m(t,n);default:return null}}function g(e){return[e.y,e.z,e.x]}function _(e){return[e.y,e.z,e.x]}function v(n){let r=n.elements,i=new t,a=i.elements;a[0]=r[5],a[1]=r[6],a[2]=r[4],a[3]=0,a[4]=r[9],a[5]=r[10],a[6]=r[8],a[7]=0,a[8]=r[1],a[9]=r[2],a[10]=r[0],a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1;let o=new e;return o.setFromRotationMatrix(i),o.conjugate(),o}export{h as i,_ as n,g as r,v as t};
|
||||
import{t as e}from"./logger-B058WGzf.js";import{Ct as t,rt as n}from"./three.module-C9W4LJrj.js";var r=e(`ghostToScene`);function i(e,t={x:0,y:0,z:0}){return e&&typeof e==`object`&&`x`in e?e:t}function a(e,t={r:0,g:0,b:0}){return e&&typeof e==`object`&&`r`in e?e:t}function o(e,t={r:.5,g:.5,b:.5,a:1}){return e&&typeof e==`object`&&`r`in e?e:t}function s(e){if(e&&typeof e==`object`&&`elements`in e&&Array.isArray(e.elements))return e;if(e&&typeof e==`object`&&`position`in e&&`rotation`in e){let{position:t,rotation:n}=e,r=n.x*n.x,i=n.y*n.y,a=n.z*n.z,o=n.x*n.y,s=n.x*n.z,c=n.y*n.z,l=n.w*n.x,u=n.w*n.y,d=n.w*n.z;return{elements:[1-2*(i+a),2*(o+d),2*(s-u),0,2*(o-d),1-2*(r+a),2*(c+l),0,2*(s+u),2*(c-l),1-2*(r+i),0,t.x,t.y,t.z,1],position:{x:t.x,y:t.y,z:t.z}}}return{elements:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],position:{x:0,y:0,z:0}}}function c(e,t){return{className:`TerrainBlock`,ghostIndex:e,terrFileName:t.terrFileName??``,detailTextureName:t.detailTextureName??``,squareSize:t.squareSize??8,emptySquareRuns:t.emptySquareRuns}}function l(e,t){return{className:`InteriorInstance`,ghostIndex:e,interiorFile:t.interiorFile??``,transform:s(t.transform),scale:i(t.scale,{x:1,y:1,z:1}),showTerrainInside:t.showTerrainInside??!1,skinBase:t.skinBase??``,alarmState:t.alarmState??!1}}function u(e,t){return{className:`TSStatic`,ghostIndex:e,shapeName:t.shapeName??``,transform:s(t.transform),scale:i(t.scale,{x:1,y:1,z:1})}}function d(e,t){let n=Array.isArray(t.fogVolumes)?t.fogVolumes.map(e=>({visibleDistance:e.visibleDistance??0,minHeight:e.minHeight??0,maxHeight:e.maxHeight??0,color:a(e.color)})):[],r=Array.isArray(t.cloudLayers)?t.cloudLayers.map(e=>({texture:e.texture??``,heightPercent:e.heightPercent??0,speed:e.speed??0})):[];return{className:`Sky`,ghostIndex:e,materialList:t.materialList??``,fogColor:a(t.fogColor),visibleDistance:t.visibleDistance??1e3,fogDistance:t.fogDistance??0,skySolidColor:a(t.skySolidColor),useSkyTextures:t.useSkyTextures??!0,fogVolumes:n,cloudLayers:r,windVelocity:i(t.windVelocity)}}function f(e,t){return{className:`Sun`,ghostIndex:e,direction:i(t.direction,{x:.57735,y:.57735,z:-.57735}),color:o(t.color,{r:.7,g:.7,b:.7,a:1}),ambient:o(t.ambient,{r:.5,g:.5,b:.5,a:1}),textures:Array.isArray(t.textures)?t.textures:void 0}}function p(e,t){return{className:`MissionArea`,ghostIndex:e,area:t.area??{x:-512,y:-512,w:1024,h:1024},flightCeiling:t.flightCeiling??2e3,flightCeilingRange:t.flightCeilingRange??50}}function m(e,t){return{className:`WaterBlock`,ghostIndex:e,transform:s(t.transform),scale:i(t.scale,{x:1,y:1,z:1}),surfaceName:t.surfaceName??``,envMapName:t.envMapName??``,surfaceOpacity:t.surfaceOpacity??.75,waveMagnitude:t.waveMagnitude??1,envMapIntensity:t.envMapIntensity??1}}function h(e,t,n){let i;switch(e){case`TerrainBlock`:return i=c(t,n),r.debug(`TerrainBlock #%d: terrFileName=%s`,t,i.terrFileName),i;case`InteriorInstance`:return i=l(t,n),r.debug(`InteriorInstance #%d: interiorFile=%s`,t,i.interiorFile),i;case`TSStatic`:return u(t,n);case`Sky`:{i=d(t,n);let e=i;return r.debug(`Sky #%d: materialList=%s fogColor=(%s, %s, %s) visibleDist=%d fogDist=%d useSkyTextures=%s`,t,e.materialList,e.fogColor.r.toFixed(3),e.fogColor.g.toFixed(3),e.fogColor.b.toFixed(3),e.visibleDistance,e.fogDistance,e.useSkyTextures),i}case`Sun`:{i=f(t,n);let e=i;return r.debug(`Sun #%d: dir=(%s, %s, %s) color=(%s, %s, %s) ambient=(%s, %s, %s)`,t,e.direction.x.toFixed(3),e.direction.y.toFixed(3),e.direction.z.toFixed(3),e.color.r.toFixed(3),e.color.g.toFixed(3),e.color.b.toFixed(3),e.ambient.r.toFixed(3),e.ambient.g.toFixed(3),e.ambient.b.toFixed(3)),i}case`MissionArea`:return p(t,n);case`WaterBlock`:return m(t,n);default:return null}}function g(e){return[e.y,e.z,e.x]}function _(e){return[e.y,e.z,e.x]}function v(e){let r=e.elements,i=new n,a=i.elements;a[0]=r[5],a[1]=r[6],a[2]=r[4],a[3]=0,a[4]=r[9],a[5]=r[10],a[6]=r[8],a[7]=0,a[8]=r[1],a[9]=r[2],a[10]=r[0],a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1;let o=new t;return o.setFromRotationMatrix(i),o.conjugate(),o}export{h as i,_ as n,g as r,v as t};
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
var e={directional:1,ambient:1.5};function t(t){t.uniforms.shapeDirectionalFactor={value:e.directional},t.uniforms.shapeAmbientFactor={value:e.ambient},t.fragmentShader=t.fragmentShader.replace(`#include <common>`,`#include <common>
|
||||
uniform float shapeDirectionalFactor;
|
||||
uniform float shapeAmbientFactor;
|
||||
`),t.fragmentShader=t.fragmentShader.replace(`#include <lights_fragment_end>`,`#include <lights_fragment_end>
|
||||
// Apply shape-specific lighting multipliers
|
||||
reflectedLight.directDiffuse *= shapeDirectionalFactor;
|
||||
reflectedLight.indirectDiffuse *= shapeAmbientFactor;
|
||||
`)}var n={shapeEnvMap:{value:null},shapeEnvMapActive:{value:!1},shapeEnvMapDebugUV:{value:!1}};function r(e){n.shapeEnvMap.value=e,n.shapeEnvMapActive.value=!0}function i(){n.shapeEnvMap.value=null,n.shapeEnvMapActive.value=!1}function a(e,t){e.uniforms.shapeEnvMap=n.shapeEnvMap,e.uniforms.shapeEnvMapActive=n.shapeEnvMapActive,e.uniforms.shapeEnvMapDebugUV=n.shapeEnvMapDebugUV,e.uniforms.shapeReflectionAmount={value:t},e.fragmentShader=e.fragmentShader.replace(`#include <common>`,`#include <common>
|
||||
uniform sampler2D shapeEnvMap;
|
||||
uniform bool shapeEnvMapActive;
|
||||
uniform float shapeReflectionAmount;
|
||||
uniform bool shapeEnvMapDebugUV;
|
||||
varying vec2 vShapeSphereUV;
|
||||
`),e.vertexShader=e.vertexShader.replace(`#include <common>`,`#include <common>
|
||||
varying vec2 vShapeSphereUV;
|
||||
`),e.vertexShader=e.vertexShader.replace(`#include <fog_vertex>`,`#include <fog_vertex>
|
||||
{
|
||||
vec3 _eyePos = (modelViewMatrix * vec4(transformed, 1.0)).xyz;
|
||||
#ifdef FLAT_SHADED
|
||||
vec3 _eyeN = vec3(0.0, 0.0, 1.0);
|
||||
#else
|
||||
vec3 _eyeN = normalize(normalMatrix * normal);
|
||||
#endif
|
||||
vec3 _eyeU = normalize(_eyePos);
|
||||
vec3 _r = reflect(_eyeU, _eyeN);
|
||||
float _m = 2.0 * sqrt(_r.x * _r.x + _r.z * _r.z + (_r.y + 1.0) * (_r.y + 1.0));
|
||||
vShapeSphereUV = vec2(_r.x, -_r.z) / _m + 0.5;
|
||||
}
|
||||
`),e.fragmentShader=e.fragmentShader.replace(`#include <opaque_fragment>`,`// Tribes 2 sphere-map environment reflections (GL_INTERPOLATE)
|
||||
if (shapeEnvMapActive && shapeReflectionAmount > 0.0) {
|
||||
if (shapeEnvMapDebugUV) {
|
||||
outgoingLight = vec3(vShapeSphereUV, 0.0);
|
||||
} else {
|
||||
vec3 _envColor = texture2D(shapeEnvMap, vShapeSphereUV).rgb;
|
||||
#ifdef USE_MAP
|
||||
float _baseAlpha = texture2D(map, vMapUv).a;
|
||||
#else
|
||||
float _baseAlpha = 1.0;
|
||||
#endif
|
||||
float _factor = _baseAlpha * shapeReflectionAmount;
|
||||
// Torque blends in sRGB space (fixed-function pipeline, no gamma).
|
||||
// Convert outgoingLight to sRGB, mix with sRGB env map, convert back.
|
||||
vec3 _baseSRGB = pow(max(outgoingLight, 0.0), vec3(1.0 / 2.2));
|
||||
outgoingLight = pow(mix(_baseSRGB, _envColor, _factor), vec3(2.2));
|
||||
}
|
||||
}
|
||||
#include <opaque_fragment>`)}export{n as a,r as i,t as n,i as r,a as t};
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
import{r as e}from"./traditional-DhFuLw_p.js";var t=e()(()=>({time:0,playback:null,root:null,cameraMode:`original`,orbitOverrideYaw:0,orbitOverridePitch:0,entities:new Map}));function n(){t.setState({time:0,playback:null,cameraMode:`original`,orbitOverrideYaw:0,orbitOverridePitch:0})}export{t as n,n as t};
|
||||
1
docs/assets/streamPlaybackStore-UQ4nn4bZ.js
Normal file
1
docs/assets/streamPlaybackStore-UQ4nn4bZ.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{i as e}from"./traditional-ec-lUAFC.js";var t=e()(()=>({time:0,playback:null,root:null,cameraMode:`original`,orbitOverrideYaw:0,orbitOverridePitch:0}));function n(){t.setState({time:0,playback:null,cameraMode:`original`,orbitOverrideYaw:0,orbitOverridePitch:0})}export{t as n,n as t};
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
import{r as e,t}from"./chunk-DECur_0Z.js";import{r as n}from"./jsx-runtime-BpGWiA-R.js";var r=t((e=>{var t=n();function r(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var i=typeof Object.is==`function`?Object.is:r,a=t.useState,o=t.useEffect,s=t.useLayoutEffect,c=t.useDebugValue;function l(e,t){var n=t(),r=a({inst:{value:n,getSnapshot:t}}),i=r[0].inst,l=r[1];return s(function(){i.value=n,i.getSnapshot=t,u(i)&&l({inst:i})},[e,n,t]),o(function(){return u(i)&&l({inst:i}),e(function(){u(i)&&l({inst:i})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!i(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;e.useSyncExternalStore=t.useSyncExternalStore===void 0?f:t.useSyncExternalStore})),i=t(((e,t)=>{t.exports=r()})),a=t((e=>{var t=n(),r=i();function a(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var o=typeof Object.is==`function`?Object.is:a,s=r.useSyncExternalStore,c=t.useRef,l=t.useEffect,u=t.useMemo,d=t.useDebugValue;e.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var a=c(null);if(a.current===null){var f={hasValue:!1,value:null};a.current=f}else f=a.current;a=u(function(){function e(e){if(!a){if(a=!0,s=e,e=r(e),i!==void 0&&f.hasValue){var t=f.value;if(i(t,e))return c=t}return c=e}if(t=c,o(s,e))return t;var n=r(e);return i!==void 0&&i(t,n)?(s=e,t):(s=e,c=n)}var a=!1,s,c,l=n===void 0?null:n;return[function(){return e(t())},l===null?void 0:function(){return e(l())}]},[t,n,r,i]);var p=s(e,a[0],a[1]);return l(function(){f.hasValue=!0,f.value=p},[p]),d(p),p}})),o=t(((e,t)=>{t.exports=a()})),s=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},c=(e=>e?s(e):s),l=e(n(),1),{useSyncExternalStoreWithSelector:u}=e(o(),1).default,d=e=>e;function f(e,t=d,n){let r=u(e.subscribe,e.getState,e.getInitialState,t,n);return l.useDebugValue(r),r}var p=(e,t)=>{let n=c(e),r=(e,r=t)=>f(n,e,r);return Object.assign(r,n),r},m=((e,t)=>e?p(e,t):p);export{i,f as n,c as r,m as t};
|
||||
1
docs/assets/traditional-ec-lUAFC.js
Normal file
1
docs/assets/traditional-ec-lUAFC.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e,t}from"./chunk-DECur_0Z.js";import{r as n}from"./jsx-runtime-BpGWiA-R.js";var r=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},i=(e=>e?r(e):r),a=t((e=>{var t=n();function r(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var i=typeof Object.is==`function`?Object.is:r,a=t.useState,o=t.useEffect,s=t.useLayoutEffect,c=t.useDebugValue;function l(e,t){var n=t(),r=a({inst:{value:n,getSnapshot:t}}),i=r[0].inst,l=r[1];return s(function(){i.value=n,i.getSnapshot=t,u(i)&&l({inst:i})},[e,n,t]),o(function(){return u(i)&&l({inst:i}),e(function(){u(i)&&l({inst:i})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!i(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;e.useSyncExternalStore=t.useSyncExternalStore===void 0?f:t.useSyncExternalStore})),o=t(((e,t)=>{t.exports=a()})),s=t((e=>{var t=n(),r=o();function i(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var a=typeof Object.is==`function`?Object.is:i,s=r.useSyncExternalStore,c=t.useRef,l=t.useEffect,u=t.useMemo,d=t.useDebugValue;e.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var o=c(null);if(o.current===null){var f={hasValue:!1,value:null};o.current=f}else f=o.current;o=u(function(){function e(e){if(!o){if(o=!0,s=e,e=r(e),i!==void 0&&f.hasValue){var t=f.value;if(i(t,e))return c=t}return c=e}if(t=c,a(s,e))return t;var n=r(e);return i!==void 0&&i(t,n)?(s=e,t):(s=e,c=n)}var o=!1,s,c,l=n===void 0?null:n;return[function(){return e(t())},l===null?void 0:function(){return e(l())}]},[t,n,r,i]);var p=s(e,o[0],o[1]);return l(function(){f.hasValue=!0,f.value=p},[p]),d(p),p}})),c=t(((e,t)=>{t.exports=s()})),l=e(n(),1),{useSyncExternalStoreWithSelector:u}=e(c(),1).default,d=e=>e;function f(e,t=d,n){let r=u(e.subscribe,e.getState,e.getInitialState,t,n);return l.useDebugValue(r),r}var p=(e,t)=>{let n=i(e),r=(e,r=t)=>f(n,e,r);return Object.assign(r,n),r},m=((e,t)=>e?p(e,t):p);export{i,f as n,o as r,m as t};
|
||||
1
docs/assets/useAnisotropy-Dq6cNuNI.js
Normal file
1
docs/assets/useAnisotropy-Dq6cNuNI.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{o as e}from"./react-three-fiber.esm-CD18QK1u.js";function t(){return e(n)}function n(e){return e.gl.capabilities.getMaxAnisotropy()}export{t};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{c as e}from"./Html-DrHEhPVE.js";import{C as t,Dt as n,Et as r,K as i,N as a,Ot as o,Rt as s,Vt as c,q as l}from"./three.module-DRRYkRPO.js";var u=new a;u.setOptions({premultiplyAlpha:`none`});var d=new Map;function f(e,t){let n=d.get(e);if(n)return t&&n.image&&t(n),n;let r=new s;return r.flipY=!1,d.set(e,r),u.load(e,e=>{r.image=e,r.needsUpdate=!0,t?.(r)}),r}function p(e){let t=d.get(e);return t?t.image?Promise.resolve(t):new Promise(e=>{let n=()=>{t.image?e(t):setTimeout(n,16)};n()}):new Promise((t,n)=>{let r=new s;r.flipY=!1,d.set(e,r),u.load(e,e=>{r.image=e,r.needsUpdate=!0,t(r)},void 0,n)})}function m(e,t={}){let{repeat:r=[1,1],disableMipmaps:a=!1,anisotropy:s,noColorSpace:c=!1}=t;return e.wrapS=e.wrapT=n,c||(e.colorSpace=o),e.repeat.set(...r),e.flipY=!1,e.anisotropy=s??1,a?(e.generateMipmaps=!1,e.minFilter=i):(e.generateMipmaps=!0,e.minFilter=l),e.magFilter=i,e.needsUpdate=!0,e}function h(e){let a=new t(e,256,256,r,c);return a.colorSpace=``,a.wrapS=a.wrapT=n,a.generateMipmaps=!1,a.minFilter=i,a.magFilter=i,a.needsUpdate=!0,a}function g(){return e(_)}function _(e){return e.gl.capabilities.getMaxAnisotropy()}export{m as a,h as i,f as n,p as r,g as t};
|
||||
1
docs/assets/useBaseQuery-D-AnxeNl.js
Normal file
1
docs/assets/useBaseQuery-D-AnxeNl.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/useQuery-BomOZ8gL.js
Normal file
1
docs/assets/useQuery-BomOZ8gL.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
import{r as e,t}from"./useBaseQuery-D-AnxeNl.js";function n(n,r){return t(n,e,r)}export{n as t};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{r as e,t}from"./useBaseQuery-DzUOlyvP.js";function n(n,r){return t(n,e,r)}export{n as t};
|
||||
|
|
@ -19,26 +19,25 @@
|
|||
<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-Ds_qp2Yy.js"></script>
|
||||
<script type="module" crossorigin src="/t2-mapper/assets/index-BEKjcnfN.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/chunk-DECur_0Z.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/preload-helper-yuLzSqLi.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/three.module-DRRYkRPO.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/streamHelpers-BvWKgQMn.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/preload-helper-BPkniflS.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/three.module-C9W4LJrj.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/streamHelpers-CRhKrjgF.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/logger-B058WGzf.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/mission-JRomjECE.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/mission-S3koG-vu.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/jsx-runtime-BpGWiA-R.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/traditional-DhFuLw_p.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/Html-DrHEhPVE.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/engineStore-DeZJbWme.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/traditional-ec-lUAFC.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/react-three-fiber.esm-CD18QK1u.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/engineStore-Mono9lyt.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/stringUtils-EmGsjr9D.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/loaders-BhaVxgpz.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/SettingsProvider-DVIFsPwe.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/manifest-MMwwguGo.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/SettingsProvider-D-grt5cc.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/iconBase-BCRUFbxq.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/JoystickContext-BJFVWHNC.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/scene-6ZXksKVQ.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/cameraTourStore-CDmCk75t.js">
|
||||
<link rel="stylesheet" crossorigin href="/t2-mapper/assets/SettingsProvider-DAQByNim.css">
|
||||
<link rel="stylesheet" crossorigin href="/t2-mapper/assets/index-BulUt8gq.css">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/JoystickContext-D1zeSnLk.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/scene-BpfzP6B-.js">
|
||||
<link rel="modulepreload" crossorigin href="/t2-mapper/assets/cameraTourStore-DQ989o2x.js">
|
||||
<link rel="stylesheet" crossorigin href="/t2-mapper/assets/index-BD1vN1aq.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
|
|
|||
39
scripts/filter-chrome-logs.ts
Normal file
39
scripts/filter-chrome-logs.ts
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
import { createReadStream, createWriteStream } from "node:fs";
|
||||
import * as readline from "node:readline";
|
||||
import { parseArgs } from "node:util";
|
||||
|
||||
process.stdout.on("error", (err: NodeJS.ErrnoException) => {
|
||||
if (err.code === "EPIPE") process.exit(0);
|
||||
throw err;
|
||||
});
|
||||
|
||||
const { values, positionals } = parseArgs({
|
||||
options: {
|
||||
output: { type: "boolean", short: "o", default: false },
|
||||
},
|
||||
allowPositionals: true,
|
||||
});
|
||||
|
||||
const inputFile = positionals[0];
|
||||
|
||||
const input = inputFile
|
||||
? createReadStream(inputFile)
|
||||
: createReadStream("/dev/stdin");
|
||||
const output =
|
||||
values.output && inputFile
|
||||
? createWriteStream(inputFile.replace(/\.log$/, ".filtered.log"))
|
||||
: process.stdout;
|
||||
|
||||
const rl = readline.createInterface({ input });
|
||||
|
||||
for await (const line of rl) {
|
||||
const sub = line
|
||||
.replace(/^(installHook\.js:1 )/, "")
|
||||
.replace(/^eval @ unknown$/, "")
|
||||
.replace(/^([\w.[\]()-]+ @ [\w.@?=…-]+:\d+)$/, "")
|
||||
.replace(/^( ?THREE\.WebGLRenderer: Texture marked for update .*)$/, "")
|
||||
.replace(/^(requestAnimationFrame)$/, "");
|
||||
if (sub) {
|
||||
output.write(sub + "\n");
|
||||
}
|
||||
}
|
||||
|
|
@ -10,11 +10,17 @@ import {
|
|||
} from "three";
|
||||
import { createLogger } from "../logger";
|
||||
import { audioToUrl } from "../loaders";
|
||||
import { useIsDebugTourTarget } from "../state/cameraTourStore";
|
||||
import { DebugMarker } from "./DebugBounds";
|
||||
import { useAudio } from "./AudioContext";
|
||||
import { useDebug, useSettings } from "./SettingsProvider";
|
||||
import { FloatingLabel } from "./FloatingLabel";
|
||||
import { engineStore } from "../state/engineStore";
|
||||
import { AudioEmitterEntity } from "../state/gameEntityTypes";
|
||||
import {
|
||||
getAdjustAudioSpeed,
|
||||
onAdjustAudioSpeedChange,
|
||||
} from "./audioPlaybackRate";
|
||||
|
||||
const log = createLogger("AudioEmitter");
|
||||
|
||||
|
|
@ -26,21 +32,17 @@ export const audioBufferCache = new Map<string, AudioBuffer>();
|
|||
// intrinsic pitch (1.0 for normal, or the voice pitch multiplier for chat).
|
||||
const _activeSounds = new Map<Audio<GainNode | PannerNode>, number>();
|
||||
|
||||
/** Whether to adjust audio pitch to match playback speed. When false, sounds
|
||||
* play at their original pitch regardless of fast-forward/slow-motion. */
|
||||
let _adjustAudioSpeed = true;
|
||||
export function setAdjustAudioSpeedFlag(value: boolean): void {
|
||||
_adjustAudioSpeed = value;
|
||||
// Re-apply rate to all active sounds immediately.
|
||||
// Re-apply playback rate to all active sounds when the flag changes.
|
||||
onAdjustAudioSpeedChange((value) => {
|
||||
const rate = engineStore.getState().playback.rate;
|
||||
for (const [sound, basePitch] of _activeSounds) {
|
||||
try {
|
||||
sound.setPlaybackRate(basePitch * (_adjustAudioSpeed ? rate : 1));
|
||||
sound.setPlaybackRate(basePitch * (value ? rate : 1));
|
||||
} catch {
|
||||
/* disposed */
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/** Register a sound for automatic playback rate tracking during streaming. */
|
||||
export function trackSound(
|
||||
|
|
@ -66,11 +68,8 @@ export function getSoundGeneration(): number {
|
|||
return _soundGeneration;
|
||||
}
|
||||
|
||||
/** Get the effective playback rate for a sound, respecting the adjustAudioSpeed setting. */
|
||||
export function getEffectiveSoundRate(basePitch = 1): number {
|
||||
const rate = engineStore.getState().playback.rate;
|
||||
return basePitch * (_adjustAudioSpeed ? rate : 1);
|
||||
}
|
||||
// Re-export for convenience (canonical definition in audioPlaybackRate.ts).
|
||||
export { getEffectiveSoundRate } from "./audioPlaybackRate";
|
||||
|
||||
/** Stop and unregister all tracked sounds. Called on recording change. */
|
||||
export function stopAllTrackedSounds(): void {
|
||||
|
|
@ -95,7 +94,7 @@ engineStore.subscribe(
|
|||
(rate) => {
|
||||
for (const [sound, basePitch] of _activeSounds) {
|
||||
try {
|
||||
sound.setPlaybackRate(basePitch * (_adjustAudioSpeed ? rate : 1));
|
||||
sound.setPlaybackRate(basePitch * (getAdjustAudioSpeed() ? rate : 1));
|
||||
} catch {
|
||||
// Sound may have been disposed.
|
||||
}
|
||||
|
|
@ -173,14 +172,14 @@ export function playOneShotSound(
|
|||
sound.setMaxDistance(resolved.maxDist);
|
||||
sound.setRolloffFactor(1);
|
||||
sound.setVolume(resolved.volume);
|
||||
sound.setPlaybackRate(_adjustAudioSpeed ? rate : 1);
|
||||
sound.setPlaybackRate(getAdjustAudioSpeed() ? rate : 1);
|
||||
if (position) {
|
||||
sound.position.copy(position);
|
||||
}
|
||||
parent.add(sound);
|
||||
_activeSounds.set(sound, 1);
|
||||
sound.play();
|
||||
sound.source!.onended = () => {
|
||||
(sound.source as AudioBufferSourceNode).onended = () => {
|
||||
_activeSounds.delete(sound);
|
||||
try {
|
||||
sound.disconnect();
|
||||
|
|
@ -193,10 +192,10 @@ export function playOneShotSound(
|
|||
const sound = new Audio(audioListener);
|
||||
sound.setBuffer(buffer);
|
||||
sound.setVolume(resolved.volume);
|
||||
sound.setPlaybackRate(_adjustAudioSpeed ? rate : 1);
|
||||
sound.setPlaybackRate(getAdjustAudioSpeed() ? rate : 1);
|
||||
_activeSounds.set(sound, 1);
|
||||
sound.play();
|
||||
sound.source!.onended = () => {
|
||||
(sound.source as AudioBufferSourceNode).onended = () => {
|
||||
_activeSounds.delete(sound);
|
||||
try {
|
||||
sound.disconnect();
|
||||
|
|
@ -338,7 +337,7 @@ export const AudioEmitter = memo(function AudioEmitter({
|
|||
const gap =
|
||||
gapMin === gapMax ? gapMin : randomValue * (gapMax - gapMin) + gapMin;
|
||||
|
||||
sound.loop = false;
|
||||
(sound as any).loop = false;
|
||||
|
||||
const checkLoop = () => {
|
||||
// Discard callbacks from a previous sound generation.
|
||||
|
|
@ -446,20 +445,27 @@ export const AudioEmitter = memo(function AudioEmitter({
|
|||
}
|
||||
}, [audioEnabled]);
|
||||
|
||||
return debugMode ? (
|
||||
// eslint-disable-next-line react-hooks/refs
|
||||
<mesh position={emitterPosRef.current}>
|
||||
<sphereGeometry args={[minDistance, 12, 12]} />
|
||||
<meshBasicMaterial
|
||||
color="#00ff00"
|
||||
wireframe
|
||||
opacity={0.05}
|
||||
transparent
|
||||
toneMapped={false}
|
||||
/>
|
||||
<FloatingLabel color="#00ff00" position={[0, minDistance + 1, 0]}>
|
||||
{fileName}
|
||||
</FloatingLabel>
|
||||
</mesh>
|
||||
) : null;
|
||||
const isTarget = useIsDebugTourTarget(entity.id);
|
||||
|
||||
return (
|
||||
<>
|
||||
{debugMode && (
|
||||
// eslint-disable-next-line react-hooks/refs
|
||||
<mesh position={emitterPosRef.current}>
|
||||
<sphereGeometry args={[minDistance, 12, 12]} />
|
||||
<meshBasicMaterial
|
||||
color="#00ff00"
|
||||
wireframe
|
||||
opacity={0.05}
|
||||
transparent
|
||||
toneMapped={false}
|
||||
/>
|
||||
<FloatingLabel color="#00ff00" position={[0, minDistance + 1, 0]}>
|
||||
{fileName}
|
||||
</FloatingLabel>
|
||||
</mesh>
|
||||
)}
|
||||
{isTarget && <DebugMarker radius={1.5} />}
|
||||
</>
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ import { useEffect, useId, useMemo } from "react";
|
|||
import { Quaternion, Vector3 } from "three";
|
||||
import { useCameras } from "./CamerasProvider";
|
||||
import type { CameraEntity } from "../state/gameEntityTypes";
|
||||
import { useIsDebugTourTarget } from "../state/cameraTourStore";
|
||||
import { DebugMarker } from "./DebugBounds";
|
||||
|
||||
export function Camera({ entity }: { entity: CameraEntity }) {
|
||||
const { registerCamera, unregisterCamera } = useCameras();
|
||||
|
|
@ -37,5 +39,6 @@ export function Camera({ entity }: { entity: CameraEntity }) {
|
|||
// but clone a new "flying" camera when the user moves. The other is to not
|
||||
// have multiple cameras at all, but rather update the default camera with
|
||||
// new position information when cycling. This uses the latter approach.
|
||||
return null;
|
||||
const isTarget = useIsDebugTourTarget(entity.id);
|
||||
return isTarget ? <DebugMarker radius={1.5} /> : null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import {
|
|||
import { cameraTourStore } from "../state/cameraTourStore";
|
||||
import type { TourAnimation } from "../state/cameraTourStore";
|
||||
import type { TourTarget } from "./mapTourCategories";
|
||||
import { globalFogUniforms } from "../globalFogUniforms";
|
||||
import { createLogger } from "../logger";
|
||||
|
||||
const log = createLogger("CameraTourConsumer");
|
||||
|
|
@ -23,8 +24,17 @@ function easeInOutCubic(t: number): number {
|
|||
}
|
||||
|
||||
const FALLBACK_ORBIT_RADIUS = 3;
|
||||
/** Orbit radius for entities without geometry (WayPoints, markers, etc.). */
|
||||
const POINT_ORBIT_RADIUS = 10;
|
||||
const DEFAULT_ORBIT_HEIGHT = 2;
|
||||
const MIN_ORBIT_RADIUS = 1.8;
|
||||
/** Orbit radius above which fog starts reducing during tours. */
|
||||
const FOG_REDUCE_THRESHOLD = 50;
|
||||
/** Divisor for fog scale: fogDistanceScale = orbitRadius / FOG_REDUCE_DIVISOR.
|
||||
* Smaller values = more aggressive fog reduction. */
|
||||
const FOG_REDUCE_DIVISOR = 200;
|
||||
/** Speed at which fogDistanceScale animates (per second). */
|
||||
const FOG_SCALE_SPEED = 2;
|
||||
/** Extra orbit radius added beyond half the object's height. */
|
||||
const ORBIT_PAD_VERTICAL = 1.8;
|
||||
/** Extra orbit radius added beyond half the object's spread (width/length). */
|
||||
|
|
@ -102,7 +112,21 @@ function resolveTargetBounds(
|
|||
animation: TourAnimation,
|
||||
): void {
|
||||
const obj = scene.getObjectByName(target.entityId);
|
||||
// Check if the scene object has any geometry to compute bounds from.
|
||||
let hasGeometry = false;
|
||||
if (obj) {
|
||||
obj.traverse((child: any) => {
|
||||
if (child.geometry) hasGeometry = true;
|
||||
});
|
||||
}
|
||||
if (obj && !hasGeometry) {
|
||||
// Entity exists but has no geometry (WayPoints, markers, etc.).
|
||||
// Use target position directly with a wider orbit.
|
||||
animation.orbitCenter = [...target.position];
|
||||
animation.orbitRadius = POINT_ORBIT_RADIUS;
|
||||
return;
|
||||
}
|
||||
if (obj && hasGeometry) {
|
||||
// World-space AABB center for the orbit focus (where the camera looks).
|
||||
_box.setFromObject(obj);
|
||||
_box.getCenter(_center);
|
||||
|
|
@ -130,7 +154,28 @@ function resolveTargetBounds(
|
|||
const fromHeight = height / 2 + ORBIT_PAD_VERTICAL;
|
||||
const fromSpread = spread / 2 + ORBIT_PAD_HORIZONTAL;
|
||||
const computed = Math.max(fromHeight, fromSpread);
|
||||
animation.orbitRadius = Math.max(MIN_ORBIT_RADIUS, computed);
|
||||
// For very large objects (terrain, water), use target position as orbit
|
||||
// center and compute a stable radius from the single-tile geometry bounds
|
||||
// (setFromObject includes dynamic instanced tiles that vary with camera).
|
||||
const isLarge = computed > 200;
|
||||
if (isLarge) {
|
||||
animation.orbitCenter = [...target.position];
|
||||
// Use only the first geometry child's bounds for stable sizing.
|
||||
let stableSpread = 0;
|
||||
obj.traverse((child: any) => {
|
||||
if (stableSpread > 0 || !child.geometry) return;
|
||||
if (!child.geometry.boundingBox) child.geometry.computeBoundingBox();
|
||||
const bb = child.geometry.boundingBox;
|
||||
const sx = bb.max.x - bb.min.x;
|
||||
const sy = bb.max.y - bb.min.y;
|
||||
const sz = bb.max.z - bb.min.z;
|
||||
stableSpread = Math.max(sx, sy, sz);
|
||||
});
|
||||
const stableRadius = (stableSpread / 2 + ORBIT_PAD_HORIZONTAL) * 0.75;
|
||||
animation.orbitRadius = Math.max(MIN_ORBIT_RADIUS, stableRadius);
|
||||
} else {
|
||||
animation.orbitRadius = Math.max(MIN_ORBIT_RADIUS, computed);
|
||||
}
|
||||
const driver = fromHeight >= fromSpread ? "height" : "spread";
|
||||
const clamp = computed < MIN_ORBIT_RADIUS ? " (clamped)" : "";
|
||||
log.debug(
|
||||
|
|
@ -189,8 +234,14 @@ function buildCurve(
|
|||
|
||||
// Midpoint: halfway between start and entry, elevated proportionally.
|
||||
const mid = new Vector3().addVectors(startPos, entry).multiplyScalar(0.5);
|
||||
// Pull midpoint toward the target and elevate.
|
||||
mid.lerp(focus, 0.3);
|
||||
// Pull midpoint toward the focus — but only if it won't create a dip
|
||||
// closer than the orbit entry. For large orbits where the camera is
|
||||
// already far out, pulling toward focus causes an unnecessary zoom-in.
|
||||
const midDistToFocus = mid.distanceTo(focus);
|
||||
const entryDistToFocus = entry.distanceTo(focus);
|
||||
if (midDistToFocus > entryDistToFocus) {
|
||||
mid.lerp(focus, 0.3);
|
||||
}
|
||||
mid.y += distance * 0.15;
|
||||
|
||||
return new CatmullRomCurve3(
|
||||
|
|
@ -333,7 +384,6 @@ function advanceOrbit(
|
|||
}
|
||||
|
||||
export function CameraTourConsumer() {
|
||||
const invalidate = useThree((s) => s.invalidate);
|
||||
const camera = useThree((s) => s.camera);
|
||||
const scene = useThree((s) => s.scene);
|
||||
const prevAnimationRef = useRef<TourAnimation | null>(null);
|
||||
|
|
@ -357,6 +407,31 @@ export function CameraTourConsumer() {
|
|||
|
||||
useFrame((_state, delta) => {
|
||||
const animation = cameraTourStore.getState().animation;
|
||||
|
||||
// Reduce fog when orbiting far targets. fogDistanceScale divides all
|
||||
// distance-based fog calculations (both haze and volumetric volumes),
|
||||
// making geometry appear closer to the camera for fog purposes.
|
||||
const orbitR = animation ? getOrbitRadius(animation) : 0;
|
||||
const targetScale =
|
||||
animation && orbitR >= FOG_REDUCE_THRESHOLD
|
||||
? orbitR / FOG_REDUCE_DIVISOR
|
||||
: 1;
|
||||
const currentScale = globalFogUniforms.fogDistanceScale.value;
|
||||
if (currentScale !== targetScale) {
|
||||
const step = FOG_SCALE_SPEED * delta;
|
||||
if (targetScale > currentScale) {
|
||||
globalFogUniforms.fogDistanceScale.value = Math.min(
|
||||
currentScale + step,
|
||||
targetScale,
|
||||
);
|
||||
} else {
|
||||
globalFogUniforms.fogDistanceScale.value = Math.max(
|
||||
currentScale - step,
|
||||
targetScale,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!animation) {
|
||||
if (prevAnimationRef.current) {
|
||||
stripRoll(camera.quaternion);
|
||||
|
|
@ -365,7 +440,6 @@ export function CameraTourConsumer() {
|
|||
return;
|
||||
}
|
||||
|
||||
invalidate();
|
||||
prevAnimationRef.current = animation;
|
||||
|
||||
if (animation.phase === "traveling") {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import {
|
|||
untrackSound,
|
||||
} from "./AudioEmitter";
|
||||
import { useSettings } from "./SettingsProvider";
|
||||
import { engineStore, useEngineSelector } from "../state/engineStore";
|
||||
import { useEngineSelector } from "../state/engineStore";
|
||||
import type { ChatMessage } from "../stream/types";
|
||||
|
||||
/**
|
||||
|
|
@ -52,7 +52,6 @@ export function ChatSoundPlayer() {
|
|||
try {
|
||||
const url = audioToUrl(msg.soundPath);
|
||||
const pitch = msg.soundPitch ?? 1;
|
||||
const rate = engineStore.getState().playback.rate;
|
||||
const sender = msg.sender;
|
||||
const gen = getSoundGeneration();
|
||||
getCachedAudioBuffer(url, audioLoader, (buffer) => {
|
||||
|
|
@ -84,7 +83,7 @@ export function ChatSoundPlayer() {
|
|||
}
|
||||
sound.play();
|
||||
// Clean up the source node once playback finishes.
|
||||
sound.source!.onended = () => {
|
||||
(sound.source as AudioBufferSourceNode).onended = () => {
|
||||
untrackSound(sound);
|
||||
try {
|
||||
sound.disconnect();
|
||||
|
|
|
|||
38
src/components/DebugBounds.tsx
Normal file
38
src/components/DebugBounds.tsx
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
import { useMemo } from "react";
|
||||
import { BoxGeometry, EdgesGeometry, SphereGeometry } from "three";
|
||||
|
||||
const debugMaterial = (
|
||||
<lineBasicMaterial
|
||||
color="#ff0000"
|
||||
depthTest={false}
|
||||
depthWrite={false}
|
||||
fog={false}
|
||||
transparent
|
||||
/>
|
||||
);
|
||||
|
||||
/** Red wireframe bounding box for debug tour visualization. */
|
||||
export function DebugBounds({ size }: { size: [number, number, number] }) {
|
||||
const edges = useMemo(
|
||||
() => new EdgesGeometry(new BoxGeometry(...size)),
|
||||
[size[0], size[1], size[2]], // eslint-disable-line react-hooks/exhaustive-deps
|
||||
);
|
||||
return (
|
||||
<lineSegments geometry={edges} renderOrder={9999}>
|
||||
{debugMaterial}
|
||||
</lineSegments>
|
||||
);
|
||||
}
|
||||
|
||||
/** Red wireframe sphere for point entities without geometry. */
|
||||
export function DebugMarker({ radius = 1 }: { radius?: number }) {
|
||||
const edges = useMemo(
|
||||
() => new EdgesGeometry(new SphereGeometry(radius, 8, 6)),
|
||||
[radius],
|
||||
);
|
||||
return (
|
||||
<lineSegments geometry={edges} renderOrder={9999}>
|
||||
{debugMaterial}
|
||||
</lineSegments>
|
||||
);
|
||||
}
|
||||
|
|
@ -1,53 +1,8 @@
|
|||
import { Stats, Html } from "@react-three/drei";
|
||||
import { useEffect, useMemo, useRef } from "react";
|
||||
import { useFrame } from "@react-three/fiber";
|
||||
import {
|
||||
AxesHelper,
|
||||
Color,
|
||||
MeshLambertMaterial,
|
||||
SphereGeometry,
|
||||
Vector3,
|
||||
} from "three";
|
||||
import { injectCustomFog } from "../fogShader";
|
||||
import { globalFogUniforms } from "../globalFogUniforms";
|
||||
import { injectShapeLighting, injectShapeEnvMap } from "../shapeMaterial";
|
||||
import { useEffect, useRef } from "react";
|
||||
import { AxesHelper } from "three";
|
||||
import styles from "./DebugElements.module.css";
|
||||
|
||||
const debugSphereGeo = new SphereGeometry(10, 64, 64);
|
||||
|
||||
/**
|
||||
* A chrome sphere that visualizes the env map. Placed 30 units in front of
|
||||
* the camera so you can always see it.
|
||||
*/
|
||||
function DebugEnvMapSphere() {
|
||||
const meshRef = useRef<THREE.Mesh>(null);
|
||||
|
||||
const material = useMemo(() => {
|
||||
const mat = new MeshLambertMaterial({
|
||||
color: new Color(0.5, 0.5, 0.5),
|
||||
});
|
||||
mat.customProgramCacheKey = () => "debug-envmap-sphere";
|
||||
mat.onBeforeCompile = (shader) => {
|
||||
injectCustomFog(shader, globalFogUniforms);
|
||||
injectShapeLighting(shader);
|
||||
injectShapeEnvMap(shader, 1.0);
|
||||
};
|
||||
return mat;
|
||||
}, []);
|
||||
|
||||
const _dir = useMemo(() => new Vector3(), []);
|
||||
|
||||
// Follow the camera: position 80 units in front.
|
||||
useFrame(({ camera }) => {
|
||||
const mesh = meshRef.current;
|
||||
if (!mesh) return;
|
||||
camera.getWorldDirection(_dir);
|
||||
mesh.position.copy(camera.position).addScaledVector(_dir, 80);
|
||||
});
|
||||
|
||||
return <mesh ref={meshRef} geometry={debugSphereGeo} material={material} />;
|
||||
}
|
||||
|
||||
export function DebugElements() {
|
||||
const axesRef = useRef<AxesHelper>(null);
|
||||
|
||||
|
|
@ -85,7 +40,6 @@ export function DebugElements() {
|
|||
X
|
||||
</span>
|
||||
</Html>
|
||||
<DebugEnvMapSphere />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
135
src/components/DebugEntityList.module.css
Normal file
135
src/components/DebugEntityList.module.css
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
.Container {
|
||||
}
|
||||
|
||||
.Title {
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
margin: 16px 10px 8px 10px;
|
||||
}
|
||||
|
||||
.Header {
|
||||
font-size: 12px;
|
||||
opacity: 0.6;
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
.Group {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.GroupHeader {
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
padding: 6px 8px;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.GroupHeader::-webkit-details-marker {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.GroupHeader::before {
|
||||
content: "[+] ";
|
||||
font-family: monospace;
|
||||
color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.Group[open] > .GroupHeader::before {
|
||||
content: "[-] ";
|
||||
}
|
||||
|
||||
.GroupCount {
|
||||
font-weight: normal;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.List {
|
||||
margin: 4px 0 8px 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
overflow: hidden;
|
||||
border-radius: 3px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
.ListItem {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.EntityRow {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
.EntityRow input[type="checkbox"] {
|
||||
margin-top: 2px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.EntityInfo {
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.LocateButton {
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 8px 9px 8px 7px;
|
||||
background: transparent;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
cursor: pointer;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.LocateButton:hover:not(:disabled) {
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.LocateButton:disabled {
|
||||
opacity: 0.25;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.EntityRow[data-disabled] {
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
.ListItem:not(:last-child) {
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.Type {
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.ID {
|
||||
background: rgba(159, 166, 169, 0.2);
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
font-size: 11px;
|
||||
margin: 0 0 0 4px;
|
||||
padding: 3px 5px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.Detail {
|
||||
display: block;
|
||||
font-size: 13px;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
margin: 4px 0 0 0;
|
||||
}
|
||||
169
src/components/DebugEntityList.tsx
Normal file
169
src/components/DebugEntityList.tsx
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
import { memo, useMemo, useCallback } from "react";
|
||||
import { FaLocationArrow } from "react-icons/fa6";
|
||||
import { useGameEntities } from "../state/gameEntityStore";
|
||||
import { cameraTourStore } from "../state/cameraTourStore";
|
||||
import type { GameEntity } from "../state/gameEntityTypes";
|
||||
import { torqueToThree } from "../scene/coordinates";
|
||||
import { gameEntityStore, useDebugHidden } from "../state/gameEntityStore";
|
||||
import { useSettings } from "./SettingsProvider";
|
||||
import styles from "./DebugEntityList.module.css";
|
||||
|
||||
function getEntityLabel(entity: GameEntity): string {
|
||||
if (entity.renderType === "Player" && "playerName" in entity) {
|
||||
return entity.playerName ?? entity.className;
|
||||
}
|
||||
if (entity.renderType === "WayPoint" && "label" in entity) {
|
||||
return entity.label ?? entity.className;
|
||||
}
|
||||
return entity.className;
|
||||
}
|
||||
|
||||
function getEntityDetail(entity: GameEntity): string | undefined {
|
||||
if ("shapeName" in entity && entity.shapeName) return entity.shapeName;
|
||||
if (entity.renderType === "InteriorInstance" && "interiorData" in entity) {
|
||||
return entity.interiorData.interiorFile;
|
||||
}
|
||||
if ("dataBlock" in entity && entity.dataBlock) return entity.dataBlock;
|
||||
if (entity.renderType === "TerrainBlock" && "terrainData" in entity)
|
||||
return entity.terrainData.terrFileName;
|
||||
if (entity.renderType === "WaterBlock" && "waterData" in entity)
|
||||
return entity.waterData.surfaceName;
|
||||
if ("audioFileName" in entity && entity.audioFileName)
|
||||
return entity.audioFileName;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function getEntityPosition(
|
||||
entity: GameEntity,
|
||||
): [number, number, number] | undefined {
|
||||
if ("position" in entity && entity.position) return entity.position;
|
||||
// Scene entities store position inside their typed data.
|
||||
if (entity.renderType === "InteriorInstance" && "interiorData" in entity) {
|
||||
return torqueToThree(entity.interiorData.transform.position);
|
||||
}
|
||||
if (entity.renderType === "WaterBlock" && "waterData" in entity) {
|
||||
const pos = torqueToThree(entity.waterData.transform.position);
|
||||
const scale = entity.waterData.scale;
|
||||
// Water transform position is the corner; offset to center.
|
||||
return [pos[0] + scale.y / 2, pos[1] + scale.z / 2, pos[2] + scale.x / 2];
|
||||
}
|
||||
if (entity.renderType === "TerrainBlock") {
|
||||
return [0, 0, 0];
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function EntityRow({ entity }: { entity: GameEntity }) {
|
||||
const pos = getEntityPosition(entity);
|
||||
const detail = getEntityDetail(entity);
|
||||
const label = getEntityLabel(entity);
|
||||
const hidden = useDebugHidden(entity.id);
|
||||
const { audioEnabled } = useSettings();
|
||||
const isAudioEmitter = entity.renderType === "AudioEmitter";
|
||||
const disabled = isAudioEmitter && !audioEnabled;
|
||||
const canLocate = !!pos && !hidden && !disabled;
|
||||
const handleClick = useCallback(() => {
|
||||
if (!pos) return;
|
||||
cameraTourStore
|
||||
.getState()
|
||||
.flyTo({ entityId: entity.id, label, position: pos }, "debug");
|
||||
}, [entity.id, label, pos]);
|
||||
|
||||
const handleToggle = useCallback(() => {
|
||||
const store = gameEntityStore.getState();
|
||||
const entities = store.isStreaming
|
||||
? store.streamEntities
|
||||
: store.missionEntities;
|
||||
const e = entities.get(entity.id);
|
||||
if (e) {
|
||||
// New object reference so useAllGameEntities' identity check detects the change.
|
||||
entities.set(entity.id, { ...e, debugHidden: !e.debugHidden });
|
||||
gameEntityStore.setState({ version: store.version + 1 });
|
||||
}
|
||||
}, [entity.id]);
|
||||
|
||||
return (
|
||||
<div className={styles.EntityRow} data-disabled={disabled || undefined}>
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={!hidden}
|
||||
onChange={handleToggle}
|
||||
disabled={disabled}
|
||||
title={hidden ? "Show entity" : "Hide entity"}
|
||||
/>
|
||||
<div className={styles.EntityInfo}>
|
||||
<div>
|
||||
<span className={styles.Type}>{label}</span>{" "}
|
||||
<span className={styles.ID}>{entity.id}</span>
|
||||
</div>
|
||||
{detail && <span className={styles.Detail}>{detail}</span>}
|
||||
</div>
|
||||
{pos && (
|
||||
<button
|
||||
type="button"
|
||||
className={styles.LocateButton}
|
||||
onClick={handleClick}
|
||||
disabled={!canLocate}
|
||||
title={`Fly to ${label}`}
|
||||
>
|
||||
<FaLocationArrow />
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export const DebugEntityList = memo(function DebugEntityList() {
|
||||
const entities = useGameEntities();
|
||||
// useGameEntities re-renders on version bump, but the Map reference is
|
||||
// stable (mutated in place). Use version as a useMemo dep to recompute.
|
||||
const version = gameEntityStore.getState().version;
|
||||
|
||||
const grouped = useMemo(() => {
|
||||
const groups = new Map<string, GameEntity[]>();
|
||||
for (const entity of entities.values()) {
|
||||
if (
|
||||
entity.renderType === "Sky" ||
|
||||
entity.renderType === "Sun" ||
|
||||
entity.renderType === "MissionArea" ||
|
||||
entity.renderType === "None"
|
||||
)
|
||||
continue;
|
||||
const key = entity.className;
|
||||
let list = groups.get(key);
|
||||
if (!list) {
|
||||
list = [];
|
||||
groups.set(key, list);
|
||||
}
|
||||
list.push(entity);
|
||||
}
|
||||
// Sort groups by class name, entities within each group by ID.
|
||||
const sorted = [...groups.entries()].sort(([a], [b]) => a.localeCompare(b));
|
||||
for (const [, list] of sorted) {
|
||||
list.sort((a, b) => a.id.localeCompare(b.id));
|
||||
}
|
||||
return sorted;
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [entities, version]);
|
||||
|
||||
return (
|
||||
<div className={styles.Container}>
|
||||
<h4 className={styles.Title}>Entity list</h4>
|
||||
{grouped.map(([className, list]) => (
|
||||
<details key={className} className={styles.Group}>
|
||||
<summary className={styles.GroupHeader}>
|
||||
{className}{" "}
|
||||
<span className={styles.GroupCount}>({list.length})</span>
|
||||
</summary>
|
||||
<ul className={styles.List}>
|
||||
{list.map((entity) => (
|
||||
<li key={entity.id} className={styles.ListItem}>
|
||||
<EntityRow entity={entity} />
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</details>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
|
@ -101,9 +101,9 @@ export const EntityRenderer = memo(function EntityRenderer({
|
|||
case "WayPoint":
|
||||
return <WayPoint entity={entity} />;
|
||||
case "TerrainBlock":
|
||||
return <TerrainBlock scene={entity.terrainData} />;
|
||||
return <TerrainBlock entity={entity} />;
|
||||
case "InteriorInstance":
|
||||
return <InteriorInstance scene={entity.interiorData} />;
|
||||
return <InteriorInstance entity={entity} />;
|
||||
case "Sky":
|
||||
return <Sky entity={entity} />;
|
||||
case "Sun":
|
||||
|
|
@ -164,6 +164,7 @@ function ShapeEntity({ entity }: { entity: ShapeEntityType }) {
|
|||
loadingColor={loadingColor}
|
||||
streamEntity={torqueObject ? undefined : entity}
|
||||
emap={entity.emap}
|
||||
entityId={entity.id}
|
||||
>
|
||||
{flagLabel ? (
|
||||
<FloatingLabel opacity={0.6}>{flagLabel}</FloatingLabel>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { memo, useCallback, useRef, useState, useMemo, Suspense } from "react";
|
||||
import { memo, useCallback, useRef, useState, useMemo } from "react";
|
||||
import { Quaternion } from "three";
|
||||
import type { Group } from "three";
|
||||
import { useFrame } from "@react-three/fiber";
|
||||
|
|
@ -72,6 +72,8 @@ const EntityWrapper = memo(function EntityWrapper({
|
|||
}: {
|
||||
entity: GameEntity;
|
||||
}) {
|
||||
if (entity.debugHidden) return null;
|
||||
|
||||
// Scene infrastructure handles its own positioning and Suspense — render
|
||||
// directly. The named group allows the interpolation loop to skip them.
|
||||
if (isSceneEntity(entity)) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
import { useEffect, useMemo, useRef } from "react";
|
||||
import { useIsDebugTourTarget } from "../state/cameraTourStore";
|
||||
import { DebugBounds } from "./DebugBounds";
|
||||
import { DebugSuspense } from "./DebugSuspense";
|
||||
import { useTexture } from "@react-three/drei";
|
||||
import { useFrame } from "@react-three/fiber";
|
||||
|
|
@ -133,6 +135,7 @@ function ForceFieldMesh({
|
|||
export function ForceFieldBare({ entity }: { entity: ForceFieldBareEntity }) {
|
||||
const data = entity.forceFieldData!;
|
||||
const scale = data.dimensions;
|
||||
const isTarget = useIsDebugTourTarget(entity.id);
|
||||
|
||||
const textureUrls = useMemo(
|
||||
() => data.textures.map((t) => textureToUrl(t)),
|
||||
|
|
@ -150,17 +153,20 @@ export function ForceFieldBare({ entity }: { entity: ForceFieldBareEntity }) {
|
|||
}
|
||||
|
||||
return (
|
||||
<DebugSuspense
|
||||
name={`ForceField`}
|
||||
fallback={
|
||||
<ForceFieldFallback
|
||||
scale={scale}
|
||||
color={data.color}
|
||||
baseTranslucency={data.baseTranslucency}
|
||||
/>
|
||||
}
|
||||
>
|
||||
<ForceFieldMesh scale={scale} data={data} />
|
||||
</DebugSuspense>
|
||||
<>
|
||||
<DebugSuspense
|
||||
name={`ForceField`}
|
||||
fallback={
|
||||
<ForceFieldFallback
|
||||
scale={scale}
|
||||
color={data.color}
|
||||
baseTranslucency={data.baseTranslucency}
|
||||
/>
|
||||
}
|
||||
>
|
||||
<ForceFieldMesh scale={scale} data={data} />
|
||||
</DebugSuspense>
|
||||
{isTarget && scale && <DebugBounds size={scale} />}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue