@eva/plugin-renderer-rain-puddle 2.1.0-beta.14 → 2.1.0-beta.15
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.
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
var globalThis = typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : Function('return this')();
|
|
1
2
|
globalThis.EVA = globalThis.EVA || {};
|
|
2
3
|
globalThis.EVA.plugin = globalThis.EVA.plugin || {};
|
|
3
4
|
globalThis.EVA.plugin.renderer = globalThis.EVA.plugin.renderer || {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.EVA=globalThis.EVA||{},globalThis.EVA.plugin=globalThis.EVA.plugin||{},globalThis.EVA.plugin.renderer=globalThis.EVA.plugin.renderer||{},globalThis.EVA.plugin.renderer.rain=globalThis.EVA.plugin.renderer.rain||{};var _EVA_IIFE_puddle=function(e,t,n,i,r){"use strict";class a extends t.Component{constructor(){super(...arguments),this.rainAmount=.65,this.waterLevel=.5,this.groundLevel=.545,this.groundFeather=.02,this.reflectionStrength=.55,this.rippleDuration=1.6,this.maxRipples=4,this.quality="high",this.reflectionTexture="",this.rainSurfaceName="rain-surface",this.puddleSurfaceName="puddle-surface",this.rippleUniformData=new Float32Array(16),this.rippleDirectionUniformData=new Float32Array(16),this.clickRippleUniformData=new Float32Array([-2,-2,99,0]),this.activeRippleCount=0,this.nextRippleIndex=0}init(e={}){var t,n,i,r,a,u,s,c,p,f,d,m,h,v;this.rainAmount=l(null!==(t=e.rainAmount)&&void 0!==t?t:this.rainAmount),this.waterLevel=l(null!==(n=e.waterLevel)&&void 0!==n?n:this.waterLevel),this.groundLevel=l(null!==(i=e.groundLevel)&&void 0!==i?i:this.groundLevel),this.groundFeather=o(null!==(r=e.groundFeather)&&void 0!==r?r:this.groundFeather,.001,1),this.reflectionStrength=l(null!==(a=e.reflectionStrength)&&void 0!==a?a:this.reflectionStrength),this.rippleDuration=Math.max(.05,null!==(u=e.rippleDuration)&&void 0!==u?u:this.rippleDuration),this.maxRipples=(m=null!==(s=e.maxRipples)&&void 0!==s?s:this.maxRipples,h=1,v=8,Math.round(o(m,h,v))),this.quality=null!==(c=e.quality)&&void 0!==c?c:this.quality,this.reflectionTexture=null!==(p=e.reflectionTexture)&&void 0!==p?p:this.reflectionTexture,this.rainSurfaceName=null!==(f=e.rainSurfaceName)&&void 0!==f?f:this.rainSurfaceName,this.puddleSurfaceName=null!==(d=e.puddleSurfaceName)&&void 0!==d?d:this.puddleSurfaceName,this.rippleUniformData=new Float32Array(4*this.maxRipples),this.rippleDirectionUniformData=new Float32Array(4*this.maxRipples),this.clickRippleUniformData=new Float32Array([-2,-2,99,0]),this.resetRipples()}emitRipple(e){var t;const n=this.nextRippleIndex,i=4*n,r=this.rippleUniformData[i+2]>=0;this.rippleUniformData[i]=l(e.x),this.rippleUniformData[i+1]=l(e.y),this.rippleUniformData[i+2]=0,this.rippleUniformData[i+3]=l(null!==(t=e.strength)&&void 0!==t?t:1);const a=function(e){var t,n;const i="number"==typeof e?e:Number(null!==(t=null==e?void 0:e.x)&&void 0!==t?t:0),r="number"==typeof e?0:Number(null!==(n=null==e?void 0:e.y)&&void 0!==n?n:0),a=Math.hypot(i,r);return a>0?{x:i/a,y:r/a}:{x:0,y:1}}(e.direction),o=4*n;this.rippleDirectionUniformData[o]=a.x,this.rippleDirectionUniformData[o+1]=a.y,r||(this.activeRippleCount+=1),this.nextRippleIndex=(n+1)%this.maxRipples}emitClickRipple(e){var t;this.clickRippleUniformData[0]=l(e.x),this.clickRippleUniformData[1]=l(e.y),this.clickRippleUniformData[2]=0,this.clickRippleUniformData[3]=l(null!==(t=e.strength)&&void 0!==t?t:1)}advanceRipples(e){if(e>0){for(let t=0;t<this.maxRipples;t+=1){const n=4*t+2,i=this.rippleUniformData[n];if(i<0)continue;const r=i+e;r>=this.rippleDuration?(this.rippleUniformData[n]=-1,this.activeRippleCount-=1):this.rippleUniformData[n]=r}this.clickRippleUniformData[2]>=0&&this.clickRippleUniformData[2]<this.rippleDuration&&(this.clickRippleUniformData[2]+=e)}}getRippleDirection(e){var t,n;const i=4*e;return{x:null!==(t=this.rippleDirectionUniformData[i])&&void 0!==t?t:0,y:null!==(n=this.rippleDirectionUniformData[i+1])&&void 0!==n?n:0}}resetRipples(){this.rippleUniformData.fill(0);for(let e=0;e<this.maxRipples;e+=1)this.rippleUniformData[4*e+2]=-1;this.rippleDirectionUniformData.fill(0),this.clickRippleUniformData.set([-2,-2,99,0]),this.nextRippleIndex=0,this.activeRippleCount=0}}function o(e,t,n){return Math.min(n,Math.max(t,e))}function l(e){return o(e,0,1)}a.componentName="RainPuddle";let u=class extends t.System{constructor(){super(...arguments),this.name="RainPuddleSystem",this.bindings=new Map}update(){this.consumeObserverChanges()}consumeObserverChanges(){for(const e of this.componentObserver.clear())this.componentChanged(e)}componentChanged(e){e.componentName===a.componentName&&(e.type!==t.OBSERVER_TYPE.REMOVE?e.type===t.OBSERVER_TYPE.ADD&&this.bindings.set(e.gameObject.id,{component:e.component}):this.bindings.delete(e.gameObject.id))}frameStart(e){this.consumeObserverChanges();const t=Math.min(.1,Math.max(0,e.rafDeltaTime/1e3));for(const e of this.bindings.values()){const n=e.component;n.advanceRipples(t),e.rainEffect=this.resolveEffect(e.rainEffect,n.rainSurfaceName),e.puddleEffect=this.resolveEffect(e.puddleEffect,n.puddleSurfaceName),e.rainEffect&&(e.rainEffect.uniforms.rainAmount=n.rainAmount,e.rainEffect.uniforms.quality=c(n.quality)),e.puddleEffect&&(e.puddleEffect.uniforms.waterLevel=n.waterLevel,e.puddleEffect.uniforms.groundLevel=n.groundLevel,e.puddleEffect.uniforms.groundFeather=n.groundFeather,e.puddleEffect.uniforms.reflectionStrength=n.reflectionStrength,e.puddleEffect.uniforms.rippleDuration=n.rippleDuration,e.puddleEffect.uniforms.ripples=n.rippleUniformData,e.puddleEffect.uniforms.rippleDirections=n.rippleDirectionUniformData,e.puddleEffect.uniforms.clickRipple=n.clickRippleUniformData,e.puddleEffect.uniforms.reflectionTexture=n.reflectionTexture)}}onDestroy(){this.bindings.clear()}resolveEffect(e,t){var i,r,a;if((null==e?void 0:e.gameObject)&&!e.gameObject.destroyed)return e;if(!t)return;const o=null===(a=null===(r=null===(i=this.game)||void 0===i?void 0:i.findAllByName)||void 0===r?void 0:r.call(i,t))||void 0===a?void 0:a[0];return null==o?void 0:o.getComponent(n.ShaderEffect)}};u.systemName="RainPuddleSystem",u=function(e,t,n,i){var r,a=arguments.length,o=a<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,i);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(o=(a<3?r(o):a>3?r(t,n,o):r(t,n))||o);return a>3&&o&&Object.defineProperty(t,n,o),o}([t.decorators.componentObserver({RainPuddle:[]})],u);var s=u;function c(e){return"low"===e?0:"medium"===e?.55:1}const p="eva.rain-puddle.rain",f="eva.rain-puddle.puddle",d="\nin vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvoid main() {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = aPosition;\n}\n",m="\nin vec2 vTextureCoord;\nout vec4 finalColor;\n\nuniform sampler2D uTexture;\nuniform float uTime;\nuniform float uRainAmount;\nuniform float uQuality;\n\nfloat hash21(vec2 p) {\n return fract(sin(dot(p, vec2(41.31, 289.17))) * 28419.231);\n}\n\nfloat rainLayer(vec2 uv, float scale, float speed, float width, float length, float brightness) {\n vec2 p = uv * vec2(150.0 * scale, 78.0 * scale);\n p.x += p.y * 0.24;\n // Texture coordinates grow downwards in Pixi. Subtracting time makes the\n // streak cells travel towards increasing screen Y instead of rising upward.\n p.y -= uTime * speed;\n vec2 id = floor(p);\n vec2 cell = fract(p) - 0.5;\n float seed = hash21(id);\n float thinLine = 1.0 - smoothstep(width, width * 2.0, abs(cell.x + seed * 0.16 - 0.08));\n float longStreak = 1.0 - smoothstep(length, length * 1.35, abs(cell.y));\n return thinLine * longStreak * brightness * step(1.0 - uRainAmount, seed);\n}\n\nvoid main() {\n vec2 uv = vTextureCoord;\n float detail = mix(0.78, 1.0, uQuality);\n float rain = rainLayer(uv, 0.72 * detail, 1.15, 0.010, 0.42, 0.28);\n rain += rainLayer(uv + vec2(0.17, 0.0), 1.28 * detail, 1.78, 0.007, 0.46, 0.62);\n float alpha = clamp(rain, 0.0, 0.82);\n finalColor = vec4(vec3(0.66, 0.82, 0.96) * alpha, alpha);\n}\n",h="\nin vec2 vTextureCoord;\nout vec4 finalColor;\n\nuniform sampler2D uTexture;\nuniform sampler2D uReflection;\nuniform float uTime;\nuniform float uWaterLevel;\nuniform float uGroundLevel;\nuniform float uGroundFeather;\nuniform float uReflectionStrength;\nuniform float uRippleDuration;\nuniform vec4 uRipples[8];\nuniform vec4 uRippleDirections[8];\nuniform vec4 uClickRipple;\n\nfloat puddleShape(vec2 uv, vec2 center, vec2 radii, float seed) {\n vec2 p = (uv - center) / radii;\n float angle = atan(p.y, p.x);\n float edgeNoise = sin(angle * 5.0 + seed) * 0.075 + sin(angle * 9.0 - seed) * 0.035;\n float distanceToCenter = length(p) + edgeNoise;\n return 1.0 - smoothstep(0.72 + (1.0 - uWaterLevel) * 0.20, 1.02, distanceToCenter);\n}\n\nfloat ring(vec2 uv, vec2 center, float radius, float width) {\n float distanceToCenter = length(uv - center);\n return 1.0 - smoothstep(width, width * 2.1, abs(distanceToCenter - radius));\n}\n\nfloat projectedFootWave(vec2 uv, vec4 state, vec2 direction) {\n float phase = clamp(state.z / 1.10, 0.0, 1.0);\n float fade = (1.0 - phase) * state.w;\n vec2 wakeCenter = state.xy - direction * phase * 0.014;\n vec2 delta = uv - wakeCenter;\n float projectedDistance = length(vec2(delta.x, delta.y * 3.0));\n float radius = 0.006 + phase * 0.058;\n float leading = 1.0 - smoothstep(0.0018, 0.0040, abs(projectedDistance - radius));\n float secondary = 1.0 - smoothstep(0.0015, 0.0033, abs(projectedDistance - radius * 0.63));\n vec2 trailDelta = uv - (wakeCenter - direction * 0.018 * phase);\n float trailDistance = length(vec2(trailDelta.x, trailDelta.y * 3.0));\n float trail = 1.0 - smoothstep(0.0020, 0.0045, abs(trailDistance - radius * 0.76));\n return (leading + secondary * 0.34 + trail * 0.42) * fade;\n}\n\nvoid main() {\n vec2 uv = vTextureCoord;\n float mask = puddleShape(uv, vec2(0.26, 0.68), vec2(0.21, 0.12), 0.3);\n mask = max(mask, puddleShape(uv, vec2(0.56, 0.77), vec2(0.26, 0.10), 2.2));\n mask = max(mask, puddleShape(uv, vec2(0.82, 0.59), vec2(0.14, 0.18), 4.1));\n mask *= smoothstep(uGroundLevel, uGroundLevel + max(uGroundFeather, 0.0001), uv.y);\n mask *= smoothstep(0.04, 0.17, uWaterLevel);\n\n float smallWaves = sin(uv.y * 920.0 + uTime * 2.2) + sin(uv.x * 700.0 - uTime * 1.7);\n vec2 distortion = vec2(smallWaves * 0.00075, sin(uv.x * 510.0 + uTime * 2.0) * 0.0011);\n\n for (int index = 0; index < 5; index++) {\n float fi = float(index);\n float phase = fract(uTime * (0.13 + fi * 0.023) + fi * 0.618);\n vec2 center = vec2(fract(fi * 0.347 + 0.14), fract(fi * 0.613 + 0.52));\n float radius = phase * 0.075;\n float rainRipple = ring(uv, center, radius, 0.0018) * (1.0 - phase);\n distortion += normalize(uv - center + vec2(0.0001)) * rainRipple * 0.004;\n }\n\n float clickPhase = clamp(uClickRipple.z / 1.55, 0.0, 1.0);\n float clickRing = ring(uv, uClickRipple.xy, clickPhase * 0.14, 0.0025) * (1.0 - clickPhase) * uClickRipple.w;\n distortion += normalize(uv - uClickRipple.xy + vec2(0.0001)) * clickRing * 0.012;\n\n float footRing = 0.0;\n vec2 footPush = vec2(0.0);\n for (int index = 0; index < 8; index++) {\n vec4 state = uRipples[index];\n if (state.z < 0.0 || state.z >= uRippleDuration) continue;\n float wave = projectedFootWave(uv, state, uRippleDirections[index].xy);\n footRing += wave;\n footPush += (uv - state.xy) * wave;\n }\n footRing = clamp(footRing, 0.0, 1.5);\n distortion += normalize(footPush + vec2(0.0001)) * footRing * 0.0065;\n\n vec4 reflection = texture(uReflection, clamp(uv + distortion, vec2(0.002), vec2(0.998)));\n vec3 waterTint = vec3(0.055, 0.15, 0.23);\n float reflectedAmount = reflection.a * uReflectionStrength;\n vec3 color = mix(waterTint, reflection.rgb + vec3(0.03, 0.06, 0.09), reflectedAmount);\n color += vec3(0.30, 0.48, 0.58) * (clickRing + footRing * 1.10 + 0.18 * max(0.0, smallWaves)) * 0.24;\n float alpha = mask * (0.82 + 0.16 * uWaterLevel);\n finalColor = vec4(color * alpha, alpha);\n}\n";function v(e,t,n){const i=e[t];return"number"==typeof i&&Number.isFinite(i)?i:n}const g=()=>{const e=new i.UniformGroup({uTime:{value:0,type:"f32"},uRainAmount:{value:.65,type:"f32"},uQuality:{value:1,type:"f32"}}),t=new i.Filter({glProgram:i.GlProgram.from({name:p,vertex:d,fragment:m}),resources:{rainUniforms:e},antialias:"on"});return{filter:t,update(t,n){const i=e.uniforms;i.uTime=t.rafTime/1e3,i.uRainAmount=v(n,"rainAmount",.65),i.uQuality=v(n,"quality",1)},destroy(){t.destroy()}}};Object.defineProperty(g,"backends",{value:["webgl"]});const R=()=>{const e=new Float32Array(32),t=new Float32Array(32),n=new Float32Array([-2,-2,99,0]);for(let t=0;t<8;t+=1)e[4*t+2]=-1;const a=new i.UniformGroup({uTime:{value:0,type:"f32"},uWaterLevel:{value:.5,type:"f32"},uGroundLevel:{value:.545,type:"f32"},uGroundFeather:{value:.02,type:"f32"},uReflectionStrength:{value:.55,type:"f32"},uRippleDuration:{value:1.6,type:"f32"},uRipples:{value:e,type:"vec4<f32>",size:8},uRippleDirections:{value:t,type:"vec4<f32>",size:8},uClickRipple:{value:n,type:"vec4<f32>"}}),o=new i.Filter({glProgram:i.GlProgram.from({name:f,vertex:d,fragment:h}),resources:{puddleUniforms:a,uReflection:i.Texture.EMPTY.source},antialias:"on"});let l="";return{filter:o,update(i,u){const s=a.uniforms;s.uTime=i.rafTime/1e3,s.uWaterLevel=v(u,"waterLevel",.5),s.uGroundLevel=v(u,"groundLevel",.545),s.uGroundFeather=v(u,"groundFeather",.02),s.uReflectionStrength=v(u,"reflectionStrength",.55),s.uRippleDuration=v(u,"rippleDuration",1.6);const c=u.ripples;e.fill(0);for(let t=0;t<8;t+=1)e[4*t+2]=-1;c instanceof Float32Array&&e.set(c.subarray(0,e.length)),t.fill(0);const p=u.rippleDirections;p instanceof Float32Array&&t.set(p.subarray(0,t.length)),n.set([-2,-2,99,0]);const f=u.clickRipple;f instanceof Float32Array&&n.set(f.subarray(0,n.length));const d="string"==typeof u.reflectionTexture?u.reflectionTexture:"";if(d&&d!==l){const e=r.getSceneCaptureTexture(d);e&&(o.resources.uReflection=e.source,l=d)}},destroy(){o.destroy()}}};Object.defineProperty(R,"backends",{value:["webgl"]});const y={vertex:d,rainFragment:m,puddleFragment:h};return e.DEFAULT_MAX_RIPPLES=4,e.MAX_SHADER_RIPPLES=8,e.PUDDLE_EFFECT_ID=f,e.RAIN_EFFECT_ID=p,e.RIPPLE_STRIDE=4,e.RainPuddle=a,e.RainPuddleSystem=s,e.rainPuddleShaderSources=y,e.registerRainPuddleEffects=function(){n.getShaderEffect(p)||n.registerShaderEffect(p,g),n.getShaderEffect(f)||n.registerShaderEffect(f,R)},e.unregisterRainPuddleEffects=function(){n.unregisterShaderEffect(p),n.unregisterShaderEffect(f)},Object.defineProperty(e,"__esModule",{value:!0}),e}({},EVA,EVA.plugin.renderer.shader.effect,PIXI,EVA.plugin.renderer.scene.capture);globalThis.EVA.plugin.renderer.rain.puddle=globalThis.EVA.plugin.renderer.rain.puddle||_EVA_IIFE_puddle;
|
|
1
|
+
var globalThis="undefined"!=typeof self?self:"undefined"!=typeof window?window:Function("return this")();globalThis.EVA=globalThis.EVA||{},globalThis.EVA.plugin=globalThis.EVA.plugin||{},globalThis.EVA.plugin.renderer=globalThis.EVA.plugin.renderer||{},globalThis.EVA.plugin.renderer.rain=globalThis.EVA.plugin.renderer.rain||{};var _EVA_IIFE_puddle=function(e,t,n,i,r){"use strict";class a extends t.Component{constructor(){super(...arguments),this.rainAmount=.65,this.waterLevel=.5,this.groundLevel=.545,this.groundFeather=.02,this.reflectionStrength=.55,this.rippleDuration=1.6,this.maxRipples=4,this.quality="high",this.reflectionTexture="",this.rainSurfaceName="rain-surface",this.puddleSurfaceName="puddle-surface",this.rippleUniformData=new Float32Array(16),this.rippleDirectionUniformData=new Float32Array(16),this.clickRippleUniformData=new Float32Array([-2,-2,99,0]),this.activeRippleCount=0,this.nextRippleIndex=0}init(e={}){var t,n,i,r,a,u,s,c,p,f,d,m,h,v;this.rainAmount=l(null!==(t=e.rainAmount)&&void 0!==t?t:this.rainAmount),this.waterLevel=l(null!==(n=e.waterLevel)&&void 0!==n?n:this.waterLevel),this.groundLevel=l(null!==(i=e.groundLevel)&&void 0!==i?i:this.groundLevel),this.groundFeather=o(null!==(r=e.groundFeather)&&void 0!==r?r:this.groundFeather,.001,1),this.reflectionStrength=l(null!==(a=e.reflectionStrength)&&void 0!==a?a:this.reflectionStrength),this.rippleDuration=Math.max(.05,null!==(u=e.rippleDuration)&&void 0!==u?u:this.rippleDuration),this.maxRipples=(m=null!==(s=e.maxRipples)&&void 0!==s?s:this.maxRipples,h=1,v=8,Math.round(o(m,h,v))),this.quality=null!==(c=e.quality)&&void 0!==c?c:this.quality,this.reflectionTexture=null!==(p=e.reflectionTexture)&&void 0!==p?p:this.reflectionTexture,this.rainSurfaceName=null!==(f=e.rainSurfaceName)&&void 0!==f?f:this.rainSurfaceName,this.puddleSurfaceName=null!==(d=e.puddleSurfaceName)&&void 0!==d?d:this.puddleSurfaceName,this.rippleUniformData=new Float32Array(4*this.maxRipples),this.rippleDirectionUniformData=new Float32Array(4*this.maxRipples),this.clickRippleUniformData=new Float32Array([-2,-2,99,0]),this.resetRipples()}emitRipple(e){var t;const n=this.nextRippleIndex,i=4*n,r=this.rippleUniformData[i+2]>=0;this.rippleUniformData[i]=l(e.x),this.rippleUniformData[i+1]=l(e.y),this.rippleUniformData[i+2]=0,this.rippleUniformData[i+3]=l(null!==(t=e.strength)&&void 0!==t?t:1);const a=function(e){var t,n;const i="number"==typeof e?e:Number(null!==(t=null==e?void 0:e.x)&&void 0!==t?t:0),r="number"==typeof e?0:Number(null!==(n=null==e?void 0:e.y)&&void 0!==n?n:0),a=Math.hypot(i,r);return a>0?{x:i/a,y:r/a}:{x:0,y:1}}(e.direction),o=4*n;this.rippleDirectionUniformData[o]=a.x,this.rippleDirectionUniformData[o+1]=a.y,r||(this.activeRippleCount+=1),this.nextRippleIndex=(n+1)%this.maxRipples}emitClickRipple(e){var t;this.clickRippleUniformData[0]=l(e.x),this.clickRippleUniformData[1]=l(e.y),this.clickRippleUniformData[2]=0,this.clickRippleUniformData[3]=l(null!==(t=e.strength)&&void 0!==t?t:1)}advanceRipples(e){if(e>0){for(let t=0;t<this.maxRipples;t+=1){const n=4*t+2,i=this.rippleUniformData[n];if(i<0)continue;const r=i+e;r>=this.rippleDuration?(this.rippleUniformData[n]=-1,this.activeRippleCount-=1):this.rippleUniformData[n]=r}this.clickRippleUniformData[2]>=0&&this.clickRippleUniformData[2]<this.rippleDuration&&(this.clickRippleUniformData[2]+=e)}}getRippleDirection(e){var t,n;const i=4*e;return{x:null!==(t=this.rippleDirectionUniformData[i])&&void 0!==t?t:0,y:null!==(n=this.rippleDirectionUniformData[i+1])&&void 0!==n?n:0}}resetRipples(){this.rippleUniformData.fill(0);for(let e=0;e<this.maxRipples;e+=1)this.rippleUniformData[4*e+2]=-1;this.rippleDirectionUniformData.fill(0),this.clickRippleUniformData.set([-2,-2,99,0]),this.nextRippleIndex=0,this.activeRippleCount=0}}function o(e,t,n){return Math.min(n,Math.max(t,e))}function l(e){return o(e,0,1)}a.componentName="RainPuddle";let u=class extends t.System{constructor(){super(...arguments),this.name="RainPuddleSystem",this.bindings=new Map}update(){this.consumeObserverChanges()}consumeObserverChanges(){for(const e of this.componentObserver.clear())this.componentChanged(e)}componentChanged(e){e.componentName===a.componentName&&(e.type!==t.OBSERVER_TYPE.REMOVE?e.type===t.OBSERVER_TYPE.ADD&&this.bindings.set(e.gameObject.id,{component:e.component}):this.bindings.delete(e.gameObject.id))}frameStart(e){this.consumeObserverChanges();const t=Math.min(.1,Math.max(0,e.rafDeltaTime/1e3));for(const e of this.bindings.values()){const n=e.component;n.advanceRipples(t),e.rainEffect=this.resolveEffect(e.rainEffect,n.rainSurfaceName),e.puddleEffect=this.resolveEffect(e.puddleEffect,n.puddleSurfaceName),e.rainEffect&&(e.rainEffect.uniforms.rainAmount=n.rainAmount,e.rainEffect.uniforms.quality=c(n.quality)),e.puddleEffect&&(e.puddleEffect.uniforms.waterLevel=n.waterLevel,e.puddleEffect.uniforms.groundLevel=n.groundLevel,e.puddleEffect.uniforms.groundFeather=n.groundFeather,e.puddleEffect.uniforms.reflectionStrength=n.reflectionStrength,e.puddleEffect.uniforms.rippleDuration=n.rippleDuration,e.puddleEffect.uniforms.ripples=n.rippleUniformData,e.puddleEffect.uniforms.rippleDirections=n.rippleDirectionUniformData,e.puddleEffect.uniforms.clickRipple=n.clickRippleUniformData,e.puddleEffect.uniforms.reflectionTexture=n.reflectionTexture)}}onDestroy(){this.bindings.clear()}resolveEffect(e,t){var i,r,a;if((null==e?void 0:e.gameObject)&&!e.gameObject.destroyed)return e;if(!t)return;const o=null===(a=null===(r=null===(i=this.game)||void 0===i?void 0:i.findAllByName)||void 0===r?void 0:r.call(i,t))||void 0===a?void 0:a[0];return null==o?void 0:o.getComponent(n.ShaderEffect)}};u.systemName="RainPuddleSystem",u=function(e,t,n,i){var r,a=arguments.length,o=a<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,i);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(o=(a<3?r(o):a>3?r(t,n,o):r(t,n))||o);return a>3&&o&&Object.defineProperty(t,n,o),o}([t.decorators.componentObserver({RainPuddle:[]})],u);var s=u;function c(e){return"low"===e?0:"medium"===e?.55:1}const p="eva.rain-puddle.rain",f="eva.rain-puddle.puddle",d="\nin vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvoid main() {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = aPosition;\n}\n",m="\nin vec2 vTextureCoord;\nout vec4 finalColor;\n\nuniform sampler2D uTexture;\nuniform float uTime;\nuniform float uRainAmount;\nuniform float uQuality;\n\nfloat hash21(vec2 p) {\n return fract(sin(dot(p, vec2(41.31, 289.17))) * 28419.231);\n}\n\nfloat rainLayer(vec2 uv, float scale, float speed, float width, float length, float brightness) {\n vec2 p = uv * vec2(150.0 * scale, 78.0 * scale);\n p.x += p.y * 0.24;\n // Texture coordinates grow downwards in Pixi. Subtracting time makes the\n // streak cells travel towards increasing screen Y instead of rising upward.\n p.y -= uTime * speed;\n vec2 id = floor(p);\n vec2 cell = fract(p) - 0.5;\n float seed = hash21(id);\n float thinLine = 1.0 - smoothstep(width, width * 2.0, abs(cell.x + seed * 0.16 - 0.08));\n float longStreak = 1.0 - smoothstep(length, length * 1.35, abs(cell.y));\n return thinLine * longStreak * brightness * step(1.0 - uRainAmount, seed);\n}\n\nvoid main() {\n vec2 uv = vTextureCoord;\n float detail = mix(0.78, 1.0, uQuality);\n float rain = rainLayer(uv, 0.72 * detail, 1.15, 0.010, 0.42, 0.28);\n rain += rainLayer(uv + vec2(0.17, 0.0), 1.28 * detail, 1.78, 0.007, 0.46, 0.62);\n float alpha = clamp(rain, 0.0, 0.82);\n finalColor = vec4(vec3(0.66, 0.82, 0.96) * alpha, alpha);\n}\n",h="\nin vec2 vTextureCoord;\nout vec4 finalColor;\n\nuniform sampler2D uTexture;\nuniform sampler2D uReflection;\nuniform float uTime;\nuniform float uWaterLevel;\nuniform float uGroundLevel;\nuniform float uGroundFeather;\nuniform float uReflectionStrength;\nuniform float uRippleDuration;\nuniform vec4 uRipples[8];\nuniform vec4 uRippleDirections[8];\nuniform vec4 uClickRipple;\n\nfloat puddleShape(vec2 uv, vec2 center, vec2 radii, float seed) {\n vec2 p = (uv - center) / radii;\n float angle = atan(p.y, p.x);\n float edgeNoise = sin(angle * 5.0 + seed) * 0.075 + sin(angle * 9.0 - seed) * 0.035;\n float distanceToCenter = length(p) + edgeNoise;\n return 1.0 - smoothstep(0.72 + (1.0 - uWaterLevel) * 0.20, 1.02, distanceToCenter);\n}\n\nfloat ring(vec2 uv, vec2 center, float radius, float width) {\n float distanceToCenter = length(uv - center);\n return 1.0 - smoothstep(width, width * 2.1, abs(distanceToCenter - radius));\n}\n\nfloat projectedFootWave(vec2 uv, vec4 state, vec2 direction) {\n float phase = clamp(state.z / 1.10, 0.0, 1.0);\n float fade = (1.0 - phase) * state.w;\n vec2 wakeCenter = state.xy - direction * phase * 0.014;\n vec2 delta = uv - wakeCenter;\n float projectedDistance = length(vec2(delta.x, delta.y * 3.0));\n float radius = 0.006 + phase * 0.058;\n float leading = 1.0 - smoothstep(0.0018, 0.0040, abs(projectedDistance - radius));\n float secondary = 1.0 - smoothstep(0.0015, 0.0033, abs(projectedDistance - radius * 0.63));\n vec2 trailDelta = uv - (wakeCenter - direction * 0.018 * phase);\n float trailDistance = length(vec2(trailDelta.x, trailDelta.y * 3.0));\n float trail = 1.0 - smoothstep(0.0020, 0.0045, abs(trailDistance - radius * 0.76));\n return (leading + secondary * 0.34 + trail * 0.42) * fade;\n}\n\nvoid main() {\n vec2 uv = vTextureCoord;\n float mask = puddleShape(uv, vec2(0.26, 0.68), vec2(0.21, 0.12), 0.3);\n mask = max(mask, puddleShape(uv, vec2(0.56, 0.77), vec2(0.26, 0.10), 2.2));\n mask = max(mask, puddleShape(uv, vec2(0.82, 0.59), vec2(0.14, 0.18), 4.1));\n mask *= smoothstep(uGroundLevel, uGroundLevel + max(uGroundFeather, 0.0001), uv.y);\n mask *= smoothstep(0.04, 0.17, uWaterLevel);\n\n float smallWaves = sin(uv.y * 920.0 + uTime * 2.2) + sin(uv.x * 700.0 - uTime * 1.7);\n vec2 distortion = vec2(smallWaves * 0.00075, sin(uv.x * 510.0 + uTime * 2.0) * 0.0011);\n\n for (int index = 0; index < 5; index++) {\n float fi = float(index);\n float phase = fract(uTime * (0.13 + fi * 0.023) + fi * 0.618);\n vec2 center = vec2(fract(fi * 0.347 + 0.14), fract(fi * 0.613 + 0.52));\n float radius = phase * 0.075;\n float rainRipple = ring(uv, center, radius, 0.0018) * (1.0 - phase);\n distortion += normalize(uv - center + vec2(0.0001)) * rainRipple * 0.004;\n }\n\n float clickPhase = clamp(uClickRipple.z / 1.55, 0.0, 1.0);\n float clickRing = ring(uv, uClickRipple.xy, clickPhase * 0.14, 0.0025) * (1.0 - clickPhase) * uClickRipple.w;\n distortion += normalize(uv - uClickRipple.xy + vec2(0.0001)) * clickRing * 0.012;\n\n float footRing = 0.0;\n vec2 footPush = vec2(0.0);\n for (int index = 0; index < 8; index++) {\n vec4 state = uRipples[index];\n if (state.z < 0.0 || state.z >= uRippleDuration) continue;\n float wave = projectedFootWave(uv, state, uRippleDirections[index].xy);\n footRing += wave;\n footPush += (uv - state.xy) * wave;\n }\n footRing = clamp(footRing, 0.0, 1.5);\n distortion += normalize(footPush + vec2(0.0001)) * footRing * 0.0065;\n\n vec4 reflection = texture(uReflection, clamp(uv + distortion, vec2(0.002), vec2(0.998)));\n vec3 waterTint = vec3(0.055, 0.15, 0.23);\n float reflectedAmount = reflection.a * uReflectionStrength;\n vec3 color = mix(waterTint, reflection.rgb + vec3(0.03, 0.06, 0.09), reflectedAmount);\n color += vec3(0.30, 0.48, 0.58) * (clickRing + footRing * 1.10 + 0.18 * max(0.0, smallWaves)) * 0.24;\n float alpha = mask * (0.82 + 0.16 * uWaterLevel);\n finalColor = vec4(color * alpha, alpha);\n}\n";function v(e,t,n){const i=e[t];return"number"==typeof i&&Number.isFinite(i)?i:n}const g=()=>{const e=new i.UniformGroup({uTime:{value:0,type:"f32"},uRainAmount:{value:.65,type:"f32"},uQuality:{value:1,type:"f32"}}),t=new i.Filter({glProgram:i.GlProgram.from({name:p,vertex:d,fragment:m}),resources:{rainUniforms:e},antialias:"on"});return{filter:t,update(t,n){const i=e.uniforms;i.uTime=t.rafTime/1e3,i.uRainAmount=v(n,"rainAmount",.65),i.uQuality=v(n,"quality",1)},destroy(){t.destroy()}}};Object.defineProperty(g,"backends",{value:["webgl"]});const R=()=>{const e=new Float32Array(32),t=new Float32Array(32),n=new Float32Array([-2,-2,99,0]);for(let t=0;t<8;t+=1)e[4*t+2]=-1;const a=new i.UniformGroup({uTime:{value:0,type:"f32"},uWaterLevel:{value:.5,type:"f32"},uGroundLevel:{value:.545,type:"f32"},uGroundFeather:{value:.02,type:"f32"},uReflectionStrength:{value:.55,type:"f32"},uRippleDuration:{value:1.6,type:"f32"},uRipples:{value:e,type:"vec4<f32>",size:8},uRippleDirections:{value:t,type:"vec4<f32>",size:8},uClickRipple:{value:n,type:"vec4<f32>"}}),o=new i.Filter({glProgram:i.GlProgram.from({name:f,vertex:d,fragment:h}),resources:{puddleUniforms:a,uReflection:i.Texture.EMPTY.source},antialias:"on"});let l="";return{filter:o,update(i,u){const s=a.uniforms;s.uTime=i.rafTime/1e3,s.uWaterLevel=v(u,"waterLevel",.5),s.uGroundLevel=v(u,"groundLevel",.545),s.uGroundFeather=v(u,"groundFeather",.02),s.uReflectionStrength=v(u,"reflectionStrength",.55),s.uRippleDuration=v(u,"rippleDuration",1.6);const c=u.ripples;e.fill(0);for(let t=0;t<8;t+=1)e[4*t+2]=-1;c instanceof Float32Array&&e.set(c.subarray(0,e.length)),t.fill(0);const p=u.rippleDirections;p instanceof Float32Array&&t.set(p.subarray(0,t.length)),n.set([-2,-2,99,0]);const f=u.clickRipple;f instanceof Float32Array&&n.set(f.subarray(0,n.length));const d="string"==typeof u.reflectionTexture?u.reflectionTexture:"";if(d&&d!==l){const e=r.getSceneCaptureTexture(d);e&&(o.resources.uReflection=e.source,l=d)}},destroy(){o.destroy()}}};Object.defineProperty(R,"backends",{value:["webgl"]});const y={vertex:d,rainFragment:m,puddleFragment:h};return e.DEFAULT_MAX_RIPPLES=4,e.MAX_SHADER_RIPPLES=8,e.PUDDLE_EFFECT_ID=f,e.RAIN_EFFECT_ID=p,e.RIPPLE_STRIDE=4,e.RainPuddle=a,e.RainPuddleSystem=s,e.rainPuddleShaderSources=y,e.registerRainPuddleEffects=function(){n.getShaderEffect(p)||n.registerShaderEffect(p,g),n.getShaderEffect(f)||n.registerShaderEffect(f,R)},e.unregisterRainPuddleEffects=function(){n.unregisterShaderEffect(p),n.unregisterShaderEffect(f)},Object.defineProperty(e,"__esModule",{value:!0}),e}({},EVA,EVA.plugin.renderer.shader.effect,PIXI,EVA.plugin.renderer.scene.capture);globalThis.EVA.plugin.renderer.rain.puddle=globalThis.EVA.plugin.renderer.rain.puddle||_EVA_IIFE_puddle;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eva/plugin-renderer-rain-puddle",
|
|
3
|
-
"version": "2.1.0-beta.
|
|
3
|
+
"version": "2.1.0-beta.15",
|
|
4
4
|
"description": "Reusable rain, puddle reflection and ripple effects for Eva.js.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "dist/plugin-renderer-rain-puddle.esm.js",
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
],
|
|
19
19
|
"license": "MIT",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@eva/eva.js": "2.1.0-beta.
|
|
22
|
-
"@eva/plugin-renderer": "2.1.0-beta.
|
|
23
|
-
"@eva/plugin-renderer-scene-capture": "2.1.0-beta.
|
|
24
|
-
"@eva/plugin-renderer-shader-effect": "2.1.0-beta.
|
|
21
|
+
"@eva/eva.js": "2.1.0-beta.15",
|
|
22
|
+
"@eva/plugin-renderer": "2.1.0-beta.15",
|
|
23
|
+
"@eva/plugin-renderer-scene-capture": "2.1.0-beta.15",
|
|
24
|
+
"@eva/plugin-renderer-shader-effect": "2.1.0-beta.15",
|
|
25
25
|
"pixi.js": "8.19.0"
|
|
26
26
|
}
|
|
27
27
|
}
|