@react-three/gpu-pathtracer
Version:
⚡️ A React abstraction for the popular three-gpu-pathtracer.
3 lines (2 loc) • 3.15 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),c=require("@react-three/fiber"),e=require("react"),s=require("three-gpu-pathtracer");require("three");const P=e.createContext(null),I=e.forwardRef(({children:r,enabled:a=!0,minSamples:o=1,samples:g=32,bounces:h=4,resolutionFactor:i=1,renderPriority:n=1,filteredGlossyFactor:L=0,renderDelay:S=0,fadeDuration:x=0,dynamicLowRes:E=!0,lowResScale:j=.25,textureSize:C=[1024,1024],rasterizeScene:M=!1,tiles:v=[3,3],...b},A)=>{const{gl:y,camera:m,scene:d,controls:l}=c.useThree(),t=e.useMemo(()=>{const u=new s.WebGLPathTracer(y);return u.synchronizeRenderSize=!0,u},[y]);e.useImperativeHandle(A,()=>t,[t]),e.useLayoutEffect(()=>{c.applyProps(t,{bounces:h,filteredGlossyFactor:L,renderDelay:S,fadeDuration:x,minSamples:o,dynamicLowRes:E,lowResScale:j,rasterizeScene:M,textureSize:C,tiles:v}),t.renderScale=i,t.reset()},[b,i,h,o,t]),e.useEffect(()=>{a&&t.reset()},[a]);const V=e.useMemo(()=>({update:()=>{t.setScene(d,m)},reset:()=>{t.reset()},renderer:t,pathtracer:t}),[t,d,m]);return e.useLayoutEffect(()=>{t.setScene(d,m)},[d,m]),e.useLayoutEffect(()=>{const u=()=>{t.updateCamera()};return l&&l.addEventListener("change",u),()=>{l&&l.removeEventListener("change",u)}},[l,t]),c.useFrame(({camera:u,gl:w,scene:F})=>{a&&t.samples<(g??1/0)&&t.renderSample(),a||w.render(F,u)},1),f.jsx(P.Provider,{value:V,children:r})});function p(){const r=e.useContext(P);if(!r)throw new Error("usePathtracer must be used within a Pathtracer");return r}function R(r){c.extend({FogVolumeMaterial:s.FogVolumeMaterial});const{pathtracer:a}=p();return e.useEffect(()=>void a.updateMaterials()),f.jsx("fogVolumeMaterial",{...r})}function T(r){c.extend({PhysicalCamera:s.PhysicalCamera});const{pathtracer:a}=p(),o=c.useThree(({set:n})=>n),g=c.useThree(({camera:n})=>n),h=c.useThree(({size:n})=>n),i=e.useRef(null);return e.useLayoutEffect(()=>{r.manual||(i.current.aspect=h.width/h.height)},[h,r]),e.useLayoutEffect(()=>{i.current.updateProjectionMatrix()}),e.useLayoutEffect(()=>{const n=g;return o(()=>({camera:i.current})),()=>o(()=>({camera:n}))},[i,o]),e.useEffect(()=>void a.updateCamera()),f.jsx("physicalCamera",{ref:i,...r})}function q(r){c.extend({PhysicalSpotLight:s.PhysicalSpotLight});const{pathtracer:a}=p();return e.useEffect(()=>void a.updateLights()),f.jsx("physicalSpotLight",{...r})}function O(r){c.extend({ShapedAreaLight:s.ShapedAreaLight});const{pathtracer:a}=p();return e.useEffect(()=>void a.updateLights()),f.jsx("shapedAreaLight",{...r})}Object.defineProperty(exports,"FogVolumeMaterialImpl",{enumerable:!0,get:()=>s.FogVolumeMaterial});Object.defineProperty(exports,"PhysicalCameraImpl",{enumerable:!0,get:()=>s.PhysicalCamera});Object.defineProperty(exports,"PhysicalSpotLightImpl",{enumerable:!0,get:()=>s.PhysicalSpotLight});Object.defineProperty(exports,"ShapedAreaLightImpl",{enumerable:!0,get:()=>s.ShapedAreaLight});exports.FogVolumeMaterial=R;exports.Pathtracer=I;exports.PhysicalCamera=T;exports.PhysicalSpotLight=q;exports.ShapedAreaLight=O;exports.usePathtracer=p;
//# sourceMappingURL=react-three-gpu-pathtracer.cjs.js.map