(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,63724,e=>{"use strict";e.s(["ForceFieldBare",()=>v],63724);var r=e.i(43476),n=e.i(71645),t=e.i(47071),o=e.i(5230),a=e.i(90072),l=e.i(62395),i=e.i(12979),s=e.i(79123),u=e.i(77482);function c(e){let r=(0,n.useMemo)(()=>{let[r,n,t]=e,o=new a.BoxGeometry(r,n,t);return o.translate(r/2,n/2,t/2),o},[e]);return(0,n.useEffect)(()=>()=>r.dispose(),[r]),r}function m(e){let{scale:l,color:i,baseTranslucency:u,textureUrls:m,numFrames:p,framesPerSec:v,scrollSpeed:f,umapping:d,vmapping:g}=e,{animationEnabled:h}=(0,s.useSettings)(),x=c(l),b=(0,t.useTexture)(m,e=>{e.forEach(e=>{e.wrapS=e.wrapT=a.RepeatWrapping,e.colorSpace=a.NoColorSpace,e.flipY=!1,e.needsUpdate=!0})}),y=(0,n.useMemo)(()=>{var e,r,n,t,o;let s=[...l].sort((e,r)=>r-e),c=new a.Vector2(s[0]*d,s[1]*g),m=b[0];return new a.ShaderMaterial({uniforms:{frame0:{value:null!=(e=b[0])?e:m},frame1:{value:null!=(r=b[1])?r:m},frame2:{value:null!=(n=b[2])?n:m},frame3:{value:null!=(t=b[3])?t:m},frame4:{value:null!=(o=b[4])?o:m},currentFrame:{value:0},vScroll:{value:0},uvScale:{value:c},tintColor:{value:new a.Color(...i)},opacity:{value:u}},vertexShader:"\nvarying vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",fragmentShader:"\nuniform sampler2D frame0;\nuniform sampler2D frame1;\nuniform sampler2D frame2;\nuniform sampler2D frame3;\nuniform sampler2D frame4;\nuniform int currentFrame;\nuniform float vScroll;\nuniform vec2 uvScale;\nuniform vec3 tintColor;\nuniform float opacity;\n\nvarying vec2 vUv;\n\n// FIXME: This gamma correction may not be accurate. Tribes 2 had no gamma correction;\n// Three.js applies gamma on output, so we pre-darken to compensate. The result is\n// close but not quite right - the force field is still slightly more opaque than in T2.\nvec3 srgbToLinear(vec3 srgb) {\n return pow(srgb, vec3(2.2));\n}\n\nvoid main() {\n // Scale and scroll UVs\n vec2 scrolledUv = vec2(vUv.x * uvScale.x, vUv.y * uvScale.y + vScroll);\n\n // Sample the current frame\n vec4 texColor;\n if (currentFrame == 0) {\n texColor = texture2D(frame0, scrolledUv);\n } else if (currentFrame == 1) {\n texColor = texture2D(frame1, scrolledUv);\n } else if (currentFrame == 2) {\n texColor = texture2D(frame2, scrolledUv);\n } else if (currentFrame == 3) {\n texColor = texture2D(frame3, scrolledUv);\n } else {\n texColor = texture2D(frame4, scrolledUv);\n }\n\n // Apply color tint with constant opacity (like Tribes 2's GL_MODULATE)\n vec3 finalColor = texColor.rgb * tintColor;\n\n // Pre-darken to counteract renderer's sRGB gamma encoding\n // This makes additive blending behave like Tribes 2's non-gamma-corrected output\n finalColor = srgbToLinear(finalColor);\n\n // FIXME: Halving opacity is a rough approximation to compensate for front+back faces\n // both contributing (BoxGeometry with DoubleSide causes additive stacking that Tribes 2's\n // thin quads didn't have). This doesn't account for viewing angles where more faces are visible.\n gl_FragColor = vec4(finalColor, opacity * 0.5);\n}\n",transparent:!0,blending:a.AdditiveBlending,side:a.DoubleSide,depthWrite:!1})},[b,l,d,g,i,u]);(0,n.useEffect)(()=>()=>y.dispose(),[y]);let S=(0,n.useRef)(0);return(0,o.useFrame)((e,r)=>{if(!h){S.current=0,y.uniforms.currentFrame.value=0,y.uniforms.vScroll.value=0;return}S.current+=r,y.uniforms.currentFrame.value=Math.floor(S.current*v)%p,y.uniforms.vScroll.value=S.current*f}),(0,r.jsx)("mesh",{geometry:x,material:y})}function p(e){let{scale:n,color:t,baseTranslucency:o}=e,l=c(n);return(0,r.jsx)("mesh",{geometry:l,children:(0,r.jsx)("meshBasicMaterial",{color:new a.Color(...t),transparent:!0,opacity:.5*o,blending:a.AdditiveBlending,side:a.DoubleSide,depthWrite:!1})})}let v=(0,n.memo)(function(e){let{object:t}=e,o=(0,n.useMemo)(()=>(0,l.getPosition)(t),[t]),a=(0,n.useMemo)(()=>(0,l.getRotation)(t),[t]),s=(0,n.useMemo)(()=>(0,l.getScale)(t),[t]),c=function(e){let r=(0,u.useRuntime)();if(e)return r.state.datablocks.get(e)}((0,l.getProperty)(t,"dataBlock")),v=(0,l.getProperty)(c,"color"),f=(0,n.useMemo)(()=>v?function(e){var r,n,t;let o=e.split(" ").map(e=>parseFloat(e));return[null!=(r=o[0])?r:0,null!=(n=o[1])?n:0,null!=(t=o[2])?t:0]}(v):[1,1,1],[v]),d=parseFloat((0,l.getProperty)(c,"baseTranslucency"))||1,g=parseInt((0,l.getProperty)(c,"numFrames"),10)||1,h=parseFloat((0,l.getProperty)(c,"framesPerSec"))||1,x=parseFloat((0,l.getProperty)(c,"scrollSpeed"))||0,b=parseFloat((0,l.getProperty)(c,"umapping"))||1,y=parseFloat((0,l.getProperty)(c,"vmapping"))||1,S=(0,n.useMemo)(()=>(function(e,r){let n=[];for(let t=0;t