@takram/three-atmosphere
Version:
A Three.js and R3F implementation of Precomputed Atmospheric Scattering
3 lines (2 loc) • 7.32 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("react/jsx-runtime"),g=require("@react-three/fiber"),w=require("@react-three/postprocessing"),A=require("postprocessing"),s=require("react"),E=require("three"),C=require("@takram/three-geospatial"),a=require("./shared.cjs"),k=require("@react-three/drei"),M=s.createContext({}),j=({ref:n,textures:t=a.DEFAULT_PRECOMPUTED_TEXTURES_URL,ellipsoid:i=C.Ellipsoid.WGS84,correctAltitude:e=!0,photometric:r=!0,date:c,children:u})=>{const d=s.useRef({sunDirection:new E.Vector3,moonDirection:new E.Vector3,rotationMatrix:new E.Matrix4,ellipsoidCenter:new E.Vector3,ellipsoidMatrix:new E.Matrix4,overlay:null,shadow:null,shadowLength:null,irradianceMask:null}),f=g.useThree(({gl:p})=>p),[l,x]=s.useState(typeof t!="string"?t:void 0);s.useEffect(()=>{if(typeof t=="string"){const p=new a.PrecomputedTexturesLoader;p.setTypeFromRenderer(f),(async()=>{x(await p.loadAsync(t))})().catch(D=>{console.error(D)})}else x(t)},[t,f]);const h=s.useMemo(()=>({textures:l,ellipsoid:i,correctAltitude:e,photometric:r,transientStates:d.current}),[l,i,e,r]),y=s.useMemo(()=>{const{sunDirection:p,moonDirection:D,rotationMatrix:T}=d.current;return S=>{a.getECIToECEFRotationMatrix(S,T),a.getSunDirectionECI(S,p).applyMatrix4(T),a.getMoonDirectionECI(S,D).applyMatrix4(T)}},[]),o=c!=null&&!isNaN(+c)?+c:void 0;return s.useEffect(()=>{o!=null&&y(o)},[o,y]),s.useImperativeHandle(n,()=>({...d.current,textures:l,updateByDate:y}),[l,y]),m.jsx(M.Provider,{value:h,children:u})};function P(n){const{irradianceTexture:t,scatteringTexture:i,transmittanceTexture:e,ellipsoid:r,correctAltitude:c,photometric:u,sunDirection:d,sunAngularRadius:f,renderTargetCount:l,...x}=n;return[{irradianceTexture:t,scatteringTexture:i,transmittanceTexture:e,ellipsoid:r,correctAltitude:c,photometric:u,sunDirection:d,sunAngularRadius:f,renderTargetCount:l},x]}function b(n){const[t,i]=s.useState(typeof n!="string"?n??null:null);return s.useEffect(()=>{if(typeof n=="string"){const e=new C.STBNLoader;(async()=>{i(await e.loadAsync(n))})().catch(r=>{console.error(r)})}else i(n??null)},[n]),t}const F=({ref:n,stbnTexture:t=C.DEFAULT_STBN_URL,...i})=>{const{textures:e,transientStates:r,...c}=s.useContext(M),[u,{blendFunction:d,...f}]=P({...a.aerialPerspectiveEffectOptionsDefaults,...c,...e,...i}),l=s.useContext(w.EffectComposerContext),{normalPass:x,camera:h}=l,y="geometryPass"in l&&l.geometryPass instanceof A.RenderPass&&"geometryTexture"in l.geometryPass&&l.geometryPass.geometryTexture instanceof E.Texture?l.geometryPass.geometryTexture:void 0,o=s.useMemo(()=>new a.AerialPerspectiveEffect(void 0,{blendFunction:d}),[d]);s.useEffect(()=>()=>{o.dispose()},[o]);const[p,D]=s.useState(!1);g.useFrame(()=>{r!=null&&(o.sunDirection.copy(r.sunDirection),o.moonDirection.copy(r.moonDirection),o.ellipsoidCenter.copy(r.ellipsoidCenter),o.ellipsoidMatrix.copy(r.ellipsoidMatrix),o.overlay=r.overlay,o.shadow=r.shadow,o.shadowLength=r.shadowLength,o.irradianceMask=r.irradianceMask,!p&&o.shadow!=null&&D(!0))});const T=b(p?t:void 0);return m.jsx("primitive",{ref:n,object:o,mainCamera:h,normalBuffer:y??(x==null?void 0:x.texture)??null,...u,...f,stbnTexture:T,octEncodedNormal:y!=null})};function _(n){return t=>{for(const i of n)v(i,t)}}function U(n){return t=>{const i=[];for(const e of n){const r=v(e,t),c=typeof r=="function";i.push(c?r:()=>v(e,null))}return()=>{for(const e of i)e()}}}function v(n,t){if(typeof n=="function")return n(t);n&&(n.current=t)}var L=parseInt(s.version.split(".")[0],10)>=19?U:_;const N=({ref:n,...t})=>{const{transientStates:i}=s.useContext(M),e=s.useRef(null);s.useEffect(()=>{if(e.current!=null&&i!=null)return i.irradianceMask={map:e.current.texture,channel:"r"},()=>{i.irradianceMask=null}},[i]);const{scene:r,camera:c}=s.useContext(w.EffectComposerContext);return g.extend({IrradianceMaskPass:a.IrradianceMaskPass}),m.jsx("irradianceMaskPass",{ref:L([e,n]),...t,args:[r,c]})},q=({ref:n,...t})=>{const{textures:i,transientStates:e,...r}=s.useContext(M),[c,{sun:u,moon:d,moonDirection:f,moonAngularRadius:l,lunarRadianceScale:x,groundAlbedo:h,...y}]=P({...a.skyMaterialParametersDefaults,...r,...i,...t}),o=s.useMemo(()=>new a.SkyMaterial,[]);return s.useEffect(()=>()=>{o.dispose()},[o]),g.useFrame(()=>{e!=null&&(o.sunDirection.copy(e.sunDirection),o.moonDirection.copy(e.moonDirection),o.ellipsoidCenter.copy(e.ellipsoidCenter),o.ellipsoidMatrix.copy(e.ellipsoidMatrix),o.shadowLength=e.shadowLength)}),m.jsx(k.ScreenQuad,{renderOrder:a.SKY_RENDER_ORDER,...y,ref:n,children:m.jsx("primitive",{object:o,...c,sun:u,moon:d,moonDirection:f,moonAngularRadius:l,lunarRadianceScale:x,groundAlbedo:h})})},I=({ref:n,...t})=>{const{textures:i,transientStates:e,...r}=s.useContext(M),c=s.useRef(null);return g.useFrame(()=>{const u=c.current;u!=null&&e!=null&&(u.sunDirection.copy(e.sunDirection),u.ellipsoidCenter.copy(e.ellipsoidCenter),u.ellipsoidMatrix.copy(e.ellipsoidMatrix),u.update())}),g.extend({SkyLightProbe:a.SkyLightProbe}),m.jsx("skyLightProbe",{ref:L([c,n]),...a.skyLightProbeParametersDefaults,...r,...i,...t})},O=({ref:n,data:t=a.DEFAULT_STARS_DATA_URL,...i})=>{const{textures:e,transientStates:r,...c}=s.useContext(M),[u,{pointSize:d,radianceScale:f,background:l,...x}]=P({...a.starsMaterialParametersDefaults,...c,...e,...i}),[h,y]=s.useState(typeof t!="string"?t:void 0);s.useEffect(()=>{if(typeof t=="string"){const S=new C.ArrayBufferLoader;(async()=>{y(await S.loadAsync(t))})().catch(R=>{console.error(R)})}else y(t)},[t]);const o=s.useMemo(()=>h!=null?new a.StarsGeometry(h):void 0,[h]);s.useEffect(()=>()=>{o==null||o.dispose()},[o]);const p=s.useMemo(()=>new a.StarsMaterial,[]);s.useEffect(()=>()=>{p.dispose()},[p]);const D=s.useRef(null);g.useFrame(({camera:S})=>{var R;r!=null&&S.isPerspectiveCamera===!0&&(p.sunDirection.copy(r.sunDirection),(R=D.current)==null||R.setRotationFromMatrix(r.rotationMatrix),p.ellipsoidCenter.copy(r.ellipsoidCenter),p.ellipsoidMatrix.copy(r.ellipsoidMatrix))});const T=g.useThree(({camera:S})=>S);return o==null||T.isPerspectiveCamera!==!0?null:m.jsxs("points",{ref:L([D,n]),frustumCulled:!1,renderOrder:a.SKY_RENDER_ORDER+1,...x,children:[m.jsx("primitive",{object:o}),m.jsx("primitive",{object:p,...u,pointSize:d,radianceScale:f,background:l,depthTest:!0,depthWrite:!1})]})},B=({ref:n,position:t,...i})=>{const{textures:e,transientStates:r,...c}=s.useContext(M),u=s.useRef(null);g.useFrame(()=>{const f=u.current;f!=null&&r!=null&&(f.sunDirection.copy(r.sunDirection),f.ellipsoidCenter.copy(r.ellipsoidCenter),f.ellipsoidMatrix.copy(r.ellipsoidMatrix),f.update())});const d=s.useMemo(()=>new E.Object3D,[]);return g.extend({SunDirectionalLight:a.SunDirectionalLight}),m.jsxs(m.Fragment,{children:[m.jsx("sunDirectionalLight",{ref:L([u,n]),...a.sunDirectionalLightParametersDefaults,...c,...e,...i,target:d}),m.jsx("primitive",{object:d,position:t})]})};function G(n=a.DEFAULT_PRECOMPUTED_TEXTURES_URL){const t=g.useThree(({gl:e})=>e);return{textures:g.useLoader(a.PrecomputedTexturesLoader,n,e=>{e.setTypeFromRenderer(t)})}}exports.AerialPerspective=F;exports.Atmosphere=j;exports.AtmosphereContext=M;exports.IrradianceMask=N;exports.Sky=q;exports.SkyLight=I;exports.Stars=O;exports.SunLight=B;exports.separateProps=P;exports.useAtmosphereTextureProps=G;
//# sourceMappingURL=r3f.cjs.map