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