mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-01-19 20:25:01 +00:00
1 line
5.5 KiB
JavaScript
1 line
5.5 KiB
JavaScript
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,63724,e=>{"use strict";e.s(["ForceFieldBare",()=>d],63724);var r=e.i(43476),o=e.i(71645),t=e.i(47071),n=e.i(5230),a=e.i(90072),l=e.i(62395),i=e.i(12979),u=e.i(79123),s=e.i(6112);function c(e){let r=(0,o.useMemo)(()=>{let[r,o,t]=e,n=new a.BoxGeometry(r,o,t);return n.translate(r/2,o/2,t/2),n},[e]);return(0,o.useEffect)(()=>()=>r.dispose(),[r]),r}function m(e){let{scale:l,color:i,baseTranslucency:s,textureUrls:m,numFrames:f,framesPerSec:d,scrollSpeed:p,umapping:v,vmapping:g}=e,{animationEnabled:h}=(0,u.useSettings)(),x=c(l),y=(0,t.useTexture)(m,e=>{e.forEach(e=>{e.wrapS=e.wrapT=a.RepeatWrapping,e.colorSpace=a.LinearSRGBColorSpace,e.flipY=!1,e.needsUpdate=!0})}),F=(0,o.useMemo)(()=>(function(e){var r,o,t,n;let{textures:l,scale:i,umapping:u,vmapping:s,color:c,baseTranslucency:m}=e,f=[...i].sort((e,r)=>r-e),d=new a.Vector2(f[0]*u,f[1]*s),p=l[0];return new a.ShaderMaterial({uniforms:{frame0:{value:p},frame1:{value:null!=(r=l[1])?r:p},frame2:{value:null!=(o=l[2])?o:p},frame3:{value:null!=(t=l[3])?t:p},frame4:{value:null!=(n=l[4])?n:p},currentFrame:{value:0},vScroll:{value:0},uvScale:{value:d},tintColor:{value:new a.Color(...c)},opacity:{value:m},opacityFactor:{value:.5},fogColor:{value:new a.Color},fogNear:{value:1},fogFar:{value:2e3}},vertexShader:"\n#include <fog_pars_vertex>\n\nvarying vec2 vUv;\n\nvoid main() {\n vUv = uv;\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * mvPosition;\n #include <fog_vertex>\n}\n",fragmentShader:"\n#include <fog_pars_fragment>\n\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;\nuniform float opacityFactor;\n\nvarying vec2 vUv;\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 // Tribes 2 GL_MODULATE: output = texture * vertexColor\n vec3 modulatedColor = texColor.rgb * tintColor;\n\n // Gamma correction: T2 textures were authored for CRT displays (~2.2 gamma).\n // Converting to linear space makes them appear as they did on those displays.\n // This significantly darkens the colors to match the original look.\n modulatedColor = pow(modulatedColor, vec3(2.2));\n\n float adjustedOpacity = opacity * opacityFactor;\n\n gl_FragColor = vec4(modulatedColor, adjustedOpacity);\n\n // Custom fog for additive blending: fade out rather than blend to fog color.\n // Standard fog (mix toward fogColor) doesn't work with additive blending\n // because we'd still be adding fogColor to the framebuffer.\n #ifdef USE_FOG\n #ifdef FOG_EXP2\n float fogFactor = 1.0 - exp(-fogDensity * fogDensity * vFogDepth * vFogDepth);\n #else\n float fogFactor = smoothstep(fogNear, fogFar, vFogDepth);\n #endif\n gl_FragColor.a *= 1.0 - fogFactor;\n #endif\n}\n",transparent:!0,blending:a.AdditiveBlending,side:a.DoubleSide,depthWrite:!1,fog:!0})})({textures:y,scale:l,umapping:v,vmapping:g,color:i,baseTranslucency:s}),[y,l,v,g,i,s]);(0,o.useEffect)(()=>()=>F.dispose(),[F]);let S=(0,o.useRef)(0);return(0,n.useFrame)((e,r)=>{if(!h){S.current=0,F.uniforms.currentFrame.value=0,F.uniforms.vScroll.value=0;return}S.current+=r,F.uniforms.currentFrame.value=Math.floor(S.current*d)%f,F.uniforms.vScroll.value=S.current*p}),(0,r.jsx)("mesh",{geometry:x,material:F,renderOrder:1})}function f(e){let{scale:t,color:n,baseTranslucency:l}=e,i=c(t),u=(0,o.useMemo)(()=>new a.Color(Math.pow(n[0],2.2),Math.pow(n[1],2.2),Math.pow(n[2],2.2)),[n]);return(0,r.jsx)("mesh",{geometry:i,renderOrder:1,children:(0,r.jsx)("meshBasicMaterial",{color:u,transparent:!0,opacity:.5*l,blending:a.AdditiveBlending,side:a.DoubleSide,depthWrite:!1,fog:!1})})}let d=(0,o.memo)(function(e){let{object:t}=e,n=(0,o.useMemo)(()=>(0,l.getPosition)(t),[t]),a=(0,o.useMemo)(()=>(0,l.getRotation)(t),[t]),u=(0,o.useMemo)(()=>(0,l.getScale)(t),[t]),c=(0,s.useDatablock)((0,l.getProperty)(t,"dataBlock")),d=(0,l.getProperty)(c,"color"),p=(0,o.useMemo)(()=>d?function(e){var r,o,t;let n=e.split(" ").map(e=>parseFloat(e));return[null!=(r=n[0])?r:0,null!=(o=n[1])?o:0,null!=(t=n[2])?t:0]}(d):[1,1,1],[d]),v=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,y=parseFloat((0,l.getProperty)(c,"umapping"))||1,F=parseFloat((0,l.getProperty)(c,"vmapping"))||1,S=(0,o.useMemo)(()=>(function(e,r){let o=[];for(let t=0;t<r;t++){let r=(0,l.getProperty)(e,"texture".concat(t));r&&o.push((0,i.textureToUrl)(r))}return o})(c,g),[c,g]);return 0===S.length?null:(0,r.jsx)("group",{position:n,quaternion:a,children:(0,r.jsx)(o.Suspense,{fallback:(0,r.jsx)(f,{scale:u,color:p,baseTranslucency:v}),children:(0,r.jsx)(m,{scale:u,color:p,baseTranslucency:v,textureUrls:S,numFrames:g,framesPerSec:h,scrollSpeed:x,umapping:y,vmapping:F})})})})}]); |