@tresjs/post-processing 1.0.0-next.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +0 -4
  2. package/dist/core/pmndrs/BloomPmndrs.vue.d.ts +61 -0
  3. package/dist/core/{effects/DepthOfField.vue.d.ts → pmndrs/DepthOfFieldPmndrs.vue.d.ts} +3 -13
  4. package/dist/core/pmndrs/EffectComposerPmndrs.vue.d.ts +36 -0
  5. package/dist/core/pmndrs/GlitchPmndrs.vue.d.ts +51 -0
  6. package/dist/core/pmndrs/NoisePmndrs.vue.d.ts +16 -0
  7. package/dist/core/{effects/Outline.vue.d.ts → pmndrs/OutlinePmndrs.vue.d.ts} +5 -29
  8. package/dist/core/pmndrs/PixelationPmndrs.vue.d.ts +12 -0
  9. package/dist/core/pmndrs/VignettePmndrs.vue.d.ts +20 -0
  10. package/dist/core/pmndrs/composables/useEffectPmndrs.d.ts +6 -0
  11. package/dist/core/pmndrs/index.d.ts +10 -0
  12. package/dist/core/three/EffectComposer.vue.d.ts +20 -0
  13. package/dist/core/three/Glitch.vue.d.ts +15 -0
  14. package/dist/core/three/Halftone.vue.d.ts +23 -0
  15. package/dist/core/three/Output.vue.d.ts +5 -0
  16. package/dist/core/three/Pixelation.vue.d.ts +10 -0
  17. package/dist/core/three/SMAA.vue.d.ts +9 -0
  18. package/dist/core/three/UnrealBloom.vue.d.ts +14 -0
  19. package/dist/core/three/composables/useEffect.d.ts +9 -0
  20. package/dist/core/three/index.d.ts +9 -0
  21. package/dist/index.d.ts +2 -11
  22. package/dist/tres-post-processing.d.ts +2 -0
  23. package/dist/tres-post-processing.js +2129 -0
  24. package/dist/tres-post-processing.umd.cjs +1009 -0
  25. package/dist/util/prop.d.ts +3 -4
  26. package/package.json +34 -28
  27. package/dist/core/EffectComposer.vue.d.ts +0 -73
  28. package/dist/core/effects/Bloom.vue.d.ts +0 -204
  29. package/dist/core/effects/Glitch.vue.d.ts +0 -105
  30. package/dist/core/effects/Noise.vue.d.ts +0 -40
  31. package/dist/core/effects/Pixelation.vue.d.ts +0 -22
  32. package/dist/core/effects/Vignette.vue.d.ts +0 -48
  33. package/dist/core/injectionKeys.d.ts +0 -4
  34. package/dist/tres-postprocessing.js +0 -345
  35. package/dist/tres-postprocessing.umd.cjs +0 -8
@@ -0,0 +1,1009 @@
1
+ /**
2
+ * name: @tresjs/post-processing
3
+ * version: v2.0.0
4
+ * (c) 2025
5
+ * description: Post-processing library for TresJS
6
+ * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
+ */
8
+ (function(c,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("vue"),require("postprocessing"),require("@tresjs/core"),require("three"),require("@vueuse/core")):typeof define=="function"&&define.amd?define(["exports","vue","postprocessing","@tresjs/core","three","@vueuse/core"],n):(c=typeof globalThis<"u"?globalThis:c||self,n(c["tres-post-processing"]={},c.Vue,c.Postprocessing,c.TresjsCore,c.Three,c.VueUseCore))})(this,function(c,n,h,p,o,O){"use strict";const z=/([^[.\]])+/g,Q=(l,e)=>{if(!e)return;const t=Array.isArray(e)?e:e.match(z);return t==null?void 0:t.reduce((a,s)=>a&&a[s],l)},F=(l,e,t)=>{const a=Array.isArray(e)?e:e.match(z);a&&a.reduce((s,i,r)=>(s[i]===void 0&&(s[i]={}),r===a.length-1&&(s[i]=t),s[i]),l)},B=(l,e)=>{const t={...l};return e.forEach(a=>delete t[a]),t},U=(l,e,t,a,s={})=>n.watch(l,i=>{var r;if(e.value)if(i===void 0){const d=a();F(e.value,t,Q(d,t)),(r=d.dispose)==null||r.call(d)}else F(e.value,t,l())},s),y=(l,e,t)=>l.map(([a,s])=>U(a,e,s,t)),E=(l,e,t)=>Object.keys(l).map(a=>U(()=>l[a],e,a,t));class W{static isWebGL2Available(){try{const e=document.createElement("canvas");return!!(window.WebGL2RenderingContext&&e.getContext("webgl2"))}catch{return!1}}static isColorSpaceAvailable(e){try{const t=document.createElement("canvas"),a=window.WebGL2RenderingContext&&t.getContext("webgl2");return a.drawingBufferColorSpace=e,a.drawingBufferColorSpace===e}catch{return!1}}static getWebGL2ErrorMessage(){return this.getErrorMessage(2)}static getErrorMessage(e){const t={1:"WebGL",2:"WebGL 2"},a={1:window.WebGLRenderingContext,2:window.WebGL2RenderingContext};let s='Your $0 does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">$1</a>';const i=document.createElement("div");return i.id="webglmessage",i.style.fontFamily="monospace",i.style.fontSize="13px",i.style.fontWeight="normal",i.style.textAlign="center",i.style.background="#fff",i.style.color="#000",i.style.padding="1.5em",i.style.width="400px",i.style.margin="5em auto 0",a[e]?s=s.replace("$0","graphics card"):s=s.replace("$0","browser"),s=s.replace("$1",t[e]),i.innerHTML=s,i}static isWebGLAvailable(){console.warn("isWebGLAvailable() has been deprecated and will be removed in r178. Use isWebGL2Available() instead.");try{const e=document.createElement("canvas");return!!(window.WebGLRenderingContext&&(e.getContext("webgl")||e.getContext("experimental-webgl")))}catch{return!1}}static getWebGLErrorMessage(){return console.warn("getWebGLErrorMessage() has been deprecated and will be removed in r178. Use getWebGL2ErrorMessage() instead."),this.getErrorMessage(1)}}const H=Symbol("effectComposerPmndrs"),k=n.defineComponent({__name:"EffectComposerPmndrs",props:{enabled:{type:Boolean,default:!0},depthBuffer:{type:Boolean,default:void 0},disableNormalPass:{type:Boolean,default:!1},stencilBuffer:{type:Boolean,default:void 0},resolutionScale:{},autoClear:{type:Boolean,default:!0},multisampling:{default:0},frameBufferType:{default:o.HalfFloatType}},emits:["render"],setup(l,{expose:e,emit:t}){const a=l,s=t,{scene:i,camera:r,renderer:d,sizes:u,render:x}=p.useTresContext(),f=n.shallowRef(null);let g=null,m=null;n.provide(H,f),e({composer:f});const S=()=>{f.value&&(m=new h.NormalPass(i.value,r.value),m.enabled=!1,f.value.addPass(m),a.resolutionScale!==void 0&&W.isWebGL2Available()&&(g=new h.DepthDownsamplingPass({normalBuffer:m.texture,resolutionScale:a.resolutionScale}),g.enabled=!1,f.value.addPass(g)))},R=n.computed(()=>{const v=new h.EffectComposer,C={depthBuffer:a.depthBuffer!==void 0?a.depthBuffer:v.inputBuffer.depthBuffer,stencilBuffer:a.stencilBuffer!==void 0?a.stencilBuffer:v.inputBuffer.stencilBuffer,multisampling:W.isWebGL2Available()?a.multisampling!==void 0?a.multisampling:v.multisampling:0,frameBufferType:a.frameBufferType!==void 0?a.frameBufferType:o.HalfFloatType};return v.dispose(),C}),q=()=>{var v;!d.value&&!i.value&&!r.value||((v=f.value)==null||v.dispose(),f.value=new h.EffectComposer(d.value,R.value),f.value.addPass(new h.RenderPass(i.value,r.value)),a.disableNormalPass||S())};n.watch([d,i,r,()=>a.disableNormalPass],()=>{!u.width.value||!u.height.value||q()}),n.watch(()=>[u.width.value,u.height.value],([v,C])=>{!v&&!C||(f.value?f.value.setSize(v,C):q())},{immediate:!0});const{render:Te}=p.useLoop();return Te(()=>{if(a.enabled&&d.value&&f.value&&u.width.value&&u.height.value&&x.frames.value>0){const v=d.value.autoClear;d.value.autoClear=a.autoClear,a.stencilBuffer&&!a.autoClear&&d.value.clearStencil(),f.value.render(),s("render",f.value),d.value.autoClear=v}x.frames.value=x.mode.value==="always"?1:Math.max(0,x.frames.value-1)}),n.onUnmounted(()=>{var v;(v=f.value)==null||v.dispose()}),(v,C)=>n.renderSlot(v.$slots,"default")}}),T=(l,e)=>{const t=n.inject(H),a=n.shallowRef(null),s=n.shallowRef(null),{scene:i,camera:r,invalidate:d}=p.useTresContext();e&&n.watch(e,()=>d()),n.watchEffect(()=>{!r.value||!(s!=null&&s.value)||(s.value.mainCamera=r.value)});const u=n.watchEffect(()=>{!r.value||!(t!=null&&t.value)||!i.value||(n.nextTick(()=>u()),!s.value&&(s.value=l(),a.value=new h.EffectPass(r.value,s.value),t.value.addPass(a.value)))});return n.onUnmounted(()=>{var x,f,g;a.value&&((x=t==null?void 0:t.value)==null||x.removePass(a.value)),(f=s.value)==null||f.dispose(),(g=a.value)==null||g.dispose()}),{pass:a,effect:s}},K=n.defineComponent({__name:"BloomPmndrs",props:{blendFunction:{},intensity:{},kernelSize:{},luminanceThreshold:{},luminanceSmoothing:{},mipmapBlur:{type:Boolean,default:void 0}},setup(l,{expose:e}){const t=l,{pass:a,effect:s}=T(()=>new h.BloomEffect(t),t);return e({pass:a,effect:s}),y([[()=>t.intensity,"intensity"],[()=>t.kernelSize,"kernelSize"],[()=>t.luminanceSmoothing,"luminanceMaterial.smoothing"],[()=>t.luminanceThreshold,"luminanceMaterial.threshold"]],s,()=>new h.BloomEffect),()=>{}}}),Z=n.defineComponent({__name:"DepthOfFieldPmndrs",props:{blendFunction:{},worldFocusDistance:{},worldFocusRange:{},focusDistance:{},focusRange:{},bokehScale:{},resolutionScale:{},resolutionX:{},resolutionY:{}},setup(l,{expose:e}){const t=l,{camera:a}=p.useTresContext(),{pass:s,effect:i}=T(()=>new h.DepthOfFieldEffect(a.value,t),t);return e({pass:s,effect:i}),y([[()=>t.worldFocusDistance,"circleOfConfusionMaterial.worldFocusDistance"],[()=>t.focusDistance,"circleOfConfusionMaterial.focusDistance"],[()=>t.worldFocusRange,"circleOfConfusionMaterial.worldFocusRange"],[()=>t.focusRange,"circleOfConfusionMaterial.focusRange"],[()=>t.bokehScale,"bokehScale"],[()=>t.resolutionScale,"blurPass.resolution.scale"],[()=>t.resolutionX,"resolution.width"],[()=>t.resolutionY,"resolution.height"]],i,()=>new h.DepthOfFieldEffect),()=>{}}}),J=n.defineComponent({__name:"GlitchPmndrs",props:{blendFunction:{},delay:{},duration:{},strength:{},mode:{},active:{type:Boolean},ratio:{},columns:{},chromaticAberrationOffset:{},perturbationMap:{},dtSize:{}},setup(l,{expose:e}){const t=l,{pass:a,effect:s}=T(()=>new h.GlitchEffect(t),t);e({pass:a,effect:s});const{onBeforeRender:i}=p.useLoop();return i(({invalidate:r})=>r()),n.watchEffect(()=>{const r=()=>{if(t.mode!==void 0)return t.active===!1?h.GlitchMode.DISABLED:t.mode;const d=new h.GlitchEffect,u=d.mode;return d.dispose(),u};s.value&&(s.value.mode=r())}),E(B(t,["active","mode","blendFunction"]),s,()=>new h.GlitchEffect),()=>{}}}),_=n.defineComponent({__name:"NoisePmndrs",props:{premultiply:{type:Boolean,default:!1},blendFunction:{default:h.BlendFunction.SCREEN}},setup(l,{expose:e}){const t=l,{pass:a,effect:s}=T(()=>new h.NoiseEffect(t),t);e({pass:a,effect:s});const{onBeforeRender:i}=p.useLoop();return i(({invalidate:r})=>r()),E(B(t,["blendFunction"]),s,()=>new h.NoiseEffect),()=>{}}}),$=n.defineComponent({__name:"OutlinePmndrs",props:{outlinedObjects:{},blur:{type:Boolean,default:void 0},xRay:{type:Boolean,default:void 0},kernelSize:{},pulseSpeed:{},resolutionX:{},resolutionY:{},edgeStrength:{},patternScale:{},multisampling:{},blendFunction:{},patternTexture:{},resolutionScale:{},hiddenEdgeColor:{},visibleEdgeColor:{}},setup(l,{expose:e}){const t=l,a=f=>f!==void 0?p.normalizeColor(f).getHex():void 0,{camera:s,scene:i}=p.useTresContext(),r={blur:t.blur,xRay:t.xRay,kernelSize:t.kernelSize,pulseSpeed:t.pulseSpeed,resolutionX:t.resolutionX,resolutionY:t.resolutionY,patternScale:t.patternScale,edgeStrength:t.edgeStrength,blendFunction:t.blendFunction,multisampling:t.multisampling,patternTexture:t.patternTexture,resolutionScale:t.resolutionScale,hiddenEdgeColor:a(t.hiddenEdgeColor),visibleEdgeColor:a(t.visibleEdgeColor)},{pass:d,effect:u}=T(()=>new h.OutlineEffect(i.value,s.value,r),t);e({pass:d,effect:u}),n.watch([()=>t.outlinedObjects,u],()=>{var f;(f=u.value)==null||f.selection.set(t.outlinedObjects||[])},{immediate:!0});const x=n.computed(()=>({hiddenEdgeColor:t.hiddenEdgeColor?p.normalizeColor(t.hiddenEdgeColor):void 0,visibleEdgeColor:t.visibleEdgeColor?p.normalizeColor(t.visibleEdgeColor):void 0}));return y([[()=>t.blur,"blur"],[()=>t.xRay,"xRay"],[()=>t.pulseSpeed,"pulseSpeed"],[()=>t.kernelSize,"kernelSize"],[()=>t.edgeStrength,"edgeStrength"],[()=>t.patternScale,"patternScale"],[()=>t.multisampling,"multisampling"],[()=>x.value.hiddenEdgeColor,"hiddenEdgeColor"],[()=>x.value.visibleEdgeColor,"visibleEdgeColor"]],u,()=>new h.OutlineEffect),()=>{}}}),ee=n.defineComponent({__name:"PixelationPmndrs",props:{granularity:{}},setup(l,{expose:e}){const t=l,{pass:a,effect:s}=T(()=>new h.PixelationEffect(t.granularity),t);return e({pass:a,effect:s}),E(t,s,()=>new h.PixelationEffect),()=>{}}}),te=n.defineComponent({__name:"VignettePmndrs",props:{technique:{default:h.VignetteTechnique.DEFAULT},blendFunction:{default:h.BlendFunction.NORMAL},offset:{default:.5},darkness:{default:.5}},setup(l,{expose:e}){const t=l,{pass:a,effect:s}=T(()=>new h.VignetteEffect(t),t);return e({pass:a,effect:s}),E(B(t,["blendFunction"]),s,()=>new h.VignetteEffect),()=>{}}}),G={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:`
9
+
10
+ varying vec2 vUv;
11
+
12
+ void main() {
13
+
14
+ vUv = uv;
15
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
16
+
17
+ }`,fragmentShader:`
18
+
19
+ uniform float opacity;
20
+
21
+ uniform sampler2D tDiffuse;
22
+
23
+ varying vec2 vUv;
24
+
25
+ void main() {
26
+
27
+ vec4 texel = texture2D( tDiffuse, vUv );
28
+ gl_FragColor = opacity * texel;
29
+
30
+
31
+ }`};class b{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}const ae=new o.OrthographicCamera(-1,1,1,-1,0,1);class se extends o.BufferGeometry{constructor(){super(),this.setAttribute("position",new o.Float32BufferAttribute([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new o.Float32BufferAttribute([0,2,0,0,2,0],2))}}const ie=new se;class w{constructor(e){this._mesh=new o.Mesh(ie,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,ae)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class oe extends b{constructor(e,t){super(),this.textureID=t!==void 0?t:"tDiffuse",e instanceof o.ShaderMaterial?(this.uniforms=e.uniforms,this.material=e):e&&(this.uniforms=o.UniformsUtils.clone(e.uniforms),this.material=new o.ShaderMaterial({name:e.name!==void 0?e.name:"unspecified",defines:Object.assign({},e.defines),uniforms:this.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader})),this.fsQuad=new w(this.material)}render(e,t,a){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=a.texture),this.fsQuad.material=this.material,this.renderToScreen?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this.fsQuad.render(e))}dispose(){this.material.dispose(),this.fsQuad.dispose()}}class X extends b{constructor(e,t){super(),this.scene=e,this.camera=t,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(e,t,a){const s=e.getContext(),i=e.state;i.buffers.color.setMask(!1),i.buffers.depth.setMask(!1),i.buffers.color.setLocked(!0),i.buffers.depth.setLocked(!0);let r,d;this.inverse?(r=0,d=1):(r=1,d=0),i.buffers.stencil.setTest(!0),i.buffers.stencil.setOp(s.REPLACE,s.REPLACE,s.REPLACE),i.buffers.stencil.setFunc(s.ALWAYS,r,4294967295),i.buffers.stencil.setClear(d),i.buffers.stencil.setLocked(!0),e.setRenderTarget(a),this.clear&&e.clear(),e.render(this.scene,this.camera),e.setRenderTarget(t),this.clear&&e.clear(),e.render(this.scene,this.camera),i.buffers.color.setLocked(!1),i.buffers.depth.setLocked(!1),i.buffers.color.setMask(!0),i.buffers.depth.setMask(!0),i.buffers.stencil.setLocked(!1),i.buffers.stencil.setFunc(s.EQUAL,1,4294967295),i.buffers.stencil.setOp(s.KEEP,s.KEEP,s.KEEP),i.buffers.stencil.setLocked(!0)}}class re extends b{constructor(){super(),this.needsSwap=!1}render(e){e.state.buffers.stencil.setLocked(!1),e.state.buffers.stencil.setTest(!1)}}class ne{constructor(e,t){if(this.renderer=e,this._pixelRatio=e.getPixelRatio(),t===void 0){const a=e.getSize(new o.Vector2);this._width=a.width,this._height=a.height,t=new o.WebGLRenderTarget(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:o.HalfFloatType}),t.texture.name="EffectComposer.rt1"}else this._width=t.width,this._height=t.height;this.renderTarget1=t,this.renderTarget2=t.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new oe(G),this.copyPass.material.blending=o.NoBlending,this.clock=new o.Clock}swapBuffers(){const e=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=e}addPass(e){this.passes.push(e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(e,t){this.passes.splice(t,0,e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(e){const t=this.passes.indexOf(e);t!==-1&&this.passes.splice(t,1)}isLastEnabledPass(e){for(let t=e+1;t<this.passes.length;t++)if(this.passes[t].enabled)return!1;return!0}render(e){e===void 0&&(e=this.clock.getDelta());const t=this.renderer.getRenderTarget();let a=!1;for(let s=0,i=this.passes.length;s<i;s++){const r=this.passes[s];if(r.enabled!==!1){if(r.renderToScreen=this.renderToScreen&&this.isLastEnabledPass(s),r.render(this.renderer,this.writeBuffer,this.readBuffer,e,a),r.needsSwap){if(a){const d=this.renderer.getContext(),u=this.renderer.state.buffers.stencil;u.setFunc(d.NOTEQUAL,1,4294967295),this.copyPass.render(this.renderer,this.writeBuffer,this.readBuffer,e),u.setFunc(d.EQUAL,1,4294967295)}this.swapBuffers()}X!==void 0&&(r instanceof X?a=!0:r instanceof re&&(a=!1))}}this.renderer.setRenderTarget(t)}reset(e){if(e===void 0){const t=this.renderer.getSize(new o.Vector2);this._pixelRatio=this.renderer.getPixelRatio(),this._width=t.width,this._height=t.height,e=this.renderTarget1.clone(),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.renderTarget1=e,this.renderTarget2=e.clone(),this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2}setSize(e,t){this._width=e,this._height=t;const a=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget1.setSize(a,s),this.renderTarget2.setSize(a,s);for(let i=0;i<this.passes.length;i++)this.passes[i].setSize(a,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.copyPass.dispose()}}class le extends b{constructor(e,t,a=null,s=null,i=null){super(),this.scene=e,this.camera=t,this.overrideMaterial=a,this.clearColor=s,this.clearAlpha=i,this.clear=!0,this.clearDepth=!1,this.needsSwap=!1,this._oldClearColor=new o.Color}render(e,t,a){const s=e.autoClear;e.autoClear=!1;let i,r;this.overrideMaterial!==null&&(r=this.scene.overrideMaterial,this.scene.overrideMaterial=this.overrideMaterial),this.clearColor!==null&&(e.getClearColor(this._oldClearColor),e.setClearColor(this.clearColor,e.getClearAlpha())),this.clearAlpha!==null&&(i=e.getClearAlpha(),e.setClearAlpha(this.clearAlpha)),this.clearDepth==!0&&e.clearDepth(),e.setRenderTarget(this.renderToScreen?null:a),this.clear===!0&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.render(this.scene,this.camera),this.clearColor!==null&&e.setClearColor(this._oldClearColor),this.clearAlpha!==null&&e.setClearAlpha(i),this.overrideMaterial!==null&&(this.scene.overrideMaterial=r),e.autoClear=s}}const j=Symbol("effectComposerThree"),de=n.defineComponent({__name:"EffectComposer",props:{enabled:{type:Boolean,default:!0},withoutRenderPass:{type:Boolean}},setup(l,{expose:e}){const t=l,a=n.shallowRef(null);n.provide(j,a),e({composer:a});const{renderer:s,sizes:i,scene:r,camera:d,render:u}=p.useTresContext(),x=()=>{var m;(m=a.value)==null||m.dispose(),a.value=new ne(s.value)};n.watchEffect(x),n.watchEffect(()=>{var R;const{width:m,height:S}=i;S.value&&m.value&&((R=a.value)==null||R.setSize(m.value,S.value))});const{pixelRatio:f}=O.useDevicePixelRatio();n.watchEffect(()=>{var m;(m=a.value)==null||m.setPixelRatio(f.value)}),t.withoutRenderPass||n.watchEffect(()=>{d.value&&r.value&&a.value&&a.value.addPass(new le(r.value,d.value))});const{render:g}=p.useLoop();return g(()=>{u.frames.value>0&&a.value&&t.enabled&&a.value.render(),u.frames.value=u.mode.value==="always"?1:Math.max(0,u.frames.value-1)}),n.onUnmounted(()=>{var m;(m=a.value)==null||m.dispose()}),(m,S)=>n.renderSlot(m.$slots,"default")}}),A=(l,e)=>{const t=n.inject(j),a=n.shallowRef(l()),{sizes:s,invalidate:i}=p.useTresContext();e&&n.watch(e,()=>i());const r=n.watchEffect(()=>{!(t!=null&&t.value)||!s.height.value||!s.width.value||(t.value.addPass(a.value),n.nextTick(()=>r()))});return n.onUnmounted(()=>{var d;(d=t==null?void 0:t.value)==null||d.removePass(a.value),a.value.dispose()}),{pass:a}},ue={uniforms:{tDiffuse:{value:null},tDisp:{value:null},byp:{value:0},amount:{value:.08},angle:{value:.02},seed:{value:.02},seed_x:{value:.02},seed_y:{value:.02},distortion_x:{value:.5},distortion_y:{value:.6},col_s:{value:.05}},vertexShader:`
32
+
33
+ varying vec2 vUv;
34
+ void main() {
35
+ vUv = uv;
36
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
37
+ }`,fragmentShader:`
38
+
39
+ uniform int byp; //should we apply the glitch ?
40
+
41
+ uniform sampler2D tDiffuse;
42
+ uniform sampler2D tDisp;
43
+
44
+ uniform float amount;
45
+ uniform float angle;
46
+ uniform float seed;
47
+ uniform float seed_x;
48
+ uniform float seed_y;
49
+ uniform float distortion_x;
50
+ uniform float distortion_y;
51
+ uniform float col_s;
52
+
53
+ varying vec2 vUv;
54
+
55
+
56
+ float rand(vec2 co){
57
+ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
58
+ }
59
+
60
+ void main() {
61
+ if(byp<1) {
62
+ vec2 p = vUv;
63
+ float xs = floor(gl_FragCoord.x / 0.5);
64
+ float ys = floor(gl_FragCoord.y / 0.5);
65
+ //based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch
66
+ float disp = texture2D(tDisp, p*seed*seed).r;
67
+ if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {
68
+ if(seed_x>0.){
69
+ p.y = 1. - (p.y + distortion_y);
70
+ }
71
+ else {
72
+ p.y = distortion_y;
73
+ }
74
+ }
75
+ if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {
76
+ if(seed_y>0.){
77
+ p.x=distortion_x;
78
+ }
79
+ else {
80
+ p.x = 1. - (p.x + distortion_x);
81
+ }
82
+ }
83
+ p.x+=disp*seed_x*(seed/5.);
84
+ p.y+=disp*seed_y*(seed/5.);
85
+ //base from RGB shift shader
86
+ vec2 offset = amount * vec2( cos(angle), sin(angle));
87
+ vec4 cr = texture2D(tDiffuse, p + offset);
88
+ vec4 cga = texture2D(tDiffuse, p);
89
+ vec4 cb = texture2D(tDiffuse, p - offset);
90
+ gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);
91
+ //add noise
92
+ vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);
93
+ gl_FragColor = gl_FragColor+ snow;
94
+ }
95
+ else {
96
+ gl_FragColor=texture2D (tDiffuse, vUv);
97
+ }
98
+ }`};class I extends b{constructor(e=64){super();const t=ue;this.uniforms=o.UniformsUtils.clone(t.uniforms),this.heightMap=this.generateHeightmap(e),this.uniforms.tDisp.value=this.heightMap,this.material=new o.ShaderMaterial({uniforms:this.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader}),this.fsQuad=new w(this.material),this.goWild=!1,this.curF=0,this.generateTrigger()}render(e,t,a){this.uniforms.tDiffuse.value=a.texture,this.uniforms.seed.value=Math.random(),this.uniforms.byp.value=0,this.curF%this.randX==0||this.goWild==!0?(this.uniforms.amount.value=Math.random()/30,this.uniforms.angle.value=o.MathUtils.randFloat(-Math.PI,Math.PI),this.uniforms.seed_x.value=o.MathUtils.randFloat(-1,1),this.uniforms.seed_y.value=o.MathUtils.randFloat(-1,1),this.uniforms.distortion_x.value=o.MathUtils.randFloat(0,1),this.uniforms.distortion_y.value=o.MathUtils.randFloat(0,1),this.curF=0,this.generateTrigger()):this.curF%this.randX<this.randX/5?(this.uniforms.amount.value=Math.random()/90,this.uniforms.angle.value=o.MathUtils.randFloat(-Math.PI,Math.PI),this.uniforms.distortion_x.value=o.MathUtils.randFloat(0,1),this.uniforms.distortion_y.value=o.MathUtils.randFloat(0,1),this.uniforms.seed_x.value=o.MathUtils.randFloat(-.3,.3),this.uniforms.seed_y.value=o.MathUtils.randFloat(-.3,.3)):this.goWild==!1&&(this.uniforms.byp.value=1),this.curF++,this.renderToScreen?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(),this.fsQuad.render(e))}generateTrigger(){this.randX=o.MathUtils.randInt(120,240)}generateHeightmap(e){const t=new Float32Array(e*e),a=e*e;for(let i=0;i<a;i++){const r=o.MathUtils.randFloat(0,1);t[i]=r}const s=new o.DataTexture(t,e,e,o.RedFormat,o.FloatType);return s.needsUpdate=!0,s}dispose(){this.material.dispose(),this.heightMap.dispose(),this.fsQuad.dispose()}}const fe=n.defineComponent({__name:"Glitch",props:{dtSize:{},goWild:{type:Boolean}},setup(l,{expose:e}){const t=l,{pass:a}=A(()=>new I(t.dtSize),t);e({pass:a});const{onBeforeRender:s}=p.useLoop();return s(({invalidate:i})=>i()),y([[()=>t.goWild,"goWild"]],a,()=>new I),()=>{}}}),D={name:"HalftoneShader",uniforms:{tDiffuse:{value:null},shape:{value:1},radius:{value:4},rotateR:{value:Math.PI/12*1},rotateG:{value:Math.PI/12*2},rotateB:{value:Math.PI/12*3},scatter:{value:0},width:{value:1},height:{value:1},blending:{value:1},blendingMode:{value:1},greyscale:{value:!1},disable:{value:!1}},vertexShader:`
99
+
100
+ varying vec2 vUV;
101
+
102
+ void main() {
103
+
104
+ vUV = uv;
105
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
106
+
107
+ }`,fragmentShader:`
108
+
109
+ #define SQRT2_MINUS_ONE 0.41421356
110
+ #define SQRT2_HALF_MINUS_ONE 0.20710678
111
+ #define PI2 6.28318531
112
+ #define SHAPE_DOT 1
113
+ #define SHAPE_ELLIPSE 2
114
+ #define SHAPE_LINE 3
115
+ #define SHAPE_SQUARE 4
116
+ #define BLENDING_LINEAR 1
117
+ #define BLENDING_MULTIPLY 2
118
+ #define BLENDING_ADD 3
119
+ #define BLENDING_LIGHTER 4
120
+ #define BLENDING_DARKER 5
121
+ uniform sampler2D tDiffuse;
122
+ uniform float radius;
123
+ uniform float rotateR;
124
+ uniform float rotateG;
125
+ uniform float rotateB;
126
+ uniform float scatter;
127
+ uniform float width;
128
+ uniform float height;
129
+ uniform int shape;
130
+ uniform bool disable;
131
+ uniform float blending;
132
+ uniform int blendingMode;
133
+ varying vec2 vUV;
134
+ uniform bool greyscale;
135
+ const int samples = 8;
136
+
137
+ float blend( float a, float b, float t ) {
138
+
139
+ // linear blend
140
+ return a * ( 1.0 - t ) + b * t;
141
+
142
+ }
143
+
144
+ float hypot( float x, float y ) {
145
+
146
+ // vector magnitude
147
+ return sqrt( x * x + y * y );
148
+
149
+ }
150
+
151
+ float rand( vec2 seed ){
152
+
153
+ // get pseudo-random number
154
+ return fract( sin( dot( seed.xy, vec2( 12.9898, 78.233 ) ) ) * 43758.5453 );
155
+
156
+ }
157
+
158
+ float distanceToDotRadius( float channel, vec2 coord, vec2 normal, vec2 p, float angle, float rad_max ) {
159
+
160
+ // apply shape-specific transforms
161
+ float dist = hypot( coord.x - p.x, coord.y - p.y );
162
+ float rad = channel;
163
+
164
+ if ( shape == SHAPE_DOT ) {
165
+
166
+ rad = pow( abs( rad ), 1.125 ) * rad_max;
167
+
168
+ } else if ( shape == SHAPE_ELLIPSE ) {
169
+
170
+ rad = pow( abs( rad ), 1.125 ) * rad_max;
171
+
172
+ if ( dist != 0.0 ) {
173
+ float dot_p = abs( ( p.x - coord.x ) / dist * normal.x + ( p.y - coord.y ) / dist * normal.y );
174
+ dist = ( dist * ( 1.0 - SQRT2_HALF_MINUS_ONE ) ) + dot_p * dist * SQRT2_MINUS_ONE;
175
+ }
176
+
177
+ } else if ( shape == SHAPE_LINE ) {
178
+
179
+ rad = pow( abs( rad ), 1.5) * rad_max;
180
+ float dot_p = ( p.x - coord.x ) * normal.x + ( p.y - coord.y ) * normal.y;
181
+ dist = hypot( normal.x * dot_p, normal.y * dot_p );
182
+
183
+ } else if ( shape == SHAPE_SQUARE ) {
184
+
185
+ float theta = atan( p.y - coord.y, p.x - coord.x ) - angle;
186
+ float sin_t = abs( sin( theta ) );
187
+ float cos_t = abs( cos( theta ) );
188
+ rad = pow( abs( rad ), 1.4 );
189
+ rad = rad_max * ( rad + ( ( sin_t > cos_t ) ? rad - sin_t * rad : rad - cos_t * rad ) );
190
+
191
+ }
192
+
193
+ return rad - dist;
194
+
195
+ }
196
+
197
+ struct Cell {
198
+
199
+ // grid sample positions
200
+ vec2 normal;
201
+ vec2 p1;
202
+ vec2 p2;
203
+ vec2 p3;
204
+ vec2 p4;
205
+ float samp2;
206
+ float samp1;
207
+ float samp3;
208
+ float samp4;
209
+
210
+ };
211
+
212
+ vec4 getSample( vec2 point ) {
213
+
214
+ // multi-sampled point
215
+ vec4 tex = texture2D( tDiffuse, vec2( point.x / width, point.y / height ) );
216
+ float base = rand( vec2( floor( point.x ), floor( point.y ) ) ) * PI2;
217
+ float step = PI2 / float( samples );
218
+ float dist = radius * 0.66;
219
+
220
+ for ( int i = 0; i < samples; ++i ) {
221
+
222
+ float r = base + step * float( i );
223
+ vec2 coord = point + vec2( cos( r ) * dist, sin( r ) * dist );
224
+ tex += texture2D( tDiffuse, vec2( coord.x / width, coord.y / height ) );
225
+
226
+ }
227
+
228
+ tex /= float( samples ) + 1.0;
229
+ return tex;
230
+
231
+ }
232
+
233
+ float getDotColour( Cell c, vec2 p, int channel, float angle, float aa ) {
234
+
235
+ // get colour for given point
236
+ float dist_c_1, dist_c_2, dist_c_3, dist_c_4, res;
237
+
238
+ if ( channel == 0 ) {
239
+
240
+ c.samp1 = getSample( c.p1 ).r;
241
+ c.samp2 = getSample( c.p2 ).r;
242
+ c.samp3 = getSample( c.p3 ).r;
243
+ c.samp4 = getSample( c.p4 ).r;
244
+
245
+ } else if (channel == 1) {
246
+
247
+ c.samp1 = getSample( c.p1 ).g;
248
+ c.samp2 = getSample( c.p2 ).g;
249
+ c.samp3 = getSample( c.p3 ).g;
250
+ c.samp4 = getSample( c.p4 ).g;
251
+
252
+ } else {
253
+
254
+ c.samp1 = getSample( c.p1 ).b;
255
+ c.samp3 = getSample( c.p3 ).b;
256
+ c.samp2 = getSample( c.p2 ).b;
257
+ c.samp4 = getSample( c.p4 ).b;
258
+
259
+ }
260
+
261
+ dist_c_1 = distanceToDotRadius( c.samp1, c.p1, c.normal, p, angle, radius );
262
+ dist_c_2 = distanceToDotRadius( c.samp2, c.p2, c.normal, p, angle, radius );
263
+ dist_c_3 = distanceToDotRadius( c.samp3, c.p3, c.normal, p, angle, radius );
264
+ dist_c_4 = distanceToDotRadius( c.samp4, c.p4, c.normal, p, angle, radius );
265
+ res = ( dist_c_1 > 0.0 ) ? clamp( dist_c_1 / aa, 0.0, 1.0 ) : 0.0;
266
+ res += ( dist_c_2 > 0.0 ) ? clamp( dist_c_2 / aa, 0.0, 1.0 ) : 0.0;
267
+ res += ( dist_c_3 > 0.0 ) ? clamp( dist_c_3 / aa, 0.0, 1.0 ) : 0.0;
268
+ res += ( dist_c_4 > 0.0 ) ? clamp( dist_c_4 / aa, 0.0, 1.0 ) : 0.0;
269
+ res = clamp( res, 0.0, 1.0 );
270
+
271
+ return res;
272
+
273
+ }
274
+
275
+ Cell getReferenceCell( vec2 p, vec2 origin, float grid_angle, float step ) {
276
+
277
+ // get containing cell
278
+ Cell c;
279
+
280
+ // calc grid
281
+ vec2 n = vec2( cos( grid_angle ), sin( grid_angle ) );
282
+ float threshold = step * 0.5;
283
+ float dot_normal = n.x * ( p.x - origin.x ) + n.y * ( p.y - origin.y );
284
+ float dot_line = -n.y * ( p.x - origin.x ) + n.x * ( p.y - origin.y );
285
+ vec2 offset = vec2( n.x * dot_normal, n.y * dot_normal );
286
+ float offset_normal = mod( hypot( offset.x, offset.y ), step );
287
+ float normal_dir = ( dot_normal < 0.0 ) ? 1.0 : -1.0;
288
+ float normal_scale = ( ( offset_normal < threshold ) ? -offset_normal : step - offset_normal ) * normal_dir;
289
+ float offset_line = mod( hypot( ( p.x - offset.x ) - origin.x, ( p.y - offset.y ) - origin.y ), step );
290
+ float line_dir = ( dot_line < 0.0 ) ? 1.0 : -1.0;
291
+ float line_scale = ( ( offset_line < threshold ) ? -offset_line : step - offset_line ) * line_dir;
292
+
293
+ // get closest corner
294
+ c.normal = n;
295
+ c.p1.x = p.x - n.x * normal_scale + n.y * line_scale;
296
+ c.p1.y = p.y - n.y * normal_scale - n.x * line_scale;
297
+
298
+ // scatter
299
+ if ( scatter != 0.0 ) {
300
+
301
+ float off_mag = scatter * threshold * 0.5;
302
+ float off_angle = rand( vec2( floor( c.p1.x ), floor( c.p1.y ) ) ) * PI2;
303
+ c.p1.x += cos( off_angle ) * off_mag;
304
+ c.p1.y += sin( off_angle ) * off_mag;
305
+
306
+ }
307
+
308
+ // find corners
309
+ float normal_step = normal_dir * ( ( offset_normal < threshold ) ? step : -step );
310
+ float line_step = line_dir * ( ( offset_line < threshold ) ? step : -step );
311
+ c.p2.x = c.p1.x - n.x * normal_step;
312
+ c.p2.y = c.p1.y - n.y * normal_step;
313
+ c.p3.x = c.p1.x + n.y * line_step;
314
+ c.p3.y = c.p1.y - n.x * line_step;
315
+ c.p4.x = c.p1.x - n.x * normal_step + n.y * line_step;
316
+ c.p4.y = c.p1.y - n.y * normal_step - n.x * line_step;
317
+
318
+ return c;
319
+
320
+ }
321
+
322
+ float blendColour( float a, float b, float t ) {
323
+
324
+ // blend colours
325
+ if ( blendingMode == BLENDING_LINEAR ) {
326
+ return blend( a, b, 1.0 - t );
327
+ } else if ( blendingMode == BLENDING_ADD ) {
328
+ return blend( a, min( 1.0, a + b ), t );
329
+ } else if ( blendingMode == BLENDING_MULTIPLY ) {
330
+ return blend( a, max( 0.0, a * b ), t );
331
+ } else if ( blendingMode == BLENDING_LIGHTER ) {
332
+ return blend( a, max( a, b ), t );
333
+ } else if ( blendingMode == BLENDING_DARKER ) {
334
+ return blend( a, min( a, b ), t );
335
+ } else {
336
+ return blend( a, b, 1.0 - t );
337
+ }
338
+
339
+ }
340
+
341
+ void main() {
342
+
343
+ if ( ! disable ) {
344
+
345
+ // setup
346
+ vec2 p = vec2( vUV.x * width, vUV.y * height );
347
+ vec2 origin = vec2( 0, 0 );
348
+ float aa = ( radius < 2.5 ) ? radius * 0.5 : 1.25;
349
+
350
+ // get channel samples
351
+ Cell cell_r = getReferenceCell( p, origin, rotateR, radius );
352
+ Cell cell_g = getReferenceCell( p, origin, rotateG, radius );
353
+ Cell cell_b = getReferenceCell( p, origin, rotateB, radius );
354
+ float r = getDotColour( cell_r, p, 0, rotateR, aa );
355
+ float g = getDotColour( cell_g, p, 1, rotateG, aa );
356
+ float b = getDotColour( cell_b, p, 2, rotateB, aa );
357
+
358
+ // blend with original
359
+ vec4 colour = texture2D( tDiffuse, vUV );
360
+ r = blendColour( r, colour.r, blending );
361
+ g = blendColour( g, colour.g, blending );
362
+ b = blendColour( b, colour.b, blending );
363
+
364
+ if ( greyscale ) {
365
+ r = g = b = (r + b + g) / 3.0;
366
+ }
367
+
368
+ gl_FragColor = vec4( r, g, b, 1.0 );
369
+
370
+ } else {
371
+
372
+ gl_FragColor = texture2D( tDiffuse, vUV );
373
+
374
+ }
375
+
376
+ }`};class ce extends b{constructor(e,t,a){super(),this.uniforms=o.UniformsUtils.clone(D.uniforms),this.material=new o.ShaderMaterial({uniforms:this.uniforms,fragmentShader:D.fragmentShader,vertexShader:D.vertexShader}),this.uniforms.width.value=e,this.uniforms.height.value=t;for(const s in a)a.hasOwnProperty(s)&&this.uniforms.hasOwnProperty(s)&&(this.uniforms[s].value=a[s]);this.fsQuad=new w(this.material)}render(e,t,a){this.material.uniforms.tDiffuse.value=a.texture,this.renderToScreen?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(),this.fsQuad.render(e))}setSize(e,t){this.uniforms.width.value=e,this.uniforms.height.value=t}dispose(){this.material.dispose(),this.fsQuad.dispose()}}const he=n.defineComponent({__name:"Halftone",props:{shape:{},radius:{},rotateR:{},rotateG:{},rotateB:{},scatter:{},blending:{},greyscale:{type:Boolean},blendingMode:{}},setup(l,{expose:e}){const t=l,{sizes:a}=p.useTresContext(),s=n.computed(()=>Object.fromEntries(Object.entries(t).filter(([r,d])=>d!==void 0))),{pass:i}=A(()=>new ce(a.width.value,a.height.value,s.value),t);return e({pass:i}),n.watchEffect(()=>{i.value.setSize(a.width.value,a.height.value)}),n.watchEffect(()=>{Object.entries(t).forEach(([r,d])=>{r in i.value.uniforms&&(i.value.uniforms[r].value=d??D.uniforms[r].value)})}),()=>{}}});class V extends b{constructor(e,t,a,s={}){super(),this.pixelSize=e,this.resolution=new o.Vector2,this.renderResolution=new o.Vector2,this.pixelatedMaterial=this.createPixelatedMaterial(),this.normalMaterial=new o.MeshNormalMaterial,this.fsQuad=new w(this.pixelatedMaterial),this.scene=t,this.camera=a,this.normalEdgeStrength=s.normalEdgeStrength||.3,this.depthEdgeStrength=s.depthEdgeStrength||.4,this.beautyRenderTarget=new o.WebGLRenderTarget,this.beautyRenderTarget.texture.minFilter=o.NearestFilter,this.beautyRenderTarget.texture.magFilter=o.NearestFilter,this.beautyRenderTarget.texture.type=o.HalfFloatType,this.beautyRenderTarget.depthTexture=new o.DepthTexture,this.normalRenderTarget=new o.WebGLRenderTarget,this.normalRenderTarget.texture.minFilter=o.NearestFilter,this.normalRenderTarget.texture.magFilter=o.NearestFilter,this.normalRenderTarget.texture.type=o.HalfFloatType}dispose(){this.beautyRenderTarget.dispose(),this.normalRenderTarget.dispose(),this.pixelatedMaterial.dispose(),this.normalMaterial.dispose(),this.fsQuad.dispose()}setSize(e,t){this.resolution.set(e,t),this.renderResolution.set(e/this.pixelSize|0,t/this.pixelSize|0);const{x:a,y:s}=this.renderResolution;this.beautyRenderTarget.setSize(a,s),this.normalRenderTarget.setSize(a,s),this.fsQuad.material.uniforms.resolution.value.set(a,s,1/a,1/s)}setPixelSize(e){this.pixelSize=e,this.setSize(this.resolution.x,this.resolution.y)}render(e,t){const a=this.fsQuad.material.uniforms;a.normalEdgeStrength.value=this.normalEdgeStrength,a.depthEdgeStrength.value=this.depthEdgeStrength,e.setRenderTarget(this.beautyRenderTarget),e.render(this.scene,this.camera);const s=this.scene.overrideMaterial;e.setRenderTarget(this.normalRenderTarget),this.scene.overrideMaterial=this.normalMaterial,e.render(this.scene,this.camera),this.scene.overrideMaterial=s,a.tDiffuse.value=this.beautyRenderTarget.texture,a.tDepth.value=this.beautyRenderTarget.depthTexture,a.tNormal.value=this.normalRenderTarget.texture,this.renderToScreen?e.setRenderTarget(null):(e.setRenderTarget(t),this.clear&&e.clear()),this.fsQuad.render(e)}createPixelatedMaterial(){return new o.ShaderMaterial({uniforms:{tDiffuse:{value:null},tDepth:{value:null},tNormal:{value:null},resolution:{value:new o.Vector4(this.renderResolution.x,this.renderResolution.y,1/this.renderResolution.x,1/this.renderResolution.y)},normalEdgeStrength:{value:0},depthEdgeStrength:{value:0}},vertexShader:`
377
+ varying vec2 vUv;
378
+
379
+ void main() {
380
+
381
+ vUv = uv;
382
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
383
+
384
+ }
385
+ `,fragmentShader:`
386
+ uniform sampler2D tDiffuse;
387
+ uniform sampler2D tDepth;
388
+ uniform sampler2D tNormal;
389
+ uniform vec4 resolution;
390
+ uniform float normalEdgeStrength;
391
+ uniform float depthEdgeStrength;
392
+ varying vec2 vUv;
393
+
394
+ float getDepth(int x, int y) {
395
+
396
+ return texture2D( tDepth, vUv + vec2(x, y) * resolution.zw ).r;
397
+
398
+ }
399
+
400
+ vec3 getNormal(int x, int y) {
401
+
402
+ return texture2D( tNormal, vUv + vec2(x, y) * resolution.zw ).rgb * 2.0 - 1.0;
403
+
404
+ }
405
+
406
+ float depthEdgeIndicator(float depth, vec3 normal) {
407
+
408
+ float diff = 0.0;
409
+ diff += clamp(getDepth(1, 0) - depth, 0.0, 1.0);
410
+ diff += clamp(getDepth(-1, 0) - depth, 0.0, 1.0);
411
+ diff += clamp(getDepth(0, 1) - depth, 0.0, 1.0);
412
+ diff += clamp(getDepth(0, -1) - depth, 0.0, 1.0);
413
+ return floor(smoothstep(0.01, 0.02, diff) * 2.) / 2.;
414
+
415
+ }
416
+
417
+ float neighborNormalEdgeIndicator(int x, int y, float depth, vec3 normal) {
418
+
419
+ float depthDiff = getDepth(x, y) - depth;
420
+ vec3 neighborNormal = getNormal(x, y);
421
+
422
+ // Edge pixels should yield to faces who's normals are closer to the bias normal.
423
+ vec3 normalEdgeBias = vec3(1., 1., 1.); // This should probably be a parameter.
424
+ float normalDiff = dot(normal - neighborNormal, normalEdgeBias);
425
+ float normalIndicator = clamp(smoothstep(-.01, .01, normalDiff), 0.0, 1.0);
426
+
427
+ // Only the shallower pixel should detect the normal edge.
428
+ float depthIndicator = clamp(sign(depthDiff * .25 + .0025), 0.0, 1.0);
429
+
430
+ return (1.0 - dot(normal, neighborNormal)) * depthIndicator * normalIndicator;
431
+
432
+ }
433
+
434
+ float normalEdgeIndicator(float depth, vec3 normal) {
435
+
436
+ float indicator = 0.0;
437
+
438
+ indicator += neighborNormalEdgeIndicator(0, -1, depth, normal);
439
+ indicator += neighborNormalEdgeIndicator(0, 1, depth, normal);
440
+ indicator += neighborNormalEdgeIndicator(-1, 0, depth, normal);
441
+ indicator += neighborNormalEdgeIndicator(1, 0, depth, normal);
442
+
443
+ return step(0.1, indicator);
444
+
445
+ }
446
+
447
+ void main() {
448
+
449
+ vec4 texel = texture2D( tDiffuse, vUv );
450
+
451
+ float depth = 0.0;
452
+ vec3 normal = vec3(0.0);
453
+
454
+ if (depthEdgeStrength > 0.0 || normalEdgeStrength > 0.0) {
455
+
456
+ depth = getDepth(0, 0);
457
+ normal = getNormal(0, 0);
458
+
459
+ }
460
+
461
+ float dei = 0.0;
462
+ if (depthEdgeStrength > 0.0)
463
+ dei = depthEdgeIndicator(depth, normal);
464
+
465
+ float nei = 0.0;
466
+ if (normalEdgeStrength > 0.0)
467
+ nei = normalEdgeIndicator(depth, normal);
468
+
469
+ float Strength = dei > 0.0 ? (1.0 - depthEdgeStrength * dei) : (1.0 + normalEdgeStrength * nei);
470
+
471
+ gl_FragColor = texel * Strength;
472
+
473
+ }
474
+ `})}}const me=n.defineComponent({__name:"Pixelation",props:{pixelSize:{},depthEdgeStrength:{},normalEdgeStrength:{}},setup(l,{expose:e}){const t=l,{scene:a,camera:s}=p.useTresContext(),{pass:i}=A(()=>new V(t.pixelSize,a.value,s.value),t);return e({pass:i}),n.watchEffect(()=>{i.value.setPixelSize(t.pixelSize)}),y([[()=>t.depthEdgeStrength,"depthEdgeStrength"],[()=>t.normalEdgeStrength,"normalEdgeStrength"]],i,()=>new V(1,a.value,s.value)),()=>{}}}),pe={name:"OutputShader",uniforms:{tDiffuse:{value:null},toneMappingExposure:{value:1}},vertexShader:`
475
+ precision highp float;
476
+
477
+ uniform mat4 modelViewMatrix;
478
+ uniform mat4 projectionMatrix;
479
+
480
+ attribute vec3 position;
481
+ attribute vec2 uv;
482
+
483
+ varying vec2 vUv;
484
+
485
+ void main() {
486
+
487
+ vUv = uv;
488
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
489
+
490
+ }`,fragmentShader:`
491
+
492
+ precision highp float;
493
+
494
+ uniform sampler2D tDiffuse;
495
+
496
+ #include <tonemapping_pars_fragment>
497
+ #include <colorspace_pars_fragment>
498
+
499
+ varying vec2 vUv;
500
+
501
+ void main() {
502
+
503
+ gl_FragColor = texture2D( tDiffuse, vUv );
504
+
505
+ // tone mapping
506
+
507
+ #ifdef LINEAR_TONE_MAPPING
508
+
509
+ gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );
510
+
511
+ #elif defined( REINHARD_TONE_MAPPING )
512
+
513
+ gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );
514
+
515
+ #elif defined( CINEON_TONE_MAPPING )
516
+
517
+ gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );
518
+
519
+ #elif defined( ACES_FILMIC_TONE_MAPPING )
520
+
521
+ gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );
522
+
523
+ #elif defined( AGX_TONE_MAPPING )
524
+
525
+ gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );
526
+
527
+ #elif defined( NEUTRAL_TONE_MAPPING )
528
+
529
+ gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );
530
+
531
+ #endif
532
+
533
+ // color space
534
+
535
+ #ifdef SRGB_TRANSFER
536
+
537
+ gl_FragColor = sRGBTransferOETF( gl_FragColor );
538
+
539
+ #endif
540
+
541
+ }`};class ge extends b{constructor(){super();const e=pe;this.uniforms=o.UniformsUtils.clone(e.uniforms),this.material=new o.RawShaderMaterial({name:e.name,uniforms:this.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader}),this.fsQuad=new w(this.material),this._outputColorSpace=null,this._toneMapping=null}render(e,t,a){this.uniforms.tDiffuse.value=a.texture,this.uniforms.toneMappingExposure.value=e.toneMappingExposure,(this._outputColorSpace!==e.outputColorSpace||this._toneMapping!==e.toneMapping)&&(this._outputColorSpace=e.outputColorSpace,this._toneMapping=e.toneMapping,this.material.defines={},o.ColorManagement.getTransfer(this._outputColorSpace)===o.SRGBTransfer&&(this.material.defines.SRGB_TRANSFER=""),this._toneMapping===o.LinearToneMapping?this.material.defines.LINEAR_TONE_MAPPING="":this._toneMapping===o.ReinhardToneMapping?this.material.defines.REINHARD_TONE_MAPPING="":this._toneMapping===o.CineonToneMapping?this.material.defines.CINEON_TONE_MAPPING="":this._toneMapping===o.ACESFilmicToneMapping?this.material.defines.ACES_FILMIC_TONE_MAPPING="":this._toneMapping===o.AgXToneMapping?this.material.defines.AGX_TONE_MAPPING="":this._toneMapping===o.NeutralToneMapping&&(this.material.defines.NEUTRAL_TONE_MAPPING=""),this.material.needsUpdate=!0),this.renderToScreen===!0?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this.fsQuad.render(e))}dispose(){this.material.dispose(),this.fsQuad.dispose()}}const ve=n.defineComponent({__name:"Output",setup(l,{expose:e}){const{pass:t}=A(()=>new ge);return e({pass:t}),()=>{}}}),L={name:"SMAAEdgesShader",defines:{SMAA_THRESHOLD:"0.1"},uniforms:{tDiffuse:{value:null},resolution:{value:new o.Vector2(1/1024,1/512)}},vertexShader:`
542
+
543
+ uniform vec2 resolution;
544
+
545
+ varying vec2 vUv;
546
+ varying vec4 vOffset[ 3 ];
547
+
548
+ void SMAAEdgeDetectionVS( vec2 texcoord ) {
549
+ vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component
550
+ vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component
551
+ vOffset[ 2 ] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0, 2.0 ); // WebGL port note: Changed sign in W component
552
+ }
553
+
554
+ void main() {
555
+
556
+ vUv = uv;
557
+
558
+ SMAAEdgeDetectionVS( vUv );
559
+
560
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
561
+
562
+ }`,fragmentShader:`
563
+
564
+ uniform sampler2D tDiffuse;
565
+
566
+ varying vec2 vUv;
567
+ varying vec4 vOffset[ 3 ];
568
+
569
+ vec4 SMAAColorEdgeDetectionPS( vec2 texcoord, vec4 offset[3], sampler2D colorTex ) {
570
+ vec2 threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD );
571
+
572
+ // Calculate color deltas:
573
+ vec4 delta;
574
+ vec3 C = texture2D( colorTex, texcoord ).rgb;
575
+
576
+ vec3 Cleft = texture2D( colorTex, offset[0].xy ).rgb;
577
+ vec3 t = abs( C - Cleft );
578
+ delta.x = max( max( t.r, t.g ), t.b );
579
+
580
+ vec3 Ctop = texture2D( colorTex, offset[0].zw ).rgb;
581
+ t = abs( C - Ctop );
582
+ delta.y = max( max( t.r, t.g ), t.b );
583
+
584
+ // We do the usual threshold:
585
+ vec2 edges = step( threshold, delta.xy );
586
+
587
+ // Then discard if there is no edge:
588
+ if ( dot( edges, vec2( 1.0, 1.0 ) ) == 0.0 )
589
+ discard;
590
+
591
+ // Calculate right and bottom deltas:
592
+ vec3 Cright = texture2D( colorTex, offset[1].xy ).rgb;
593
+ t = abs( C - Cright );
594
+ delta.z = max( max( t.r, t.g ), t.b );
595
+
596
+ vec3 Cbottom = texture2D( colorTex, offset[1].zw ).rgb;
597
+ t = abs( C - Cbottom );
598
+ delta.w = max( max( t.r, t.g ), t.b );
599
+
600
+ // Calculate the maximum delta in the direct neighborhood:
601
+ float maxDelta = max( max( max( delta.x, delta.y ), delta.z ), delta.w );
602
+
603
+ // Calculate left-left and top-top deltas:
604
+ vec3 Cleftleft = texture2D( colorTex, offset[2].xy ).rgb;
605
+ t = abs( C - Cleftleft );
606
+ delta.z = max( max( t.r, t.g ), t.b );
607
+
608
+ vec3 Ctoptop = texture2D( colorTex, offset[2].zw ).rgb;
609
+ t = abs( C - Ctoptop );
610
+ delta.w = max( max( t.r, t.g ), t.b );
611
+
612
+ // Calculate the final maximum delta:
613
+ maxDelta = max( max( maxDelta, delta.z ), delta.w );
614
+
615
+ // Local contrast adaptation in action:
616
+ edges.xy *= step( 0.5 * maxDelta, delta.xy );
617
+
618
+ return vec4( edges, 0.0, 0.0 );
619
+ }
620
+
621
+ void main() {
622
+
623
+ gl_FragColor = SMAAColorEdgeDetectionPS( vUv, vOffset, tDiffuse );
624
+
625
+ }`},P={name:"SMAAWeightsShader",defines:{SMAA_MAX_SEARCH_STEPS:"8",SMAA_AREATEX_MAX_DISTANCE:"16",SMAA_AREATEX_PIXEL_SIZE:"( 1.0 / vec2( 160.0, 560.0 ) )",SMAA_AREATEX_SUBTEX_SIZE:"( 1.0 / 7.0 )"},uniforms:{tDiffuse:{value:null},tArea:{value:null},tSearch:{value:null},resolution:{value:new o.Vector2(1/1024,1/512)}},vertexShader:`
626
+
627
+ uniform vec2 resolution;
628
+
629
+ varying vec2 vUv;
630
+ varying vec4 vOffset[ 3 ];
631
+ varying vec2 vPixcoord;
632
+
633
+ void SMAABlendingWeightCalculationVS( vec2 texcoord ) {
634
+ vPixcoord = texcoord / resolution;
635
+
636
+ // We will use these offsets for the searches later on (see @PSEUDO_GATHER4):
637
+ vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.25, 0.125, 1.25, 0.125 ); // WebGL port note: Changed sign in Y and W components
638
+ vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.125, 0.25, -0.125, -1.25 ); // WebGL port note: Changed sign in Y and W components
639
+
640
+ // And these for the searches, they indicate the ends of the loops:
641
+ vOffset[ 2 ] = vec4( vOffset[ 0 ].xz, vOffset[ 1 ].yw ) + vec4( -2.0, 2.0, -2.0, 2.0 ) * resolution.xxyy * float( SMAA_MAX_SEARCH_STEPS );
642
+
643
+ }
644
+
645
+ void main() {
646
+
647
+ vUv = uv;
648
+
649
+ SMAABlendingWeightCalculationVS( vUv );
650
+
651
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
652
+
653
+ }`,fragmentShader:`
654
+
655
+ #define SMAASampleLevelZeroOffset( tex, coord, offset ) texture2D( tex, coord + float( offset ) * resolution, 0.0 )
656
+
657
+ uniform sampler2D tDiffuse;
658
+ uniform sampler2D tArea;
659
+ uniform sampler2D tSearch;
660
+ uniform vec2 resolution;
661
+
662
+ varying vec2 vUv;
663
+ varying vec4 vOffset[3];
664
+ varying vec2 vPixcoord;
665
+
666
+ #if __VERSION__ == 100
667
+ vec2 round( vec2 x ) {
668
+ return sign( x ) * floor( abs( x ) + 0.5 );
669
+ }
670
+ #endif
671
+
672
+ float SMAASearchLength( sampler2D searchTex, vec2 e, float bias, float scale ) {
673
+ // Not required if searchTex accesses are set to point:
674
+ // float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);
675
+ // e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +
676
+ // e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;
677
+ e.r = bias + e.r * scale;
678
+ return 255.0 * texture2D( searchTex, e, 0.0 ).r;
679
+ }
680
+
681
+ float SMAASearchXLeft( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
682
+ /**
683
+ * @PSEUDO_GATHER4
684
+ * This texcoord has been offset by (-0.25, -0.125) in the vertex shader to
685
+ * sample between edge, thus fetching four edges in a row.
686
+ * Sampling with different offsets in each direction allows to disambiguate
687
+ * which edges are active from the four fetched ones.
688
+ */
689
+ vec2 e = vec2( 0.0, 1.0 );
690
+
691
+ for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
692
+ e = texture2D( edgesTex, texcoord, 0.0 ).rg;
693
+ texcoord -= vec2( 2.0, 0.0 ) * resolution;
694
+ if ( ! ( texcoord.x > end && e.g > 0.8281 && e.r == 0.0 ) ) break;
695
+ }
696
+
697
+ // We correct the previous (-0.25, -0.125) offset we applied:
698
+ texcoord.x += 0.25 * resolution.x;
699
+
700
+ // The searches are bias by 1, so adjust the coords accordingly:
701
+ texcoord.x += resolution.x;
702
+
703
+ // Disambiguate the length added by the last step:
704
+ texcoord.x += 2.0 * resolution.x; // Undo last step
705
+ texcoord.x -= resolution.x * SMAASearchLength(searchTex, e, 0.0, 0.5);
706
+
707
+ return texcoord.x;
708
+ }
709
+
710
+ float SMAASearchXRight( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
711
+ vec2 e = vec2( 0.0, 1.0 );
712
+
713
+ for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
714
+ e = texture2D( edgesTex, texcoord, 0.0 ).rg;
715
+ texcoord += vec2( 2.0, 0.0 ) * resolution;
716
+ if ( ! ( texcoord.x < end && e.g > 0.8281 && e.r == 0.0 ) ) break;
717
+ }
718
+
719
+ texcoord.x -= 0.25 * resolution.x;
720
+ texcoord.x -= resolution.x;
721
+ texcoord.x -= 2.0 * resolution.x;
722
+ texcoord.x += resolution.x * SMAASearchLength( searchTex, e, 0.5, 0.5 );
723
+
724
+ return texcoord.x;
725
+ }
726
+
727
+ float SMAASearchYUp( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
728
+ vec2 e = vec2( 1.0, 0.0 );
729
+
730
+ for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
731
+ e = texture2D( edgesTex, texcoord, 0.0 ).rg;
732
+ texcoord += vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign
733
+ if ( ! ( texcoord.y > end && e.r > 0.8281 && e.g == 0.0 ) ) break;
734
+ }
735
+
736
+ texcoord.y -= 0.25 * resolution.y; // WebGL port note: Changed sign
737
+ texcoord.y -= resolution.y; // WebGL port note: Changed sign
738
+ texcoord.y -= 2.0 * resolution.y; // WebGL port note: Changed sign
739
+ texcoord.y += resolution.y * SMAASearchLength( searchTex, e.gr, 0.0, 0.5 ); // WebGL port note: Changed sign
740
+
741
+ return texcoord.y;
742
+ }
743
+
744
+ float SMAASearchYDown( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
745
+ vec2 e = vec2( 1.0, 0.0 );
746
+
747
+ for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
748
+ e = texture2D( edgesTex, texcoord, 0.0 ).rg;
749
+ texcoord -= vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign
750
+ if ( ! ( texcoord.y < end && e.r > 0.8281 && e.g == 0.0 ) ) break;
751
+ }
752
+
753
+ texcoord.y += 0.25 * resolution.y; // WebGL port note: Changed sign
754
+ texcoord.y += resolution.y; // WebGL port note: Changed sign
755
+ texcoord.y += 2.0 * resolution.y; // WebGL port note: Changed sign
756
+ texcoord.y -= resolution.y * SMAASearchLength( searchTex, e.gr, 0.5, 0.5 ); // WebGL port note: Changed sign
757
+
758
+ return texcoord.y;
759
+ }
760
+
761
+ vec2 SMAAArea( sampler2D areaTex, vec2 dist, float e1, float e2, float offset ) {
762
+ // Rounding prevents precision errors of bilinear filtering:
763
+ vec2 texcoord = float( SMAA_AREATEX_MAX_DISTANCE ) * round( 4.0 * vec2( e1, e2 ) ) + dist;
764
+
765
+ // We do a scale and bias for mapping to texel space:
766
+ texcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + ( 0.5 * SMAA_AREATEX_PIXEL_SIZE );
767
+
768
+ // Move to proper place, according to the subpixel offset:
769
+ texcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;
770
+
771
+ return texture2D( areaTex, texcoord, 0.0 ).rg;
772
+ }
773
+
774
+ vec4 SMAABlendingWeightCalculationPS( vec2 texcoord, vec2 pixcoord, vec4 offset[ 3 ], sampler2D edgesTex, sampler2D areaTex, sampler2D searchTex, ivec4 subsampleIndices ) {
775
+ vec4 weights = vec4( 0.0, 0.0, 0.0, 0.0 );
776
+
777
+ vec2 e = texture2D( edgesTex, texcoord ).rg;
778
+
779
+ if ( e.g > 0.0 ) { // Edge at north
780
+ vec2 d;
781
+
782
+ // Find the distance to the left:
783
+ vec2 coords;
784
+ coords.x = SMAASearchXLeft( edgesTex, searchTex, offset[ 0 ].xy, offset[ 2 ].x );
785
+ coords.y = offset[ 1 ].y; // offset[1].y = texcoord.y - 0.25 * resolution.y (@CROSSING_OFFSET)
786
+ d.x = coords.x;
787
+
788
+ // Now fetch the left crossing edges, two at a time using bilinear
789
+ // filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to
790
+ // discern what value each edge has:
791
+ float e1 = texture2D( edgesTex, coords, 0.0 ).r;
792
+
793
+ // Find the distance to the right:
794
+ coords.x = SMAASearchXRight( edgesTex, searchTex, offset[ 0 ].zw, offset[ 2 ].y );
795
+ d.y = coords.x;
796
+
797
+ // We want the distances to be in pixel units (doing this here allow to
798
+ // better interleave arithmetic and memory accesses):
799
+ d = d / resolution.x - pixcoord.x;
800
+
801
+ // SMAAArea below needs a sqrt, as the areas texture is compressed
802
+ // quadratically:
803
+ vec2 sqrt_d = sqrt( abs( d ) );
804
+
805
+ // Fetch the right crossing edges:
806
+ coords.y -= 1.0 * resolution.y; // WebGL port note: Added
807
+ float e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 1, 0 ) ).r;
808
+
809
+ // Ok, we know how this pattern looks like, now it is time for getting
810
+ // the actual area:
811
+ weights.rg = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.y ) );
812
+ }
813
+
814
+ if ( e.r > 0.0 ) { // Edge at west
815
+ vec2 d;
816
+
817
+ // Find the distance to the top:
818
+ vec2 coords;
819
+
820
+ coords.y = SMAASearchYUp( edgesTex, searchTex, offset[ 1 ].xy, offset[ 2 ].z );
821
+ coords.x = offset[ 0 ].x; // offset[1].x = texcoord.x - 0.25 * resolution.x;
822
+ d.x = coords.y;
823
+
824
+ // Fetch the top crossing edges:
825
+ float e1 = texture2D( edgesTex, coords, 0.0 ).g;
826
+
827
+ // Find the distance to the bottom:
828
+ coords.y = SMAASearchYDown( edgesTex, searchTex, offset[ 1 ].zw, offset[ 2 ].w );
829
+ d.y = coords.y;
830
+
831
+ // We want the distances to be in pixel units:
832
+ d = d / resolution.y - pixcoord.y;
833
+
834
+ // SMAAArea below needs a sqrt, as the areas texture is compressed
835
+ // quadratically:
836
+ vec2 sqrt_d = sqrt( abs( d ) );
837
+
838
+ // Fetch the bottom crossing edges:
839
+ coords.y -= 1.0 * resolution.y; // WebGL port note: Added
840
+ float e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 0, 1 ) ).g;
841
+
842
+ // Get the area for this direction:
843
+ weights.ba = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.x ) );
844
+ }
845
+
846
+ return weights;
847
+ }
848
+
849
+ void main() {
850
+
851
+ gl_FragColor = SMAABlendingWeightCalculationPS( vUv, vPixcoord, vOffset, tDiffuse, tArea, tSearch, ivec4( 0.0 ) );
852
+
853
+ }`},N={name:"SMAABlendShader",uniforms:{tDiffuse:{value:null},tColor:{value:null},resolution:{value:new o.Vector2(1/1024,1/512)}},vertexShader:`
854
+
855
+ uniform vec2 resolution;
856
+
857
+ varying vec2 vUv;
858
+ varying vec4 vOffset[ 2 ];
859
+
860
+ void SMAANeighborhoodBlendingVS( vec2 texcoord ) {
861
+ vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component
862
+ vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component
863
+ }
864
+
865
+ void main() {
866
+
867
+ vUv = uv;
868
+
869
+ SMAANeighborhoodBlendingVS( vUv );
870
+
871
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
872
+
873
+ }`,fragmentShader:`
874
+
875
+ uniform sampler2D tDiffuse;
876
+ uniform sampler2D tColor;
877
+ uniform vec2 resolution;
878
+
879
+ varying vec2 vUv;
880
+ varying vec4 vOffset[ 2 ];
881
+
882
+ vec4 SMAANeighborhoodBlendingPS( vec2 texcoord, vec4 offset[ 2 ], sampler2D colorTex, sampler2D blendTex ) {
883
+ // Fetch the blending weights for current pixel:
884
+ vec4 a;
885
+ a.xz = texture2D( blendTex, texcoord ).xz;
886
+ a.y = texture2D( blendTex, offset[ 1 ].zw ).g;
887
+ a.w = texture2D( blendTex, offset[ 1 ].xy ).a;
888
+
889
+ // Is there any blending weight with a value greater than 0.0?
890
+ if ( dot(a, vec4( 1.0, 1.0, 1.0, 1.0 )) < 1e-5 ) {
891
+ return texture2D( colorTex, texcoord, 0.0 );
892
+ } else {
893
+ // Up to 4 lines can be crossing a pixel (one through each edge). We
894
+ // favor blending by choosing the line with the maximum weight for each
895
+ // direction:
896
+ vec2 offset;
897
+ offset.x = a.a > a.b ? a.a : -a.b; // left vs. right
898
+ offset.y = a.g > a.r ? -a.g : a.r; // top vs. bottom // WebGL port note: Changed signs
899
+
900
+ // Then we go in the direction that has the maximum weight:
901
+ if ( abs( offset.x ) > abs( offset.y )) { // horizontal vs. vertical
902
+ offset.y = 0.0;
903
+ } else {
904
+ offset.x = 0.0;
905
+ }
906
+
907
+ // Fetch the opposite color and lerp by hand:
908
+ vec4 C = texture2D( colorTex, texcoord, 0.0 );
909
+ texcoord += sign( offset ) * resolution;
910
+ vec4 Cop = texture2D( colorTex, texcoord, 0.0 );
911
+ float s = abs( offset.x ) > abs( offset.y ) ? abs( offset.x ) : abs( offset.y );
912
+
913
+ // WebGL port note: Added gamma correction
914
+ C.xyz = pow(C.xyz, vec3(2.2));
915
+ Cop.xyz = pow(Cop.xyz, vec3(2.2));
916
+ vec4 mixed = mix(C, Cop, s);
917
+ mixed.xyz = pow(mixed.xyz, vec3(1.0 / 2.2));
918
+
919
+ return mixed;
920
+ }
921
+ }
922
+
923
+ void main() {
924
+
925
+ gl_FragColor = SMAANeighborhoodBlendingPS( vUv, vOffset, tColor, tDiffuse );
926
+
927
+ }`};class xe extends b{constructor(e,t){super(),this.edgesRT=new o.WebGLRenderTarget(e,t,{depthBuffer:!1,type:o.HalfFloatType}),this.edgesRT.texture.name="SMAAPass.edges",this.weightsRT=new o.WebGLRenderTarget(e,t,{depthBuffer:!1,type:o.HalfFloatType}),this.weightsRT.texture.name="SMAAPass.weights";const a=this,s=new Image;s.src=this.getAreaTexture(),s.onload=function(){a.areaTexture.needsUpdate=!0},this.areaTexture=new o.Texture,this.areaTexture.name="SMAAPass.area",this.areaTexture.image=s,this.areaTexture.minFilter=o.LinearFilter,this.areaTexture.generateMipmaps=!1,this.areaTexture.flipY=!1;const i=new Image;i.src=this.getSearchTexture(),i.onload=function(){a.searchTexture.needsUpdate=!0},this.searchTexture=new o.Texture,this.searchTexture.name="SMAAPass.search",this.searchTexture.image=i,this.searchTexture.magFilter=o.NearestFilter,this.searchTexture.minFilter=o.NearestFilter,this.searchTexture.generateMipmaps=!1,this.searchTexture.flipY=!1,this.uniformsEdges=o.UniformsUtils.clone(L.uniforms),this.uniformsEdges.resolution.value.set(1/e,1/t),this.materialEdges=new o.ShaderMaterial({defines:Object.assign({},L.defines),uniforms:this.uniformsEdges,vertexShader:L.vertexShader,fragmentShader:L.fragmentShader}),this.uniformsWeights=o.UniformsUtils.clone(P.uniforms),this.uniformsWeights.resolution.value.set(1/e,1/t),this.uniformsWeights.tDiffuse.value=this.edgesRT.texture,this.uniformsWeights.tArea.value=this.areaTexture,this.uniformsWeights.tSearch.value=this.searchTexture,this.materialWeights=new o.ShaderMaterial({defines:Object.assign({},P.defines),uniforms:this.uniformsWeights,vertexShader:P.vertexShader,fragmentShader:P.fragmentShader}),this.uniformsBlend=o.UniformsUtils.clone(N.uniforms),this.uniformsBlend.resolution.value.set(1/e,1/t),this.uniformsBlend.tDiffuse.value=this.weightsRT.texture,this.materialBlend=new o.ShaderMaterial({uniforms:this.uniformsBlend,vertexShader:N.vertexShader,fragmentShader:N.fragmentShader}),this.fsQuad=new w(null)}render(e,t,a){this.uniformsEdges.tDiffuse.value=a.texture,this.fsQuad.material=this.materialEdges,e.setRenderTarget(this.edgesRT),this.clear&&e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.materialWeights,e.setRenderTarget(this.weightsRT),this.clear&&e.clear(),this.fsQuad.render(e),this.uniformsBlend.tColor.value=a.texture,this.fsQuad.material=this.materialBlend,this.renderToScreen?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(),this.fsQuad.render(e))}setSize(e,t){this.edgesRT.setSize(e,t),this.weightsRT.setSize(e,t),this.materialEdges.uniforms.resolution.value.set(1/e,1/t),this.materialWeights.uniforms.resolution.value.set(1/e,1/t),this.materialBlend.uniforms.resolution.value.set(1/e,1/t)}getAreaTexture(){return"data:image/png;base64,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"}getSearchTexture(){return"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII="}dispose(){this.edgesRT.dispose(),this.weightsRT.dispose(),this.areaTexture.dispose(),this.searchTexture.dispose(),this.materialEdges.dispose(),this.materialWeights.dispose(),this.materialBlend.dispose(),this.fsQuad.dispose()}}const be=n.defineComponent({__name:"SMAA",props:{width:{},height:{}},setup(l,{expose:e}){const t=l,{sizes:a}=p.useTresContext(),{pixelRatio:s}=O.useDevicePixelRatio(),i=n.computed(()=>t.width??a.width.value*s.value),r=n.computed(()=>t.height??a.height.value*s.value),{pass:d}=A(()=>new xe(i.value,r.value),t);return e({pass:d}),n.watchEffect(()=>{d.value.setSize(i.value,r.value)}),()=>{}}}),Y={name:"LuminosityHighPassShader",shaderID:"luminosityHighPass",uniforms:{tDiffuse:{value:null},luminosityThreshold:{value:1},smoothWidth:{value:1},defaultColor:{value:new o.Color(0)},defaultOpacity:{value:0}},vertexShader:`
928
+
929
+ varying vec2 vUv;
930
+
931
+ void main() {
932
+
933
+ vUv = uv;
934
+
935
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
936
+
937
+ }`,fragmentShader:`
938
+
939
+ uniform sampler2D tDiffuse;
940
+ uniform vec3 defaultColor;
941
+ uniform float defaultOpacity;
942
+ uniform float luminosityThreshold;
943
+ uniform float smoothWidth;
944
+
945
+ varying vec2 vUv;
946
+
947
+ void main() {
948
+
949
+ vec4 texel = texture2D( tDiffuse, vUv );
950
+
951
+ float v = luminance( texel.xyz );
952
+
953
+ vec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );
954
+
955
+ float alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );
956
+
957
+ gl_FragColor = mix( outputColor, texel, alpha );
958
+
959
+ }`};class M extends b{constructor(e,t,a,s){super(),this.strength=t!==void 0?t:1,this.radius=a,this.threshold=s,this.resolution=e!==void 0?new o.Vector2(e.x,e.y):new o.Vector2(256,256),this.clearColor=new o.Color(0,0,0),this.renderTargetsHorizontal=[],this.renderTargetsVertical=[],this.nMips=5;let i=Math.round(this.resolution.x/2),r=Math.round(this.resolution.y/2);this.renderTargetBright=new o.WebGLRenderTarget(i,r,{type:o.HalfFloatType}),this.renderTargetBright.texture.name="UnrealBloomPass.bright",this.renderTargetBright.texture.generateMipmaps=!1;for(let g=0;g<this.nMips;g++){const m=new o.WebGLRenderTarget(i,r,{type:o.HalfFloatType});m.texture.name="UnrealBloomPass.h"+g,m.texture.generateMipmaps=!1,this.renderTargetsHorizontal.push(m);const S=new o.WebGLRenderTarget(i,r,{type:o.HalfFloatType});S.texture.name="UnrealBloomPass.v"+g,S.texture.generateMipmaps=!1,this.renderTargetsVertical.push(S),i=Math.round(i/2),r=Math.round(r/2)}const d=Y;this.highPassUniforms=o.UniformsUtils.clone(d.uniforms),this.highPassUniforms.luminosityThreshold.value=s,this.highPassUniforms.smoothWidth.value=.01,this.materialHighPassFilter=new o.ShaderMaterial({uniforms:this.highPassUniforms,vertexShader:d.vertexShader,fragmentShader:d.fragmentShader}),this.separableBlurMaterials=[];const u=[3,5,7,9,11];i=Math.round(this.resolution.x/2),r=Math.round(this.resolution.y/2);for(let g=0;g<this.nMips;g++)this.separableBlurMaterials.push(this.getSeparableBlurMaterial(u[g])),this.separableBlurMaterials[g].uniforms.invSize.value=new o.Vector2(1/i,1/r),i=Math.round(i/2),r=Math.round(r/2);this.compositeMaterial=this.getCompositeMaterial(this.nMips),this.compositeMaterial.uniforms.blurTexture1.value=this.renderTargetsVertical[0].texture,this.compositeMaterial.uniforms.blurTexture2.value=this.renderTargetsVertical[1].texture,this.compositeMaterial.uniforms.blurTexture3.value=this.renderTargetsVertical[2].texture,this.compositeMaterial.uniforms.blurTexture4.value=this.renderTargetsVertical[3].texture,this.compositeMaterial.uniforms.blurTexture5.value=this.renderTargetsVertical[4].texture,this.compositeMaterial.uniforms.bloomStrength.value=t,this.compositeMaterial.uniforms.bloomRadius.value=.1;const x=[1,.8,.6,.4,.2];this.compositeMaterial.uniforms.bloomFactors.value=x,this.bloomTintColors=[new o.Vector3(1,1,1),new o.Vector3(1,1,1),new o.Vector3(1,1,1),new o.Vector3(1,1,1),new o.Vector3(1,1,1)],this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors;const f=G;this.copyUniforms=o.UniformsUtils.clone(f.uniforms),this.blendMaterial=new o.ShaderMaterial({uniforms:this.copyUniforms,vertexShader:f.vertexShader,fragmentShader:f.fragmentShader,blending:o.AdditiveBlending,depthTest:!1,depthWrite:!1,transparent:!0}),this.enabled=!0,this.needsSwap=!1,this._oldClearColor=new o.Color,this.oldClearAlpha=1,this.basic=new o.MeshBasicMaterial,this.fsQuad=new w(null)}dispose(){for(let e=0;e<this.renderTargetsHorizontal.length;e++)this.renderTargetsHorizontal[e].dispose();for(let e=0;e<this.renderTargetsVertical.length;e++)this.renderTargetsVertical[e].dispose();this.renderTargetBright.dispose();for(let e=0;e<this.separableBlurMaterials.length;e++)this.separableBlurMaterials[e].dispose();this.compositeMaterial.dispose(),this.blendMaterial.dispose(),this.basic.dispose(),this.fsQuad.dispose()}setSize(e,t){let a=Math.round(e/2),s=Math.round(t/2);this.renderTargetBright.setSize(a,s);for(let i=0;i<this.nMips;i++)this.renderTargetsHorizontal[i].setSize(a,s),this.renderTargetsVertical[i].setSize(a,s),this.separableBlurMaterials[i].uniforms.invSize.value=new o.Vector2(1/a,1/s),a=Math.round(a/2),s=Math.round(s/2)}render(e,t,a,s,i){e.getClearColor(this._oldClearColor),this.oldClearAlpha=e.getClearAlpha();const r=e.autoClear;e.autoClear=!1,e.setClearColor(this.clearColor,0),i&&e.state.buffers.stencil.setTest(!1),this.renderToScreen&&(this.fsQuad.material=this.basic,this.basic.map=a.texture,e.setRenderTarget(null),e.clear(),this.fsQuad.render(e)),this.highPassUniforms.tDiffuse.value=a.texture,this.highPassUniforms.luminosityThreshold.value=this.threshold,this.fsQuad.material=this.materialHighPassFilter,e.setRenderTarget(this.renderTargetBright),e.clear(),this.fsQuad.render(e);let d=this.renderTargetBright;for(let u=0;u<this.nMips;u++)this.fsQuad.material=this.separableBlurMaterials[u],this.separableBlurMaterials[u].uniforms.colorTexture.value=d.texture,this.separableBlurMaterials[u].uniforms.direction.value=M.BlurDirectionX,e.setRenderTarget(this.renderTargetsHorizontal[u]),e.clear(),this.fsQuad.render(e),this.separableBlurMaterials[u].uniforms.colorTexture.value=this.renderTargetsHorizontal[u].texture,this.separableBlurMaterials[u].uniforms.direction.value=M.BlurDirectionY,e.setRenderTarget(this.renderTargetsVertical[u]),e.clear(),this.fsQuad.render(e),d=this.renderTargetsVertical[u];this.fsQuad.material=this.compositeMaterial,this.compositeMaterial.uniforms.bloomStrength.value=this.strength,this.compositeMaterial.uniforms.bloomRadius.value=this.radius,this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors,e.setRenderTarget(this.renderTargetsHorizontal[0]),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.blendMaterial,this.copyUniforms.tDiffuse.value=this.renderTargetsHorizontal[0].texture,i&&e.state.buffers.stencil.setTest(!0),this.renderToScreen?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(a),this.fsQuad.render(e)),e.setClearColor(this._oldClearColor,this.oldClearAlpha),e.autoClear=r}getSeparableBlurMaterial(e){const t=[];for(let a=0;a<e;a++)t.push(.39894*Math.exp(-.5*a*a/(e*e))/e);return new o.ShaderMaterial({defines:{KERNEL_RADIUS:e},uniforms:{colorTexture:{value:null},invSize:{value:new o.Vector2(.5,.5)},direction:{value:new o.Vector2(.5,.5)},gaussianCoefficients:{value:t}},vertexShader:`varying vec2 vUv;
960
+ void main() {
961
+ vUv = uv;
962
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
963
+ }`,fragmentShader:`#include <common>
964
+ varying vec2 vUv;
965
+ uniform sampler2D colorTexture;
966
+ uniform vec2 invSize;
967
+ uniform vec2 direction;
968
+ uniform float gaussianCoefficients[KERNEL_RADIUS];
969
+
970
+ void main() {
971
+ float weightSum = gaussianCoefficients[0];
972
+ vec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;
973
+ for( int i = 1; i < KERNEL_RADIUS; i ++ ) {
974
+ float x = float(i);
975
+ float w = gaussianCoefficients[i];
976
+ vec2 uvOffset = direction * invSize * x;
977
+ vec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;
978
+ vec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;
979
+ diffuseSum += (sample1 + sample2) * w;
980
+ weightSum += 2.0 * w;
981
+ }
982
+ gl_FragColor = vec4(diffuseSum/weightSum, 1.0);
983
+ }`})}getCompositeMaterial(e){return new o.ShaderMaterial({defines:{NUM_MIPS:e},uniforms:{blurTexture1:{value:null},blurTexture2:{value:null},blurTexture3:{value:null},blurTexture4:{value:null},blurTexture5:{value:null},bloomStrength:{value:1},bloomFactors:{value:null},bloomTintColors:{value:null},bloomRadius:{value:0}},vertexShader:`varying vec2 vUv;
984
+ void main() {
985
+ vUv = uv;
986
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
987
+ }`,fragmentShader:`varying vec2 vUv;
988
+ uniform sampler2D blurTexture1;
989
+ uniform sampler2D blurTexture2;
990
+ uniform sampler2D blurTexture3;
991
+ uniform sampler2D blurTexture4;
992
+ uniform sampler2D blurTexture5;
993
+ uniform float bloomStrength;
994
+ uniform float bloomRadius;
995
+ uniform float bloomFactors[NUM_MIPS];
996
+ uniform vec3 bloomTintColors[NUM_MIPS];
997
+
998
+ float lerpBloomFactor(const in float factor) {
999
+ float mirrorFactor = 1.2 - factor;
1000
+ return mix(factor, mirrorFactor, bloomRadius);
1001
+ }
1002
+
1003
+ void main() {
1004
+ gl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +
1005
+ lerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +
1006
+ lerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +
1007
+ lerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +
1008
+ lerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );
1009
+ }`})}}M.BlurDirectionX=new o.Vector2(1,0),M.BlurDirectionY=new o.Vector2(0,1);const Se=n.defineComponent({__name:"UnrealBloom",props:{radius:{default:0},strength:{default:1},threshold:{default:0}},setup(l,{expose:e}){const t=l,{sizes:a}=p.useTresContext(),{pass:s}=A(()=>new M(new o.Vector2(a.width.value,a.height.value),t.radius,t.strength,t.threshold),t);return e({pass:s}),n.watchEffect(()=>{var i;s.value.radius=t.radius??((i=s.value.getCompositeMaterial().uniforms.bloomRadius)==null?void 0:i.value)??.1}),n.watchEffect(()=>{var i;s.value.strength=t.strength??((i=s.value.getCompositeMaterial().uniforms.bloomStrength)==null?void 0:i.value)??1}),n.watchEffect(()=>{var i;s.value.threshold=t.threshold??((i=Y.uniforms.luminosityThreshold)==null?void 0:i.value)??1}),()=>{}}});c.BloomPmndrs=K,c.DepthOfFieldPmndrs=Z,c.EffectComposer=de,c.EffectComposerPmndrs=k,c.Glitch=fe,c.GlitchPmndrs=J,c.Halftone=he,c.NoisePmndrs=_,c.OutlinePmndrs=$,c.Output=ve,c.Pixelation=me,c.PixelationPmndrs=ee,c.SMAA=be,c.UnrealBloom=Se,c.VignettePmndrs=te,c.useEffect=A,c.useEffectPmndrs=T,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});