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