@threepipe/webgi-plugins
Version:
WebGi - Realistic Rendering Plugins for ThreePipe.
7 lines • 152 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("threepipe")):"function"==typeof define&&define.amd?define(["exports","threepipe"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["@threepipe/webgi-plugins"]={},e.threepipe)}(this,(function(e,t){"use strict";
/**
* @license
* @threepipe/webgi-plugins v0.5.3
* Copyright 2022-2025 repalash <palash@shaders.app> (https://repalash.com)
* SEE LICENSE IN LICENSE
*/var i,r;const a={computeScreenSpaceVelocity:"uniform mat4 lastProjectionViewMatrix;uniform mat4 currentProjectionViewMatrix;vec2 computeScreenSpaceVelocity(const in vec3 worldPosition){vec4 currentPositionClip=currentProjectionViewMatrix*vec4(worldPosition,1.0);vec4 prevPositionClip=lastProjectionViewMatrix*vec4(worldPosition,1.0);vec2 currentPositionNDC=currentPositionClip.xy/currentPositionClip.w;vec2 prevPositionNDC=prevPositionClip.xy/prevPositionClip.w;if(prevPositionNDC.x>=1.0||prevPositionNDC.x<=-1.0||prevPositionNDC.x>=1.0||prevPositionNDC.y<=-1.0){return vec2(0.0);}return 0.5*(currentPositionNDC-prevPositionNDC);}",getWorldPositionFromViewZ:"uniform mat4 inverseViewMatrix;vec3 getWorldPositionFromViewZ(const in vec2 uv,const in float viewDepth){vec2 uv_=2.*uv-1.;float xe=-(uv_.x+projection[2][0])*viewDepth/projection[0][0];float ye=-(uv_.y+projection[2][1])*viewDepth/projection[1][1];return(inverseViewMatrix*vec4(xe,ye,viewDepth,1.)).xyz;}",temporalAA:"#include <common>\n#include <gbuffer_unpack>\n#ifdef HAS_VELOCITY_BUFFER\n#pragma <velocity_unpack>\n#else\n#define HAS_VELOCITY_BUFFER 0\n#endif\n#include <cameraHelpers>\nvarying vec2 vUv;uniform vec2 previousRTSize;uniform vec2 jitterSample;uniform vec2 feedBack;uniform bool firstFrame;vec3 find_closest_fragment_3x3(const in vec2 uv){const vec3 offset=vec3(-1.0,1.0,0.0);vec2 texelSize=1.0/previousRTSize;vec3 dtr=vec3(1,1,getDepth(uv+offset.yy*texelSize));vec3 dtc=vec3(0,1,getDepth(uv+offset.zy*texelSize));vec3 dtl=vec3(-1,1,getDepth(uv+offset.xy*texelSize));vec3 dml=vec3(-1,0,getDepth(uv+offset.xz*texelSize));vec3 dmc=vec3(0,0,getDepth(uv));vec3 dmr=vec3(1,0,getDepth(uv+offset.yz*texelSize));vec3 dbl=vec3(-1,-1,getDepth(uv+offset.xx*texelSize));vec3 dbc=vec3(0,-1,getDepth(uv+offset.zx*texelSize));vec3 dbr=vec3(1,-1,getDepth(uv+offset.yx*texelSize));vec3 dmin=dtl;if(dmin.z>dtc.z)dmin=dtc;if(dmin.z>dtr.z)dmin=dtr;if(dmin.z>dml.z)dmin=dml;if(dmin.z>dmc.z)dmin=dmc;if(dmin.z>dmr.z)dmin=dmr;if(dmin.z>dbl.z)dmin=dbl;if(dmin.z>dbc.z)dmin=dbc;if(dmin.z>dbr.z)dmin=dbr;return vec3(uv+texelSize.xy*dmin.xy,dmin.z);}vec3 find_closest_fragment_5tap(const in vec2 uv){vec2 texelSize=1.0/previousRTSize;vec2 offset=vec2(1.0,-1.0);vec3 dtl=vec3(-1,1,getDepth(uv+offset.yx*texelSize));vec3 dtr=vec3(1,1,getDepth(uv+offset.xx*texelSize));vec3 dmc=vec3(0,0,getDepth(uv));vec3 dbl=vec3(-1,-1,getDepth(uv+offset.yy*texelSize));vec3 dbr=vec3(1,-1,getDepth(uv+offset.xy*texelSize));vec3 dmin=dtl;if(dmin.z>dtr.z)dmin=dtr;if(dmin.z>dmc.z)dmin=dmc;if(dmin.z>dbl.z)dmin=dbl;if(dmin.z>dbr.z)dmin=dbr;return vec3(uv+dmin.xy*texelSize,dmin.z);}vec4 clip_aabb(const in vec4 aabb_min,const in vec4 aabb_max,vec4 p){const float FLT_EPS=1e-8;vec4 p_clip=0.5*(aabb_max+aabb_min);vec4 e_clip=0.5*(aabb_max-aabb_min)+FLT_EPS;vec4 v_clip=p-p_clip;vec4 v_unit=abs(v_clip/e_clip);float ma_unit=max(v_unit.x,max(v_unit.y,v_unit.z));if(ma_unit>1.0)return p_clip+v_clip/ma_unit;else return p;}\n#if HAS_VELOCITY_BUFFER == 0 || defined(DEBUG_VELOCITY)\n#include <computeScreenSpaceVelocity>\n#include <getWorldPositionFromViewZ>\n#endif\nvec4 currentRTTexelToLinear1(vec4 a){if(isinf(a.x)||isinf(a.y)||isinf(a.z)||isinf(a.w)){return vec4(1.);}return currentRTTexelToLinear(a);}vec4 computeTAA(const in vec2 uv,const in vec2 screenSpaceVelocity,const in float feedbackScale){vec2 uvUnJitter=uv;vec4 currentColor=currentRTTexelToLinear(texture2D(currentRT,uvUnJitter));vec4 previousColor=previousRTTexelToLinear(texture2D(previousRT,uv-screenSpaceVelocity));const vec3 offset=vec3(1.,-1.,0.);vec2 texelSize=1./previousRTSize;float texelSpeed=length(screenSpaceVelocity);vec4 tl=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.yx*texelSize));vec4 tc=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.zx*texelSize));vec4 tr=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.xx*texelSize));vec4 ml=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.yz*texelSize));vec4 mc=currentColor;vec4 mr=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.xz*texelSize));vec4 bl=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.yy*texelSize));vec4 bc=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.zy*texelSize));vec4 br=currentRTTexelToLinear1(texture2D(currentRT,uvUnJitter+offset.xy*texelSize));vec4 corners=2.0*(tr+bl+br+tl)-2.0*mc;mc+=(mc-(corners*0.166667))*2.718282*0.3;mc=max(vec4(0.0),mc);vec4 min5=min(tc,min(ml,min(mc,min(mr,bc))));vec4 max5=max(tc,max(ml,max(mc,max(mr,bc))));vec4 cmin=min(min5,min(tl,min(tr,min(bl,br))));vec4 cmax=max(min5,max(tl,max(tr,max(bl,br))));;cmin=0.5*(cmin+min5);cmax=0.5*(cmax+max5);previousColor=clip_aabb(cmin,cmax,previousColor);float lum0=luminance(currentColor.rgb);float lum1=luminance(previousColor.rgb);float unbiased_diff=abs(lum0-lum1)/max(lum0,max(lum1,0.2));float unbiased_weight=1.0-unbiased_diff;float unbiased_weight_sqr=unbiased_weight*unbiased_weight;float k_feedback=mix(feedBack.x,feedBack.y,unbiased_weight_sqr);return mix(currentColor,previousColor,clamp(k_feedback*feedbackScale,0.,1.));}void main(){\n#if HAS_VELOCITY_BUFFER == 0\n#if QUALITY == 1\nvec3 c_frag=find_closest_fragment_3x3(vUv);\n#else\nvec3 c_frag=find_closest_fragment_5tap(vUv);\n#endif\n#else\nvec3 c_frag=vec3(vUv,0.);\n#endif\nbool bg=firstFrame;\n#if BACKGROUND_TAA\nfloat d=c_frag.z;float edgef=min(1.,max(0.,1.-(d*100.-99.)));\n#else\nbg=bg||c_frag.z>0.999;\n#endif\nif(bg){gl_FragColor=currentRTTexelToLinear1(texture2D(currentRT,vUv));}else{\n#if HAS_VELOCITY_BUFFER == 0\nfloat sampleViewZ=mix(-cameraNearFar.x,-cameraNearFar.y,c_frag.z);vec3 worldPosition=getWorldPositionFromViewZ(c_frag.xy,sampleViewZ);vec2 screenSpaceVelocity=computeScreenSpaceVelocity(worldPosition);\n#else\nvec2 screenSpaceVelocity=getVelocity(c_frag.xy);\n#endif\n#if BACKGROUND_TAA\ngl_FragColor=computeTAA(vUv,screenSpaceVelocity*edgef,edgef);\n#else\ngl_FragColor=computeTAA(vUv,screenSpaceVelocity,1.);\n#endif\n}\n#include <colorspace_fragment>\n#ifdef DEBUG_VELOCITY\nfloat sampleViewZ=mix(-cameraNearFar.x,-cameraNearFar.y,c_frag.z);vec3 worldPosition=getWorldPositionFromViewZ(c_frag.xy,sampleViewZ);vec2 screenSpaceVelocity=computeScreenSpaceVelocity(worldPosition);gl_FragColor=vec4(10.*length(screenSpaceVelocity),0.,0.,1.);\n#endif\n}",ssReflection:"uniform float currentFrameCount;\n#ifndef D_frameCount\n#define D_frameCount\nuniform float frameCount;\n#endif\nuniform float objectRadius;uniform float radius;uniform float tolerance;uniform float ssrRoughnessFactor;uniform bool autoRadius;\n#ifndef D_sceneBoundingRadius\n#define D_sceneBoundingRadius\nuniform float sceneBoundingRadius;\n#endif\n#if SSREFL_ENABLED == 2\nuniform float ssrSplitX;\n#endif\n#ifdef HAS_VELOCITY_BUFFER\n#pragma <velocity_unpack>\n#else\n#define HAS_VELOCITY_BUFFER 0\n#endif\n#if HAS_VELOCITY_BUFFER == 0\n#include <computeScreenSpaceVelocity>\n#include <getWorldPositionFromViewZ>\n#endif\nvec3 ComputeReflectionL(vec3 N,vec2 E,vec3 V,float rough){float rough4=rough*rough*rough*rough;float phi=2.0*PI*E.x;float cos_theta=pow(max(E.y,0.000001),rough4/(2.0-rough4));float sin_theta=sqrt(max(0.,1.0-cos_theta*cos_theta));vec3 half_vec=vec3(sin_theta*cos(phi),sin_theta*sin(phi),cos_theta);vec3 tangentX=normalize(cross(abs(N.z)<0.999 ? vec3(0.0,0.0,1.0): vec3(1.0,0.0,0.0),N));vec3 tangentY=cross(N,tangentX);half_vec=half_vec.x*tangentX+half_vec.y*tangentY+half_vec.z*N;vec3 ray_dir=(2.0*dot(V,half_vec))*half_vec-V;return ray_dir;}vec2 GetRandomE(float seed){vec2 rand_e;rand_e.x=interleavedGradientNoise(gl_FragCoord.xy,frameCount*34.+seed);rand_e.y=fract(rand_e.x*38.65435);rand_e.y=mix(rand_e.y,1.0,0.7);return rand_e;}vec4 calculateSSR(in float seed,in vec3 screenPos,in vec3 normal,in float radiusFactor,in float roughness){vec3 viewPos=screenToView3(screenPos.xy,screenPos.z);normal=normalize(normal);vec2 E=GetRandomE(seed);vec3 L=ComputeReflectionL(normal,E,-normalize(viewPos),roughness*ssrRoughnessFactor);L=normalize(L);float cameraDist=length(cameraPositionWorld);float rayLen=objectRadius*sceneBoundingRadius;rayLen=autoRadius ?min(max(mix(max(0.0,(cameraDist+rayLen)+viewPos.z),max(0.0,-viewPos.z-max(0.0,cameraDist-rayLen)),L.z*0.5+0.5),rayLen*0.1),rayLen*5.):rayLen;rayLen*=radiusFactor;float r=interleavedGradientNoise(gl_FragCoord.xy,frameCount+seed);rayLen=max(rayLen,0.001);int steps=SSR_STEP_COUNT/(currentFrameCount<float(SSR_LOW_QUALITY_FRAMES)? 2 : 1);vec3 state=vec3(0.,(r+0.5)/float(steps),2.);viewPos+=normal*max(-0.0001*viewPos.z,0.001);vec3 screenHitP=traceRay(viewPos,L*rayLen,tolerance*rayLen,state,steps);if(state.z<0.99){if(currentFrameCount<1.){\n#if HAS_VELOCITY_BUFFER == 0\nvec3 worldPosition=getWorldPositionFromViewZ(screenHitP.xy,screenHitP.z);vec2 screenSpaceVelocity=computeScreenSpaceVelocity(worldPosition);\n#else\nvec2 screenSpaceVelocity=getVelocity(screenHitP.xy);\n#endif\nscreenHitP.xy-=screenSpaceVelocity;}vec3 hitColor=(tLastFrameTexelToLinear(texture2D(tLastFrame,screenHitP.xy))).rgb;float ssrWeight=1.;return vec4(hitColor*ssrWeight,1.);}return vec4(0.);}",calculateGI:"uniform float currentFrameCount;uniform float intensity;uniform float objectRadius;uniform float rayCount;uniform float power;uniform float bias;uniform float falloff;uniform float tolerance;uniform bool autoRadius;uniform vec2 screenSize;\n#ifndef D_sceneBoundingRadius\n#define D_sceneBoundingRadius\nuniform float sceneBoundingRadius;\n#endif\n#ifdef HAS_VELOCITY_BUFFER\n#pragma <velocity_unpack>\n#else\n#define HAS_VELOCITY_BUFFER 0\n#endif\n#if HAS_VELOCITY_BUFFER == 0\n#include <computeScreenSpaceVelocity>\n#include <getWorldPositionFromViewZ>\n#endif\nvec3 ComputeUniformL(vec3 N,vec2 E){vec3 L;L.xy=E;L.z=interleavedGradientNoise(gl_FragCoord.xy,currentFrameCount*5.);L=L*2.-1.;return L;}vec2 GetRandomE(float seed){vec2 rand_e;rand_e.x=random3(vec3(gl_FragCoord.xy,currentFrameCount+seed));rand_e.y=random3(vec3(gl_FragCoord.yx,rand_e.x+(currentFrameCount)*7.));return rand_e;}float saturate2(float v,float mx){return max(0.,min(mx,v));}vec4 calculateGI(in float seed,in vec3 screenPos,in vec3 normal,in float radiusFactor){vec3 viewPos=screenToView3(screenPos.xy,screenPos.z);normal=normalize(normal);vec2 E=GetRandomE(seed);vec3 L=ComputeUniformL(normal,E);L=normalize(L);L*=sign(dot(L,normal));float cameraDist=length(cameraPositionWorld);float rayLen=objectRadius*sceneBoundingRadius;rayLen=autoRadius ?min(max(mix(max(0.0,(cameraDist+rayLen)+viewPos.z),max(0.0,-viewPos.z-max(0.0,cameraDist-rayLen)),L.z*0.5+0.5),rayLen*0.1),rayLen*5.):rayLen;rayLen*=radiusFactor;float r=interleavedGradientNoise(gl_FragCoord.xy,currentFrameCount*14.+seed)+0.05;rayLen=max(rayLen,0.001);vec3 state=vec3(1.,(r+0.5)/float(RTAO_STEP_COUNT),2.);viewPos+=normal*max(-0.01*viewPos.z,0.001);vec3 screenHitP=traceRay(viewPos,L*rayLen,tolerance*rayLen,state,RTAO_STEP_COUNT);vec3 viewHitP=screenToView3(screenHitP.xy,screenHitP.z);vec3 LRes=viewHitP-viewPos;if(state.z>1.)LRes=vec3(9999999.);float dist=length(LRes)*falloff;float EPS=0.01;float zBias=(viewPos.z)*bias;float ao=(max(dot(normal,L)+zBias,0.))/(dist*dist+EPS);\n#if defined(SSGI_ENABLED) && SSGI_ENABLED > 0\nif(currentFrameCount<1.){\n#if HAS_VELOCITY_BUFFER == 0\nvec3 worldPosition=getWorldPositionFromViewZ(screenHitP.xy,screenHitP.z);vec2 screenSpaceVelocity=computeScreenSpaceVelocity(worldPosition);\n#else\nvec2 screenSpaceVelocity=getVelocity(screenHitP.xy);\n#endif\nscreenHitP.xy-=screenSpaceVelocity;}vec3 hitColor=tLastFrameTexelToLinear(texture2D(tLastFrame,screenHitP.xy)).rgb;vec3 hitNormal=getViewNormal(screenHitP.xy);float giWeight=1.;giWeight=saturate2(giWeight/(dist+EPS),1.);giWeight*=saturate2((dot(normal,L)),1.0);giWeight*=saturate2((dot(hitNormal,-L)),1.0);return vec4(hitColor*giWeight,ao);\n#endif\nreturn vec4(0,0,0,ao);}float normpdf(in float x,in float sigma){return exp(-0.5*x*x/(sigma*sigma));}vec4 getLastThis(sampler2D tex,float depth,vec3 normal){vec2 direction=vec2(1,1);vec4 color=clamp(tLastThisTexelToLinear(texture2D(tex,vUv.xy)),0.,5.);return color;}void main(){float depth;vec3 normal;getDepthNormal(vUv,depth,normal);if(depth>0.99){discard;gl_FragColor=getLastThis(tLastThis,depth,normal);return;}float viewZ=depthToViewZ(depth);vec3 screenPos=vec3(vUv.x,vUv.y,viewZ);vec4 gi=vec4(0.);gi+=calculateGI(8.,screenPos,normal,1.);if(rayCount>1.5)gi=max(gi,calculateGI(2.,screenPos,normal,0.4));if(rayCount>2.5)gi=max(gi,calculateGI(3.,screenPos,normal,1.5));if(rayCount>3.5)gi=max(gi,calculateGI(1.,screenPos,normal,0.6));if(rayCount>4.5)gi=max(gi,calculateGI(3.,screenPos,normal,1.));gi.a=min(1.,gi.a);gi.a=max(0.,gi.a);gi.rgb=min(vec3(3.),gi.rgb);gi.rgb=max(vec3(0.),gi.rgb);if(currentFrameCount<3.){gl_FragColor=gi;return;}gl_FragColor=(texture2D(tLastThis,vUv));gl_FragColor=((gi+(gl_FragColor)*currentFrameCount)/(currentFrameCount+1.));}",__inited:!1};function n(){return a.__inited||(a.__inited=!0,Object.assign(t.ShaderChunk,a)),a}var s=Object.defineProperty,o=Object.getOwnPropertyDescriptor,l=(e,t,i,r)=>{for(var a,n=r>1?void 0:r?o(t,i):t,l=e.length-1;l>=0;l--)(a=e[l])&&(n=(r?a(t,i,n):a(n))||n);return r&&n&&s(t,i,n),n};const c=class extends t.PipelinePassPlugin{constructor(e=!0){super(),this.passId="taa",this._stableNoise=!0,this._gbufferUnpackExtension=void 0,this._gbufferUnpackExtensionChanged=()=>{if(!this._pass||!this._viewer)throw new Error("TemporalAAPlugin: pass/viewer not created yet");const e=this._viewer.renderManager.gbufferUnpackExtension;this._gbufferUnpackExtension!==e&&(this._gbufferUnpackExtension&&this._pass.material.unregisterMaterialExtensions([this._gbufferUnpackExtension]),this._gbufferUnpackExtension=e,this._gbufferUnpackExtension?this._pass.material.registerMaterialExtensions([this._gbufferUnpackExtension]):this._viewer.console.warn("TemporalAAPlugin: GBuffer unpack extension removed"))},this.dependencies=[t.GBufferPlugin,t.ProgressivePlugin],this.uiConfig={type:"folder",label:"TemporalAA Plugin",onChange:this.setDirty.bind(this),children:[...t.generateUiConfig(this)||[]]},this.enabled=e,this.setDirty=this.setDirty.bind(this)}get stableNoise(){return this._viewer?.renderManager.stableNoise??this._stableNoise}set stableNoise(e){this._viewer&&(this._viewer.renderManager.stableNoise=e),this._stableNoise=e}_createPass(){if(!this._viewer)throw new Error("TemporalAAPlugin: viewer not set");if(!this._viewer.renderManager.gbufferTarget||!this._viewer.renderManager.gbufferUnpackExtension)throw new Error("TemporalAAPlugin: GBuffer target not created. GBufferPlugin is required.");const e=!!this._viewer.renderManager.msaa;return new d(this.passId,(()=>this._viewer?.getPlugin(t.ProgressivePlugin)?.target),e)}onAdded(e){super.onAdded(e),this._gbufferUnpackExtensionChanged(),e.renderManager.addEventListener("gbufferUnpackExtensionChanged",this._gbufferUnpackExtensionChanged),e.renderManager.addEventListener("resize",this._pass.onSizeUpdate)}onRemove(e){e.renderManager.removeEventListener("gbufferUnpackExtensionChanged",this._gbufferUnpackExtensionChanged),e.renderManager.removeEventListener("resize",this._pass.onSizeUpdate),super.onRemove(e)}_beforeRender(e,i,r){if(!super._beforeRender(e,i,r))return!1;const a=this.pass,n=this._viewer;if(!a||!n)return!1;const s=r.frameCount;if(a.taaEnabled=s<=1&&e.renderCamera===e.mainCamera,!a.taaEnabled)return!1;const o=i;return!!o&&(o.updateMatrixWorld(!0),o.updateShaderProperties(a.material),a.updateCameraProperties(o),a.target=n.getPlugin(t.ProgressivePlugin).target,!0)}};c.PluginType="TAA",c.OldPluginType="TemporalAAPlugin";let u=c;l([t.uiToggle("Stable Noise (Total frame count)")],u.prototype,"stableNoise",1),l([t.uiConfig(void 0,{unwrapContents:!0})],u.prototype,"_pass",2);class d extends t.ExtendedShaderPass{constructor(e,i,r=!1){super({vertexShader:t.CopyShader.vertexShader,fragmentShader:n().temporalAA,uniforms:{currentRT:{value:null},previousRT:{value:null},previousRTSize:{value:new t.Vector2},cameraNearFar:{value:new t.Vector2},lastProjectionViewMatrix:{value:new t.Matrix4},currentProjectionViewMatrix:{value:new t.Matrix4},projection:{value:new t.Matrix4},inverseViewMatrix:{value:new t.Matrix4},jitterSample:{value:new t.Vector2},firstFrame:{value:!0}},defines:{QUALITY:1,UNJITTER:0,BACKGROUND_TAA:r?1:0}},"currentRT","previousRT"),this.before=["progressive"],this.after=[],this.required=["render","progressive"],this.taaEnabled=!0,this.feedBack=new t.Vector2(.88,.97),this.debugVelocity=!1,this.uiConfig={type:"folder",label:"Temporal AA Pass",onChange:this.setDirty,children:[{type:"checkbox",label:"Enabled",property:[this,"enabled"],onChange:()=>this.onSizeUpdate()},...t.generateUiConfig(this)?.filter((e=>e&&"Enabled"!==e.label))||[]]},this.passId=e,this.onSizeUpdate=this.onSizeUpdate.bind(this),this.target=i,this.clear=!1,this.needsSwap=!0}render(e,i,r,a,n){this.taaEnabled&&this.enabled?(this.needsSwap=!0,this.uniforms.previousRT.value=t.getOrCall(this.target)?.texture??null,super.render(e,i,r,a,n),this.uniforms.lastProjectionViewMatrix.value.copy(this.uniforms.currentProjectionViewMatrix.value),this.uniforms.firstFrame.value=!1):this.needsSwap=!1}updateCameraProperties(e){e&&(this.uniforms.currentProjectionViewMatrix.value.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this.uniforms.inverseViewMatrix.value.copy(e.matrixWorld))}onSizeUpdate(){this.uniforms.firstFrame.value=!0,this.setDirty()}setSize(e,t){super.setSize(e,t),this.onSizeUpdate()}}l([t.serialize(),t.uniform(),t.uiVector("Feedback",void 0,1e-4)],d.prototype,"feedBack",2),l([t.uiToggle(),t.matDefineBool("DEBUG_VELOCITY",void 0,!1,void 0,!0)],d.prototype,"debugVelocity",2);var h=Object.defineProperty,p=Object.getOwnPropertyDescriptor,f=(e,t,i,r)=>{for(var a,n=r>1?void 0:r?p(t,i):t,s=e.length-1;s>=0;s--)(a=e[s])&&(n=(r?a(t,i,n):a(n))||n);return r&&n&&h(t,i,n),n};e.VelocityBufferPlugin=class extends t.PipelinePassPlugin{constructor(e=t.UnsignedByteType,i=!0,r=!0){super(),this.passId="velocityBuffer",this.material=new g,this.unpackExtension={shaderExtender:e=>{this.isDisabled()||(e.fragmentShader=t.shaderReplaceString(e.fragmentShader,"#pragma <velocity_unpack>","\n#if defined(HAS_VELOCITY_BUFFER)\nuniform sampler2D tVelocity;vec2 getVelocity(const in vec2 uv){vec2 screenSpaceVelocity=texture2D(tVelocity,uv).xy*2.0-1.0;return sign(screenSpaceVelocity)*pow(abs(screenSpaceVelocity),vec2(4.));}\n#endif\n\n"))},computeCacheKey:()=>this.isDisabled()?"":"vb",extraUniforms:{tVelocity:()=>({value:this.isDisabled()?null:this.target?.texture})},extraDefines:{HAS_VELOCITY_BUFFER:()=>!this.isDisabled()&&this.target?.texture?1:void 0},priority:100,isCompatible:()=>!0},this.enabled=i,this.bufferType=e,this._attachToTaa=r}_createTarget(e=!0){this._viewer&&(e&&this._disposeTarget(),this.target||(this.target=this._viewer.renderManager.createTarget({depthBuffer:!0,samples:0,type:this.bufferType,generateMipmaps:!1,colorSpace:t.LinearSRGBColorSpace})),this.texture=this.target.texture,this.texture.name="velocityBuffer",this._pass&&(this._pass.target=this.target))}_disposeTarget(){this._viewer&&(this.target&&(this._viewer.renderManager.disposeTarget(this.target),this.target=void 0),this.texture=void 0)}_createPass(){if(this._createTarget(!0),!this.target)throw new Error("VelocityBufferPlugin: target not created");this.material.userData.isGBufferMaterial=!0;const i=this._viewer,r=new class extends t.GBufferRenderPass{constructor(){super(...arguments),this._firstCall=!0}render(e,t,r,a,n){if(i.renderManager.frameCount>0)return;if(!this.enabled||!this.camera)return;const s=this.overrideMaterial;s.uniforms.currentProjectionViewMatrix.value.copy(this.camera.projectionMatrix).multiply(this.camera.matrixWorldInverse),this._firstCall&&(s.uniforms.lastProjectionViewMatrix.value.copy(s.uniforms.currentProjectionViewMatrix.value),this._firstCall=!1),super.render(e,t,r,a,n),s.uniforms.lastProjectionViewMatrix.value.copy(s.uniforms.currentProjectionViewMatrix.value)}}(this.passId,this.target,this.material,new t.Color(.5,.5,.5),1),a=r.preprocessMaterial;return r.preprocessMaterial=t=>a(t,t.userData[e.VelocityBufferPlugin.PluginType]?.disabled),r.before=["render"],r.after=[],r.required=["render"],r}onAdded(e){super.onAdded(e),e.forPlugin(u,(e=>{this._attachToTaa&&e.pass?.material.registerMaterialExtensions([this.unpackExtension])}),(e=>{e.pass?.material?.unregisterMaterialExtensions([this.unpackExtension])}))}onRemove(e){return this._disposeTarget(),super.onRemove(e)}setDirty(){super.setDirty(),this.unpackExtension.setDirty?.()}_beforeRender(e,t,i){if(!super._beforeRender(e,t,i))return!1;const r=this.pass;return!!r&&(!(i.frameCount>0)&&(r.scene=e,r.camera=t,t.updateShaderProperties(r.overrideMaterial),!0))}},e.VelocityBufferPlugin.PluginType="VelocityBuffer",e.VelocityBufferPlugin.OldPluginType="VelocityBufferPlugin",f([t.uiImage("Velocity Buffer",{readOnly:!0})],e.VelocityBufferPlugin.prototype,"texture",2),e.VelocityBufferPlugin=f([t.uiFolderContainer("Velocity Buffer Plugin (for TAA)")],e.VelocityBufferPlugin);class g extends t.ShaderMaterial{constructor(){super({vertexShader:"#ifdef USE_ALPHAMAP\n#define USE_UV\n#endif\n#include <uv_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec3 vWorldPosition;varying vec3 vWorldPositionPrevious;uniform mat4 modelMatrixPrevious;void main(){\n#include <uv_vertex>\n#include <skinbase_vertex>\n#include <begin_vertex>\n#include <morphtarget_vertex>\n#include <skinning_vertex>\n#include <displacementmap_vertex>\nvec4 mvPosition=vec4(transformed,1.0);\n#ifdef USE_INSTANCING\nmvPosition=instanceMatrix*mvPosition;\n#endif\nvWorldPosition=(modelMatrix*mvPosition).xyz;vWorldPositionPrevious=(modelMatrixPrevious*mvPosition).xyz;mvPosition=modelViewMatrix*mvPosition;gl_Position=projectionMatrix*mvPosition;\n#include <logdepthbuf_vertex>\n#include <clipping_planes_vertex>\n}",fragmentShader:"varying vec3 vWorldPosition;varying vec3 vWorldPositionPrevious;uniform mat4 currentProjectionViewMatrix;uniform mat4 lastProjectionViewMatrix;vec2 computeScreenSpaceVelocity2(){vec4 currentPositionClip=currentProjectionViewMatrix*vec4(vWorldPosition,1.0);vec4 prevPositionClip=lastProjectionViewMatrix*vec4(vWorldPositionPrevious,1.0);vec2 currentPositionNDC=currentPositionClip.xy/currentPositionClip.w;vec2 prevPositionNDC=prevPositionClip.xy/prevPositionClip.w;if(prevPositionNDC.x>=1.0||prevPositionNDC.x<=-1.0||prevPositionNDC.x>=1.0||prevPositionNDC.y<=-1.0){return vec2(0.0);}return 0.5*(currentPositionNDC-prevPositionNDC);}void main(){vec2 velocity=clamp(computeScreenSpaceVelocity2(),-1.0,1.0);velocity=sign(velocity)*pow(abs(velocity),vec2(1./4.));velocity=velocity*0.5+0.5;gl_FragColor=vec4(velocity.x,velocity.y,1.,1.);}",uniforms:{cameraNearFar:{value:new t.Vector2(.1,1e3)},alphaMap:{value:null},alphaTest:{value:null},alphaMapTransform:{value:new t.Matrix3},currentProjectionViewMatrix:{value:new t.Matrix4},lastProjectionViewMatrix:{value:new t.Matrix4}},blending:t.NoBlending}),this.extraUniformsToUpload={modelMatrixPrevious:{value:(new t.Matrix4).identity()}},this._previousWorldMatrices={}}onBeforeRender(e,i,r,a,n){const s=this._previousWorldMatrices[n.uuid];this.extraUniformsToUpload.modelMatrixPrevious.value.copy(s??n.matrixWorld),s?s.copy(n.matrixWorld):this._previousWorldMatrices[n.uuid]=n.matrixWorld.clone();let o=n.material;Array.isArray(o)&&(o=o[0]),this.uniforms.alphaMap.value=o?.alphaMap??null,this.uniforms.alphaTest.value=!o||!o.alphaTest||o.alphaTest<1e-7?.001:o.alphaTest;let l=this.uniforms.alphaMap.value?1:void 0;l!==this.defines.USE_ALPHAMAP&&(void 0===l?delete this.defines.USE_ALPHAMAP:this.defines.USE_ALPHAMAP=l,this.needsUpdate=!0),l=o?.userData.ALPHA_I_RGBA_PACKING?1:void 0,l!==this.defines.ALPHA_I_RGBA_PACKING&&(void 0===l?delete this.defines.ALPHA_I_RGBA_PACKING:this.defines.ALPHA_I_RGBA_PACKING=l,this.needsUpdate=!0),this.side=o?.side??t.DoubleSide}}var m=Object.defineProperty,v=Object.getOwnPropertyDescriptor,_=(e,t,i,r)=>{for(var a,n=r>1?void 0:r?v(t,i):t,s=e.length-1;s>=0;s--)(a=e[s])&&(n=(r?a(t,i,n):a(n))||n);return r&&n&&m(t,i,n),n};const S=(i=class extends t.PipelinePassPlugin{constructor(){super(...arguments),this.passId="bloom",this.materialExtension=t.uiConfigMaterialExtension(this._getUiConfig.bind(this),i.PluginType),this.dependencies=[t.GBufferPlugin],this._onPluginAdd=e=>{if(e.plugin?.constructor?.PluginType!==t.GBufferPlugin.PluginType)return;const i=e.plugin;i.registerGBufferUpdater(this.constructor.PluginType,this.updateGBufferFlags.bind(this)),this._pass?.material.registerMaterialExtensions([i.unpackExtension]),this._viewer?.removeEventListener("addPlugin",this._onPluginAdd)},this.uiConfig={type:"folder",label:"Bloom Plugin",onChange:this.setDirty.bind(this),children:[...t.generateUiConfig(this)||[]]}}_createPass(){return new e.BloomPluginPass(this.passId,Math.min(8,this._viewer?.renderManager.maxHDRIntensity||8))}onAdded(e){super.onAdded(e);const i=e.getPlugin(t.GBufferPlugin);i?(i.registerGBufferUpdater(this.constructor.PluginType,this.updateGBufferFlags.bind(this)),this._pass.material.registerMaterialExtensions([i.unpackExtension])):e.addEventListener("addPlugin",this._onPluginAdd),e.materialManager.registerMaterialExtension(this.materialExtension)}onRemove(e){e.removeEventListener("addPlugin",this._onPluginAdd);const i=e.getPlugin(t.GBufferPlugin);i?.unregisterGBufferUpdater(this.constructor.PluginType),i&&this._pass?.material.unregisterMaterialExtensions([i.unpackExtension]),e.materialManager.unregisterMaterialExtension(this.materialExtension),super.onRemove(e)}updateGBufferFlags(e,r){if(!r.material||!r.material.userData)return;const a=!1===r.material.userData[i.PluginType]?.enable||r.material.userData.pluginsDisabled?0:1;e.w=t.updateBit(e.w,2,a)}static AddBloomData(e,t,r=!0){const a=e?.userData;if(!a)return null;a[i.PluginType]||(a[i.PluginType]={});const n=a[i.PluginType];return n.enable=!0,t&&Object.assign(n,t),r&&e.setDirty&&e.setDirty(),n}_getUiConfig(e){const t={type:"folder",label:"Bloom",children:[{type:"checkbox",label:"Enabled",get value(){return e.userData[i.PluginType]?.enable??!0},set value(r){let a=e.userData[i.PluginType];r!==a?.enable&&(a||(a=i.AddBloomData(e,void 0,!1)),a.enable=r,e.setDirty(),t.uiRefresh?.(!0,"postFrame"))},onChange:this.setDirty}]};return t}},i.PluginType="Bloom",i.OldPluginType="BloomPlugin",i);_([t.uiConfig(void 0,{unwrapContents:!0})],S.prototype,"_pass",2);let y=S;e.BloomPluginPass=class extends t.ExtendedShaderPass{constructor(e,i=16){super({vertexShader:t.CopyShader.vertexShader,defines:{PASS_STEP:1,MAX_INTENSITY:Math.min(i,16)},uniforms:{tSource:{value:null},tDiffuse:{value:null},opacity:{value:1},tDiffuseSize:{value:new t.Vector2},weight:{value:1}},fragmentShader:"#include <packing>\nuniform float intensity;uniform float opacity;uniform vec2 tDiffuseSize;varying vec2 vUv;uniform float weight;\n#if PASS_STEP == 0\nuniform vec4 prefilter;vec4 Prefilter(vec4 c){\n#ifdef HAS_GBUFFER\n#if !BACKGROUND_BLOOM\nif(getDepth(vUv)>0.999){return vec4(0.0);}\n#endif\n#endif\nfloat brightness=max(c.r,max(c.g,c.b));float soft=brightness+prefilter.x*(prefilter.y-1.);soft=clamp(soft,0.,prefilter.z);soft=soft*soft*prefilter.w;float contribution=max(soft,brightness-prefilter.x);contribution/=max(brightness,0.001);return vec4(c.rgb*contribution,c.a);}\n#endif\nvec4 Sample(vec2 uv){return min(vec4(MAX_INTENSITY,MAX_INTENSITY,MAX_INTENSITY,1.),tDiffuseTexelToLinear(texture2D(tDiffuse,uv)));}vec4 SampleBox(vec2 uv,float delta){vec4 o=vec2(-delta,delta).xxyy/tDiffuseSize.xyxy;vec4 s=Sample(uv+o.xy)+Sample(uv+o.zy)+Sample(uv+o.xw)+Sample(uv+o.zw);return s*0.25;}int getBloomBit(in int number){\n#ifdef WebGL2Context\nreturn(number/4)% 2;\n#else\nreturn int(mod(floor(float(number)/4.),2.));\n#endif\n}void main(){\n#if PASS_STEP == 0\n#ifdef GBUFFER_HAS_FLAGS\nint doBloom=getBloomBit(getGBufferFlags(vUv).a);\n#else\nint doBloom=1;\n#endif\ngl_FragColor=float(doBloom)*weight*Prefilter(SampleBox(vUv,1.));gl_FragColor.a=1.;\n#elif PASS_STEP == 1\ngl_FragColor=weight*(SampleBox(vUv,1.));gl_FragColor.a=1.;\n#elif PASS_STEP == 2\ngl_FragColor=(SampleBox(vUv,0.5));gl_FragColor.a=1.;\n#elif PASS_STEP == 3\nvec4 texel=tSourceTexelToLinear(texture2D(tSource,vUv));vec4 bloom=intensity*SampleBox(vUv,0.5).rgba;float brightness=max(bloom.r,max(bloom.g,bloom.b));texel.rgb+=bloom.rgb;texel.a=min(1.,texel.a+brightness);gl_FragColor=texel;\n#elif PASS_STEP == 4\nvec4 texel=vec4(0.);texel.rgb+=intensity*SampleBox(vUv,0.5).rgb;texel.a=1.;gl_FragColor=texel;\n#endif\n#include <colorspace_fragment>\n}"},"tDiffuse","tSource"),this.uiConfig=void 0,this.before=["screen"],this.after=["render","progressive"],this.required=["render"],this.prefilter=new t.Vector4(2,.5,0,0),this.threshold=2,this.softThreshold=.5,this.intensity=.2,this.backgroundBloom=!1,this.bloomIterations=4,this._currentIterations=0,this.radius=.6,this.power=1,this.bloomDebug=!1,this._weights=[],this.passId=e,this._updateWeights=this._updateWeights.bind(this),this._thresholdsUpdated=this._thresholdsUpdated.bind(this),this._updateWeights(),this._thresholdsUpdated(),this.clear=!0}_thresholdsUpdated(){this.prefilter.x=this.threshold,this.prefilter.y=this.softThreshold,this.prefilter.z=2*this.prefilter.x*this.prefilter.y,this.prefilter.w=this.uniforms?.prefilter?.125/(this.uniforms.prefilter.value.z+1e-5):0}render(e,i,r,a,n){const s=e.renderManager;this.material.defines.PASS_STEP=0,this.clear=!0,this.needsSwap=!1;const o=r;if(!o)return void console.warn("BloomPluginPass: No source to read from");this.needsSwap=!0;let l=.5,c=o.width*l,u=o.height*l;const d=[];let h=s.getTempTarget({sizeMultiplier:1,type:t.HalfFloatType});d.push(h);let p=o;this.material.needsUpdate=!0,this.material.uniforms.weight.value=this._weights[0],super.render(e,h,p,a,n),p=h;const f=this._currentIterations;let g=1;const m=Math.max(2,this.bloomIterations);for(;g<m&&(c/=2,u/=2,l/=2,!(u<2||c<2));g++){h=s.getTempTarget({sizeMultiplier:l,type:t.HalfFloatType}),d.push(h),this.material.defines.PASS_STEP=1;let i=this._weights[g];i=0!==this._weights[g-1]?this._weights[g]/this._weights[g-1]:this._weights[g],this.material.uniforms.weight.value=i,this.material.needsUpdate=!0,super.render(e,h,p,a,n),p=h,this._currentIterations=g+1}f!==this._currentIterations&&this._updateWeights(!1),this.clear=!1;const v=e.autoClear;for(e.autoClear=!1,g-=2;g>=0;g--)h=d[g],d[g]=void 0,this.material.defines.PASS_STEP=2,this.material.transparent=!0,this.material.blending=t.AdditiveBlending,this.material.needsUpdate=!0,e.autoClear=!1,super.render(e,h,p,a,n),this.material.blending=t.NoBlending,s.releaseTempTarget(p),p=h;this.clear=!0,e.autoClear=v,e.autoClear=!0,this.bloomDebug?(this.material.defines.PASS_STEP=4,this.material.needsUpdate=!0,super.render(e,i,p,a,n)):(this.uniforms.tSource.value=o.texture,this.material.defines.PASS_STEP=3,this.material.needsUpdate=!0,super.render(e,i,p,a,n),this.uniforms.tSource.value=null),s.releaseTempTarget(p)}_updateWeights(e=!0){if(!this._weights)return;const t=Math.max(Math.min(this.radius,1),0),i=Math.max(2,this._currentIterations||this.bloomIterations),r=1/(i-1);for(let a=0;a<i;a++){let e=a*r+.1,i=1.2-e;e=Math.pow(e,this.power),i=Math.pow(i,this.power),this._weights[a]=i*(1-t)+e*t}!1!==e&&this.setDirty()}},_([t.uniform()],e.BloomPluginPass.prototype,"prefilter",2),_([t.uiSlider("Threshold",[0,2]),t.onChange(e.BloomPluginPass.prototype._thresholdsUpdated),t.serialize()],e.BloomPluginPass.prototype,"threshold",2),_([t.uiSlider("Soft Threshold",[0,1]),t.onChange(e.BloomPluginPass.prototype._thresholdsUpdated),t.serialize()],e.BloomPluginPass.prototype,"softThreshold",2),_([t.uiSlider("Intensity",[0,3]),t.serialize(),t.uniform()],e.BloomPluginPass.prototype,"intensity",2),_([t.uiToggle("Background Bloom"),t.serialize(),t.matDefineBool("BACKGROUND_BLOOM")],e.BloomPluginPass.prototype,"backgroundBloom",2),_([t.uiSlider("Iterations",[2,7],1),t.onChange2(e.BloomPluginPass.prototype._updateWeights),t.serialize()],e.BloomPluginPass.prototype,"bloomIterations",2),_([t.uiSlider("Radius",[0,1],.01),t.onChange2(e.BloomPluginPass.prototype._updateWeights),t.serialize()],e.BloomPluginPass.prototype,"radius",2),_([t.uiSlider("Power",[.2,10],.01),t.onChange2(e.BloomPluginPass.prototype._updateWeights),t.serialize()],e.BloomPluginPass.prototype,"power",2),_([t.uiToggle("Debug")],e.BloomPluginPass.prototype,"bloomDebug",2),e.BloomPluginPass=_([t.uiFolderContainer("Bloom Pass")],e.BloomPluginPass);var x=Object.defineProperty,P=Object.getOwnPropertyDescriptor,b=(e,t,i,r)=>{for(var a,n=r>1?void 0:r?P(t,i):t,s=e.length-1;s>=0;s--)(a=e[s])&&(n=(r?a(t,i,n):a(n))||n);return r&&n&&x(t,i,n),n};const w=class extends t.PipelinePassPlugin{constructor(e=!0,i=!1){super(),this.passId="depthOfField",this.enableEdit=!1,this._focalPointHit=new t.Vector3(0,0,0),this.crossFadeTime=200,this._focalPointHitTime=0,this.dependencies=[t.GBufferPlugin],this._onPluginAdd=e=>{const i=e.plugin;if(i){if(i.constructor?.PluginType===t.GBufferPlugin.PluginType){const e=i;this._pass?.material.registerMaterialExtensions([e.unpackExtension]),this._pass?.computeCocMaterial.registerMaterialExtensions([e.unpackExtension]),this._pass?.expandCocMaterial.registerMaterialExtensions([e.unpackExtension])}if(i.constructor?.PluginType===t.PickingPlugin.PluginType){i.addEventListener("hitObject",this._onObjectHit)}}},this._onPluginRemove=e=>{const i=e.plugin;if(i){if(i.constructor?.PluginType===t.GBufferPlugin.PluginType){const t=e.plugin;this._pass?.material.unregisterMaterialExtensions([t.unpackExtension]),this._pass?.computeCocMaterial.unregisterMaterialExtensions([t.unpackExtension]),this._pass?.expandCocMaterial.unregisterMaterialExtensions([t.unpackExtension])}if(i.constructor?.PluginType===t.PickingPlugin.PluginType){e.plugin.removeEventListener("hitObject",this._onObjectHit)}}},this.uiConfig={type:"folder",label:"DepthOfField",onChange:this.setDirty.bind(this),children:[...t.generateUiConfig(this)||[],()=>this._pass?.uiConfig]},this._tempVec=new t.Vector3,this.enabled=e,this.enableEdit=i,this._onObjectHit=this._onObjectHit.bind(this),this.setDirty=this.setDirty.bind(this)}get _frameFadeTime(){return 2.5*this.crossFadeTime}setFocalPoint(e,i=!0,r=!1){this._focalPointHit.copy(e),i&&this._viewer?.getPlugin("FrameFadePlugin")?.startTransition(this._frameFadeTime),r&&(this._focalPointHitTime=t.now()),this.setDirty()}getFocalPoint(){return this._focalPointHit}_onObjectHit(e){this._pass&&e.intersects.intersect&&!this.isDisabled()&&this.enableEdit&&(this._focalPointHit.copy(e.intersects.intersect.point),this._focalPointHitTime=e.time,e.intersects.selectedObject=null,this._viewer?.getPlugin(t.FrameFadePlugin)?.startTransition(this._frameFadeTime),this.setDirty())}_createPass(){return new e.DepthOfFieldPluginPass(this.passId)}onAdded(e){super.onAdded(e),e.addEventListener("addPlugin",this._onPluginAdd),e.addEventListener("removePlugin",this._onPluginRemove),this._onPluginAdd({plugin:e.getPlugin(t.GBufferPlugin)}),this._onPluginAdd({plugin:e.getPlugin(t.PickingPlugin)})}onRemove(e){e.removeEventListener("addPlugin",this._onPluginAdd),e.removeEventListener("removePlugin",this._onPluginRemove),this._onPluginRemove({plugin:e.getPlugin(t.GBufferPlugin)}),this._onPluginRemove({plugin:e.getPlugin(t.PickingPlugin)}),super.onRemove(e)}_beforeRender(e,i,r){if(!super._beforeRender(e,i,r))return!1;const a=this.pass;if(!a)return!1;a.dofBlurMaterial.uniforms.frameCount&&r?.updateShaderProperties(a.dofBlurMaterial);const n=i;if(!n)return!1;n.updateMatrixWorld(!0),n.updateShaderProperties(a.material),n.getWorldPosition(this._tempVec),this._tempVec.subVectors(this._focalPointHit,this._tempVec),a.focalDepthRange.x=this._tempVec.length(),a.focalDepthRange.x*=n.getWorldDirection(new t.Vector3).dot(this._tempVec.normalize());let s=(t.now()-this._focalPointHitTime)/this.crossFadeTime;if(s=1-Math.min(1,Math.max(0,s)),Math.abs(s-a.crossAlpha)>.01&&(a.crossAlpha=s,this.setDirty()),s>0){const e=this._tempVec.copy(this._focalPointHit).project(n).addScalar(1).divideScalar(2);a.crossCenter.set(e.x,e.y),a.computeCocMaterial.uniformsNeedUpdate=!0,a.expandCocMaterial.uniformsNeedUpdate=!0}return!0}};w.PluginType="DepthOfField",w.OldPluginType="DepthOfFieldPlugin";let T=w;b([t.serialize(),t.uiToggle()],T.prototype,"enableEdit",2),b([t.serialize("focalPoint")],T.prototype,"_focalPointHit",2),b([t.serialize()],T.prototype,"crossFadeTime",2);const D=new t.ExtendedShaderMaterial({uniforms:{colorTexture:{value:null},colorTextureSize:{value:new t.Vector2},direction:{value:new t.Vector2},frameCount:{value:0},blurRadius:{value:16}},vertexShader:t.shaderUtils.defaultVertex,fragmentShader:"vec2 poisson_disk_samples[16];void setPds(){poisson_disk_samples[0]=vec2(-0.399691779231,0.728591545584);poisson_disk_samples[1]=vec2(-0.48622557676,-0.84016533712);poisson_disk_samples[2]=vec2(0.770309468987,-0.24906070432);poisson_disk_samples[3]=vec2(0.556596796154,0.820359876432);poisson_disk_samples[4]=vec2(-0.933902004071,0.0600539051593);poisson_disk_samples[5]=vec2(0.330144964342,0.207477293384);poisson_disk_samples[6]=vec2(0.289013230975,-0.686749271417);poisson_disk_samples[7]=vec2(-0.0832470893559,-0.187351643125);poisson_disk_samples[8]=vec2(-0.296314525615,0.254474834305);poisson_disk_samples[9]=vec2(-0.850977666059,0.484642744689);poisson_disk_samples[10]=vec2(0.829287915319,0.2345063545);poisson_disk_samples[11]=vec2(-0.773042143899,-0.543741521254);poisson_disk_samples[12]=vec2(0.0561133030864,0.928419742597);poisson_disk_samples[13]=vec2(-0.205799249508,-0.562072714492);poisson_disk_samples[14]=vec2(-0.526991665882,-0.193690188118);poisson_disk_samples[15]=vec2(-0.051789270667,-0.935374050821);}\n#include <randomHelpers>\n#include <common>\nvarying vec2 vUv;uniform vec2 colorTextureSize;uniform float blurRadius;\n#ifndef D_frameCount\n#define D_frameCount\nuniform float frameCount;\n#endif\nvec4 CircularBlur(){vec4 color=colorTextureTexelToLinear(texture2D(colorTexture,vUv));\n#ifdef DOF_MODE\nfloat blurDist=blurRadius*(2.*color.a-1.);\n#else\nfloat blurDist=blurRadius*color.a;\n#endif\nfloat rnd=PI2*random3(vec3(vUv,frameCount*0.1));float costheta=cos(rnd);float sintheta=sin(rnd);vec4 rotationMatrix=vec4(costheta,-sintheta,sintheta,costheta);vec3 colorSum=vec3(0.0);float weightSum=0.001;vec2 ofs;vec4 sampleColor;setPds();\n#pragma unroll_loop_start\nfor(int i=0;i<16;i++){ofs=poisson_disk_samples[UNROLLED_LOOP_INDEX];ofs=vec2(dot(ofs,rotationMatrix.xy),dot(ofs,rotationMatrix.zw));sampleColor=colorTextureTexelToLinear(texture2D(colorTexture,vUv+blurDist*ofs/colorTextureSize.xy));\n#ifdef DOF_MODE\nsampleColor.a=abs(sampleColor.a*2.0-1.0);sampleColor.a*=sampleColor.a*sampleColor.a;\n#endif\ncolorSum+=sampleColor.rgb*sampleColor.a;weightSum+=sampleColor.a;}\n#pragma unroll_loop_end\ncolorSum/=weightSum;return vec4(min(vec3(72.),max(vec3(0.),colorSum)),1.0);}void main(){gl_FragColor=CircularBlur();\n#include <colorspace_fragment>\n}",defines:{DOF_MODE:1}},["colorTexture"]);e.DepthOfFieldPluginPass=class extends t.ExtendedShaderPass{constructor(e){super({uniforms:{colorTexture:{value:null},blurTexture:{value:null},cocTexture:{value:null},cocTextureSize:{value:new t.Vector2},cameraNearFar:{value:new t.Vector2}},vertexShader:t.shaderUtils.defaultVertex,fragmentShader:"#include <common>\n#include <packing>\nvarying vec2 vUv;uniform vec2 cocTextureSize;uniform vec2 nearFarBlurScale;uniform vec2 cameraNearFar;uniform vec2 focalDepthRange;uniform vec2 crossCenter;uniform float crossRadius;uniform float crossAlpha;uniform vec3 crossColor;float smoothBoundary(float d,float smooothFactor){smooothFactor*=0.5;float value=smoothstep(-smooothFactor,smooothFactor,d);return value;}float circle(vec2 p,float r){return min((length(p)-r),-(length(p)-r-0.01));}float computeCoc(){float depth=getDepth(vUv);if(depth>1.0-0.01)return max(nearFarBlurScale.x,nearFarBlurScale.y);depth=mix(cameraNearFar.x,cameraNearFar.y,depth);float coc=(depth-focalDepthRange.x)/focalDepthRange.y;coc=clamp(coc,-1.,1.);return(coc>0.0 ? coc*nearFarBlurScale.y : coc*nearFarBlurScale.x);}void main(){vec4 blur=blurTextureTexelToLinear(texture2D(blurTexture,vUv));float scale=0.5;blur+=blurTextureTexelToLinear(texture2D(blurTexture,vUv+scale*vec2(1.0,1.0)/cocTextureSize));blur+=blurTextureTexelToLinear(texture2D(blurTexture,vUv+scale*vec2(-1.0,1.0)/cocTextureSize));blur+=blurTextureTexelToLinear(texture2D(blurTexture,vUv+scale*vec2(-1.0,-1.0)/cocTextureSize));blur+=blurTextureTexelToLinear(texture2D(blurTexture,vUv+scale*vec2(1.0,-1.0)/cocTextureSize));blur/=5.0;vec2 uvNearest=(floor(vUv*cocTextureSize)+0.5)/cocTextureSize;float coc=abs(min(2.*cocTextureTexelToLinear(texture2D(cocTexture,uvNearest)).a-1.,computeCoc()));float cocLower=0.005;float cocHigher=0.3;vec4 outColor=vec4(mix(colorTextureTexelToLinear(texture2D(colorTexture,vUv)).rgb,blur.rgb,smoothstep(cocLower,cocHigher,coc)),1.0);vec2 d=vUv-crossCenter;if(length(d)>crossRadius+0.05){float dist=circle(d,crossRadius);gl_FragColor=outColor;}else{d.x*=cocTextureSize.x/cocTextureSize.y;float dist=circle(d,crossRadius);dist=smoothBoundary(dist,2.*fwidth(dist));vec4 color=outColor;vec3 dofCircleColor=mix(crossColor,color.rgb,1.-crossAlpha);gl_FragColor=vec4(mix(color.rgb,dofCircleColor,dist),color.a);}\n#include <colorspace_fragment>\n}"},"colorTexture","cocTexture","blurTexture"),this.uiConfig=void 0,this.before=["progressive","screen"],this.after=["render"],this.required=["render"],this.dofBlurMaterial=D,this.nearFarBlurScale=new t.Vector2(.25,.25),this.focalDepthRange=new t.Vector2(.5,1.5),this.crossCenter=new t.Vector2(.5,.5),this.crossRadius=.04,this.crossAlpha=1,this.crossColor=new t.Color(16750848),this.passId=e,this.computeCocMaterial=new t.ExtendedShaderMaterial({uniforms:{colorTexture:{value:null},cameraNearFar:this.uniforms.cameraNearFar,nearFarBlurScale:this.uniforms.nearFarBlurScale,focalDepthRange:this.uniforms.focalDepthRange},vertexShader:t.shaderUtils.defaultVertex,fragmentShader:"#include <common>\n#include <packing>\nvarying vec2 vUv;uniform vec2 nearFarBlurScale;uniform vec2 cameraNearFar;uniform vec2 focalDepthRange;float computeCoc(){float depth=getDepth(vUv);if(depth==1.0)return max(nearFarBlurScale.x,nearFarBlurScale.y);depth=mix(cameraNearFar.x,cameraNearFar.y,depth);float coc=(depth-focalDepthRange.x)/focalDepthRange.y;coc=clamp(coc,-1.,1.);return(coc>0.0 ? coc*nearFarBlurScale.y : coc*nearFarBlurScale.x);}void main(){gl_FragColor=vec4(colorTextureTexelToLinear(texture2D(colorTexture,vUv)).rgb,0.5*computeCoc()+0.5);\n#include <colorspace_fragment>\n}"},["colorTexture"]),this.expandCocMaterial=new t.ExtendedShaderMaterial({uniforms:{colorTexture:{value:null},colorTextureSize:{value:new t.Vector2},direction:{value:new t.Vector2},nearFarBlurScale:this.uniforms.nearFarBlurScale},vertexShader:t.shaderUtils.defaultVertex,fragmentShader:"#include <common>\n#include <gbuffer_unpack>\nvarying vec2 vUv;uniform vec2 colorTextureSize;uniform vec2 direction;uniform vec2 nearFarBlurScale;const float MAXIMUM_BLUR_SIZE=4.0;float expandNear(const in vec2 offset,const in bool isBackground){float coc=0.0;vec2 sampleOffsets=MAXIMUM_BLUR_SIZE*offset/5.0;float coc0=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv)).a-1.;float coc1=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv-5.0*sampleOffsets)).a-1.;float coc2=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv-4.0*sampleOffsets)).a-1.;float coc3=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv-3.0*sampleOffsets)).a-1.;float coc4=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv-2.0*sampleOffsets)).a-1.;float coc5=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv-1.0*sampleOffsets)).a-1.;float coc6=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv+1.0*sampleOffsets)).a-1.;float coc7=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv+2.0*sampleOffsets)).a-1.;float coc8=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv+3.0*sampleOffsets)).a-1.;float coc9=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv+4.0*sampleOffsets)).a-1.;float coc10=2.*colorTextureTexelToLinear(texture2D(colorTexture,vUv+5.0*sampleOffsets)).a-1.;if(isBackground){coc=abs(coc0)*0.095474+(abs(coc1)+abs(coc10))*0.084264+(abs(coc2)+abs(coc9))*0.088139+(abs(coc3)+abs(coc8))*0.091276+(abs(coc4)+abs(coc7))*0.093585+(abs(coc5)+abs(coc6))*0.094998;}else{coc=min(coc0,0.0);coc=min(coc1*0.3,coc);coc=min(coc2*0.5,coc);coc=min(coc3*0.75,coc);coc=min(coc4*0.8,coc);coc=min(coc5*0.95,coc);coc=min(coc6*0.95,coc);coc=min(coc7*0.8,coc);coc=min(coc8*0.75,coc);coc=min(coc9*0.5,coc);coc=min(coc10*0.3,coc);if(abs(coc0)>abs(coc))coc=coc0;}return coc;}void main(){vec2 offset=2.*direction/colorTextureSize;bool isBackground=getDepth(vUv)>1.0-0.001;float coc=expandNear(offset,isBackground);gl_FragColor=vec4(colorTextureTexelToLinear(texture2D(colorTexture,vUv)).rgb,0.5*coc+0.5);\n#include <colorspace_fragment>\n}"},["colorTexture"])}render(e,i,r,a,n){if(!this.enabled)return;if(!r)return void console.error("DepthOfFieldPluginPass: No readBuffer");const s=e.renderManager,o={minFilter:t.NearestFilter,magFilter:t.NearestFilter,type:t.HalfFloatType,colorSpace:t.LinearSRGBColorSpace,sizeMultiplier:.5,format:t.RGBAFormat,depthBuffer:!1,generateMipmaps:!1},l=s.getTempTarget(o),c=s.getTempTarget(o);if(this.computeCocMaterial.uniforms.colorTexture.value=r.texture,s.blit(l,{material:this.computeCocMaterial}),this.expandCocMaterial.uniforms.colorTexture.value=l.texture,this.expandCocMaterial.uniforms.direction.value.set(1,0),s.blit(c,{material:this.expandCocMaterial}),this.expandCocMaterial.uniforms.colorTexture.value=c.texture,this.expandCocMaterial.uniforms.direction.value.set(0,1),s.blit(l,{material:this.expandCocMaterial}),this.dofBlurMaterial.uniforms.frameCount)this.dofBlurMaterial.uniforms.colorTexture.value=l.texture,s.blit(c,{material:this.dofBlurMaterial});else{const e=s.getTempTarget(o);this.dofBlurMaterial.uniforms.cocTexture.value=l.texture,this.dofBlurMaterial.uniforms.colorTexture.value=l.texture,this.dofBlurMaterial.uniforms.direction.value.set(1,0),s.blit(e,{material:this.dofBlurMaterial}),this.dofBlurMaterial.uniforms.colorTexture.value=e.texture,this.dofBlurMaterial.uniforms.direction.value.set(0,1),s.blit(c,{material:this.dofBlurMaterial}),s.releaseTempTarget(e)}this.material.uniforms.blurTexture.value=c.texture,this.material.uniforms.cocTexture.value=l.texture,super.render(e,i,r,a,n),s.releaseTempTarget(l),s.releaseTempTarget(c)}},b([t.bindToValue({obj:"focalDepthRange",key:"y"}),t.uiSlider("Depth Range",[.25,3])],e.DepthOfFieldPluginPass.prototype,"depthRange",2),b([t.bindToValue({obj:"nearFarBlurScale",key:"x"}),t.uiSlider("Near Blur Scale",[0,1])],e.DepthOfFieldPluginPass.prototype,"nearBlurScale",2),b([t.bindToValue({obj:"nearFarBlurScale",key:"y"}),t.uiSlider("Far Blur Scale",[0,1])],e.DepthOfFieldPluginPass.prototype,"farBlurScale",2),b([t.serialize(),t.uniform()],e.DepthOfFieldPluginPass.prototype,"nearFarBlurScale",2),b([t.serialize(),t.uniform()],e.DepthOfFieldPluginPass.prototype,"focalDepthRange",2),b([t.uniform()],e.DepthOfFieldPluginPass.prototype,"crossCenter",2),b([t.uniform()],e.DepthOfFieldPluginPass.prototype,"crossRadius",2),b([t.uniform()],e.DepthOfFieldPluginPass.prototype,"crossAlpha",2),b([t.uniform()],e.DepthOfFieldPluginPass.prototype,"crossColor",2),e.DepthOfFieldPluginPass=b([t.uiFolderContainer("DepthOfField Pass")],e.DepthOfFieldPluginPass);const C="#ifndef SSRT_PARS_SNIP\n#define SSRT_PARS_SNIP\n#define pow2(a) a*a\nfloat getDepth2(const in vec2 uv,const in float lod){float viewDepth=getDepth(uv);return depthToViewZ(viewDepth);}\n#define LOD_DEPTH 1.0\n#define LOD_COLOR 5.0\nvoid _traceRay(in vec4 ray_origin,in vec4 ray_dir,in float tolerance,inout vec3 state,in int loopMax,in float iStepCount){vec4 sample_uv;float d,hit;float dLod=0.;\n#pragma unroll_loop_start\nfor(int i=0;i<8;i++){if(UNROLLED_LOOP_INDEX<loopMax){sample_uv=ray_origin+ray_dir*state.y;d=getDepth2(sample_uv.xy,dLod);d=sample_uv.z/sample_uv.w-d;if(abs(d+tolerance)<tolerance){hit=clamp(state.x/(state.x-d),0.,1.)-1.;hit=(state.y+hit*iStepCount);state.z=min(state.z,hit);}state.x=d;state.y+=1.*iStepCount;}}\n#pragma unroll_loop_end\n}vec3 traceRay(in vec3 ray_origin_view,in vec3 ray_dir_view,in float tolerance,inout vec3 state,in int _STEP_COUNT){vec4 sample_uv;vec4 ray_origin=viewToScreen3(ray_origin_view);vec3 ray_end_view=ray_origin_view+ray_dir_view;vec4 ray_dir=viewToScreen3(ray_end_view);vec2 clamp_end=clamp(ray_dir.xy,vec2(0.),vec2(1.));vec2 correction=abs(ray_dir.xy-clamp_end);correction=(step(0.01,correction)*correction/(abs(clamp_end-ray_origin.xy)+0.01))+1.;correction.x=1./min(max(correction.y,correction.x),10.);ray_dir=ray_dir-ray_origin;ray_dir.xyw*=correction.x;float iStepCount=1./float(_STEP_COUNT);tolerance*=0.125;_traceRay(ray_origin,ray_dir,tolerance,state,_STEP_COUNT,iStepCount);if(_STEP_COUNT>8&&state.z>0.98)_traceRay(ray_origin,ray_dir,tolerance,state,_STEP_COUNT-8,iStepCount);if(_STEP_COUNT>15&&state.z>0.98)_traceRay(ray_origin,ray_dir,tolerance,state,_STEP_COUNT-16,iStepCount);if(_STEP_COUNT>23&&state.z>0.98)_traceRay(ray_origin,ray_dir,tolerance,state,_STEP_COUNT-16,iStepCount);sample_uv=ray_origin+ray_dir*state.z;sample_uv.z/=sample_uv.w;state.z=state.z<0.999 ? state.z : 9999999.;return sample_uv.xyz;}/**for ray clippinga=ray_originb=ray_endc=clamp(b)x=c.y-a.yy=b.y-c.y(c.y-a.y)/(b.y-c.y)=m/(l-m)m/(l-m)=km=kl-kmm=kl/(1+k)((c-a)/(b-c))/(1+(c-a)/(b-c))x/(y*(1+x/y))x/(y+x)1/(y/x+1)x/(y+yx)1/(y/x+y)ray scale=k/(1+k)1/(1/k+1)=1/((b-c)/(c-a)+1)**/\n#endif\n";var M=Object.defineProperty,R=Object.getOwnPropertyD