UNPKG

vue-godrays

Version:

A stunning God Rays effect component for Vue applications

442 lines (367 loc) 20.1 kB
(function(s,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("vue"),require("three")):typeof define=="function"&&define.amd?define(["exports","vue","three"],l):(s=typeof globalThis<"u"?globalThis:s||self,l(s.VueGodRays={},s.Vue,s.THREE))})(this,function(s,l,S){"use strict";function R(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const c in e)if(c!=="default"){const r=Object.getOwnPropertyDescriptor(e,c);Object.defineProperty(n,c,r.get?r:{enumerable:!0,get:()=>e[c]})}}return n.default=e,Object.freeze(n)}const y=R(S),C=`void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`,I=`uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; uniform vec4 u_colors[2]; uniform float u_intensity; uniform float u_rays; uniform float u_reach; uniform vec2 u_rayPos1; uniform vec2 u_rayPos2; #ifndef FNC_MOD289 #define FNC_MOD289 float mod289(const in float x) { return x - floor(x * (1. / 289.)) * 289.; } vec2 mod289(const in vec2 x) { return x - floor(x * (1. / 289.)) * 289.; } vec3 mod289(const in vec3 x) { return x - floor(x * (1. / 289.)) * 289.; } vec4 mod289(const in vec4 x) { return x - floor(x * (1. / 289.)) * 289.; } #endif #ifndef FNC_PERMUTE #define FNC_PERMUTE float permute(const in float x) { return mod289(((x * 34.0) + 1.0) * x); } vec2 permute(const in vec2 x) { return mod289(((x * 34.0) + 1.0) * x); } vec3 permute(const in vec3 x) { return mod289(((x * 34.0) + 1.0) * x); } vec4 permute(const in vec4 x) { return mod289(((x * 34.0) + 1.0) * x); } #endif #ifndef FNC_TAYLORINVSQRT #define FNC_TAYLORINVSQRT float taylorInvSqrt(in float r) { return 1.79284291400159 - 0.85373472095314 * r; } vec2 taylorInvSqrt(in vec2 r) { return 1.79284291400159 - 0.85373472095314 * r; } vec3 taylorInvSqrt(in vec3 r) { return 1.79284291400159 - 0.85373472095314 * r; } vec4 taylorInvSqrt(in vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; } #endif #ifndef FNC_QUINTIC #define FNC_QUINTIC float quintic(const in float v) { return v*v*v*(v*(v*6.0-15.0)+10.0); } vec2 quintic(const in vec2 v) { return v*v*v*(v*(v*6.0-15.0)+10.0); } vec3 quintic(const in vec3 v) { return v*v*v*(v*(v*6.0-15.0)+10.0); } vec4 quintic(const in vec4 v) { return v*v*v*(v*(v*6.0-15.0)+10.0); } #endif #ifndef FNC_PNOISE #define FNC_PNOISE float pnoise(in vec2 P, in vec2 rep) { vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0); vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0); Pi = mod(Pi, rep.xyxy); Pi = mod289(Pi); vec4 ix = Pi.xzxz; vec4 iy = Pi.yyww; vec4 fx = Pf.xzxz; vec4 fy = Pf.yyww; vec4 i = permute(permute(ix) + iy); vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ; vec4 gy = abs(gx) - 0.5 ; vec4 tx = floor(gx + 0.5); gx = gx - tx; vec2 g00 = vec2(gx.x,gy.x); vec2 g10 = vec2(gx.y,gy.y); vec2 g01 = vec2(gx.z,gy.z); vec2 g11 = vec2(gx.w,gy.w); vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); g00 *= norm.x; g01 *= norm.y; g10 *= norm.z; g11 *= norm.w; float n00 = dot(g00, vec2(fx.x, fy.x)); float n10 = dot(g10, vec2(fx.y, fy.y)); float n01 = dot(g01, vec2(fx.z, fy.z)); float n11 = dot(g11, vec2(fx.w, fy.w)); vec2 fade_xy = quintic(Pf.xy); vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x); float n_xy = mix(n_x.x, n_x.y, fade_xy.y); return 2.3 * n_xy; } float pnoise(in vec3 P, in vec3 rep) { vec3 Pi0 = mod(floor(P), rep); vec3 Pi1 = mod(Pi0 + vec3(1.0), rep); Pi0 = mod289(Pi0); Pi1 = mod289(Pi1); vec3 Pf0 = fract(P); vec3 Pf1 = Pf0 - vec3(1.0); vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x); vec4 iy = vec4(Pi0.yy, Pi1.yy); vec4 iz0 = Pi0.zzzz; vec4 iz1 = Pi1.zzzz; vec4 ixy = permute(permute(ix) + iy); vec4 ixy0 = permute(ixy + iz0); vec4 ixy1 = permute(ixy + iz1); vec4 gx0 = ixy0 * (1.0 / 7.0); vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5; gx0 = fract(gx0); vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0); vec4 sz0 = step(gz0, vec4(0.0)); gx0 -= sz0 * (step(0.0, gx0) - 0.5); gy0 -= sz0 * (step(0.0, gy0) - 0.5); vec4 gx1 = ixy1 * (1.0 / 7.0); vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5; gx1 = fract(gx1); vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1); vec4 sz1 = step(gz1, vec4(0.0)); gx1 -= sz1 * (step(0.0, gx1) - 0.5); gy1 -= sz1 * (step(0.0, gy1) - 0.5); vec3 g000 = vec3(gx0.x,gy0.x,gz0.x); vec3 g100 = vec3(gx0.y,gy0.y,gz0.y); vec3 g010 = vec3(gx0.z,gy0.z,gz0.z); vec3 g110 = vec3(gx0.w,gy0.w,gz0.w); vec3 g001 = vec3(gx1.x,gy1.x,gz1.x); vec3 g101 = vec3(gx1.y,gy1.y,gz1.y); vec3 g011 = vec3(gx1.z,gy1.z,gz1.z); vec3 g111 = vec3(gx1.w,gy1.w,gz1.w); vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); g000 *= norm0.x; g010 *= norm0.y; g100 *= norm0.z; g110 *= norm0.w; vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); g001 *= norm1.x; g011 *= norm1.y; g101 *= norm1.z; g111 *= norm1.w; float n000 = dot(g000, Pf0); float n100 = dot(g100, vec3(Pf1.x, Pf0.yz)); float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)); float n110 = dot(g110, vec3(Pf1.xy, Pf0.z)); float n001 = dot(g001, vec3(Pf0.xy, Pf1.z)); float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)); float n011 = dot(g011, vec3(Pf0.x, Pf1.yz)); float n111 = dot(g111, Pf1); vec3 fade_xyz = quintic(Pf0); vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y); float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); return 2.2 * n_xyz; } float pnoise(in vec4 P, in vec4 rep) { vec4 Pi0 = mod(floor(P), rep); vec4 Pi1 = mod(Pi0 + 1.0, rep); Pi0 = mod289(Pi0); Pi1 = mod289(Pi1); vec4 Pf0 = fract(P); vec4 Pf1 = Pf0 - 1.0; vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x); vec4 iy = vec4(Pi0.yy, Pi1.yy); vec4 iz0 = vec4(Pi0.zzzz); vec4 iz1 = vec4(Pi1.zzzz); vec4 iw0 = vec4(Pi0.wwww); vec4 iw1 = vec4(Pi1.wwww); vec4 ixy = permute(permute(ix) + iy); vec4 ixy0 = permute(ixy + iz0); vec4 ixy1 = permute(ixy + iz1); vec4 ixy00 = permute(ixy0 + iw0); vec4 ixy01 = permute(ixy0 + iw1); vec4 ixy10 = permute(ixy1 + iw0); vec4 ixy11 = permute(ixy1 + iw1); vec4 gx00 = ixy00 * (1.0 / 7.0); vec4 gy00 = floor(gx00) * (1.0 / 7.0); vec4 gz00 = floor(gy00) * (1.0 / 6.0); gx00 = fract(gx00) - 0.5; gy00 = fract(gy00) - 0.5; gz00 = fract(gz00) - 0.5; vec4 gw00 = vec4(0.75) - abs(gx00) - abs(gy00) - abs(gz00); vec4 sw00 = step(gw00, vec4(0.0)); gx00 -= sw00 * (step(0.0, gx00) - 0.5); gy00 -= sw00 * (step(0.0, gy00) - 0.5); vec4 gx01 = ixy01 * (1.0 / 7.0); vec4 gy01 = floor(gx01) * (1.0 / 7.0); vec4 gz01 = floor(gy01) * (1.0 / 6.0); gx01 = fract(gx01) - 0.5; gy01 = fract(gy01) - 0.5; gz01 = fract(gz01) - 0.5; vec4 gw01 = vec4(0.75) - abs(gx01) - abs(gy01) - abs(gz01); vec4 sw01 = step(gw01, vec4(0.0)); gx01 -= sw01 * (step(0.0, gx01) - 0.5); gy01 -= sw01 * (step(0.0, gy01) - 0.5); vec4 gx10 = ixy10 * (1.0 / 7.0); vec4 gy10 = floor(gx10) * (1.0 / 7.0); vec4 gz10 = floor(gy10) * (1.0 / 6.0); gx10 = fract(gx10) - 0.5; gy10 = fract(gy10) - 0.5; gz10 = fract(gz10) - 0.5; vec4 gw10 = vec4(0.75) - abs(gx10) - abs(gy10) - abs(gz10); vec4 sw10 = step(gw10, vec4(0.0)); gx10 -= sw10 * (step(0.0, gx10) - 0.5); gy10 -= sw10 * (step(0.0, gy10) - 0.5); vec4 gx11 = ixy11 * (1.0 / 7.0); vec4 gy11 = floor(gx11) * (1.0 / 7.0); vec4 gz11 = floor(gy11) * (1.0 / 6.0); gx11 = fract(gx11) - 0.5; gy11 = fract(gy11) - 0.5; gz11 = fract(gz11) - 0.5; vec4 gw11 = vec4(0.75) - abs(gx11) - abs(gy11) - abs(gz11); vec4 sw11 = step(gw11, vec4(0.0)); gx11 -= sw11 * (step(0.0, gx11) - 0.5); gy11 -= sw11 * (step(0.0, gy11) - 0.5); vec4 g0000 = vec4(gx00.x,gy00.x,gz00.x,gw00.x); vec4 g1000 = vec4(gx00.y,gy00.y,gz00.y,gw00.y); vec4 g0100 = vec4(gx00.z,gy00.z,gz00.z,gw00.z); vec4 g1100 = vec4(gx00.w,gy00.w,gz00.w,gw00.w); vec4 g0010 = vec4(gx10.x,gy10.x,gz10.x,gw10.x); vec4 g1010 = vec4(gx10.y,gy10.y,gz10.y,gw10.y); vec4 g0110 = vec4(gx10.z,gy10.z,gz10.z,gw10.z); vec4 g1110 = vec4(gx10.w,gy10.w,gz10.w,gw10.w); vec4 g0001 = vec4(gx01.x,gy01.x,gz01.x,gw01.x); vec4 g1001 = vec4(gx01.y,gy01.y,gz01.y,gw01.y); vec4 g0101 = vec4(gx01.z,gy01.z,gz01.z,gw01.z); vec4 g1101 = vec4(gx01.w,gy01.w,gz01.w,gw01.w); vec4 g0011 = vec4(gx11.x,gy11.x,gz11.x,gw11.x); vec4 g1011 = vec4(gx11.y,gy11.y,gz11.y,gw11.y); vec4 g0111 = vec4(gx11.z,gy11.z,gz11.z,gw11.z); vec4 g1111 = vec4(gx11.w,gy11.w,gz11.w,gw11.w); vec4 norm00 = taylorInvSqrt(vec4(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); g0000 *= norm00.x; g0100 *= norm00.y; g1000 *= norm00.z; g1100 *= norm00.w; vec4 norm01 = taylorInvSqrt(vec4(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); g0001 *= norm01.x; g0101 *= norm01.y; g1001 *= norm01.z; g1101 *= norm01.w; vec4 norm10 = taylorInvSqrt(vec4(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); g0010 *= norm10.x; g0110 *= norm10.y; g1010 *= norm10.z; g1110 *= norm10.w; vec4 norm11 = taylorInvSqrt(vec4(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); g0011 *= norm11.x; g0111 *= norm11.y; g1011 *= norm11.z; g1111 *= norm11.w; float n0000 = dot(g0000, Pf0); float n1000 = dot(g1000, vec4(Pf1.x, Pf0.yzw)); float n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.zw)); float n1100 = dot(g1100, vec4(Pf1.xy, Pf0.zw)); float n0010 = dot(g0010, vec4(Pf0.xy, Pf1.z, Pf0.w)); float n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); float n0110 = dot(g0110, vec4(Pf0.x, Pf1.yz, Pf0.w)); float n1110 = dot(g1110, vec4(Pf1.xyz, Pf0.w)); float n0001 = dot(g0001, vec4(Pf0.xyz, Pf1.w)); float n1001 = dot(g1001, vec4(Pf1.x, Pf0.yz, Pf1.w)); float n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); float n1101 = dot(g1101, vec4(Pf1.xy, Pf0.z, Pf1.w)); float n0011 = dot(g0011, vec4(Pf0.xy, Pf1.zw)); float n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.zw)); float n0111 = dot(g0111, vec4(Pf0.x, Pf1.yzw)); float n1111 = dot(g1111, Pf1); vec4 fade_xyzw = quintic(Pf0); vec4 n_0w = mix(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w); vec4 n_1w = mix(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w); vec4 n_zw = mix(n_0w, n_1w, fade_xyzw.z); vec2 n_yzw = mix(n_zw.xy, n_zw.zw, fade_xyzw.y); float n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); return 2.2 * n_xyzw; } #endif #ifndef SRGB_EPSILON #define SRGB_EPSILON 0.00000001 #endif #ifndef FNC_SRGB2RGB #define FNC_SRGB2RGB float srgb2rgb(float channel) { return (channel < 0.04045) ? channel * 0.0773993808 : pow((channel + 0.055) * 0.947867298578199, 2.4); } vec3 srgb2rgb(vec3 srgb) { return vec3(srgb2rgb(srgb.r + SRGB_EPSILON), srgb2rgb(srgb.g + SRGB_EPSILON), srgb2rgb(srgb.b + SRGB_EPSILON)); } vec4 srgb2rgb(vec4 srgb) { return vec4(srgb2rgb(srgb.rgb), srgb.a); } #endif #if !defined(FNC_SATURATE) && !defined(saturate) #define FNC_SATURATE #define saturate(x) clamp(x, 0.0, 1.0) #endif #ifndef SRGB_EPSILON #define SRGB_EPSILON 0.00000001 #endif #ifndef FNC_RGB2SRGB #define FNC_RGB2SRGB float rgb2srgb(float channel) { return (channel < 0.0031308) ? channel * 12.92 : 1.055 * pow(channel, 0.4166666666666667) - 0.055; } vec3 rgb2srgb(vec3 rgb) { return saturate(vec3(rgb2srgb(rgb.r - SRGB_EPSILON), rgb2srgb(rgb.g - SRGB_EPSILON), rgb2srgb(rgb.b - SRGB_EPSILON))); } vec4 rgb2srgb(vec4 rgb) { return vec4(rgb2srgb(rgb.rgb), rgb.a); } #endif #ifndef FNC_MIXOKLAB #define FNC_MIXOKLAB vec3 mixOklab( vec3 colA, vec3 colB, float h ) { #ifdef MIXOKLAB_COLORSPACE_SRGB colA = srgb2rgb(colA); colB = srgb2rgb(colB); #endif const mat3 kCONEtoLMS = mat3( 0.4121656120, 0.2118591070, 0.0883097947, 0.5362752080, 0.6807189584, 0.2818474174, 0.0514575653, 0.1074065790, 0.6302613616); const mat3 kLMStoCONE = mat3( 4.0767245293, -1.2681437731, -0.0041119885, -3.3072168827, 2.6093323231, -0.7034763098, 0.2307590544, -0.3411344290, 1.7068625689); vec3 lmsA = pow( kCONEtoLMS * colA, vec3(1.0/3.0) ); vec3 lmsB = pow( kCONEtoLMS * colB, vec3(1.0/3.0) ); vec3 lms = mix( lmsA, lmsB, h ); vec3 rgb = kLMStoCONE*(lms*lms*lms); #ifdef MIXOKLAB_COLORSPACE_SRGB return rgb2srgb(rgb); #else return rgb; #endif } vec4 mixOklab( vec4 colA, vec4 colB, float h ) { return vec4( mixOklab(colA.rgb, colB.rgb, h), mix(colA.a, colB.a, h) ); } #endif float rayStrength(vec2 raySource, vec2 rayRefDirection, vec2 coord, float seedA, float seedB, float speed) { vec2 sourceToCoord = coord - raySource; float cosAngle = dot(normalize(sourceToCoord), rayRefDirection); // Calculate the diagonal length float diagonal = length(u_resolution); return clamp( (.45 + 0.15 * sin(cosAngle * seedA + u_time * speed)) + (0.3 + 0.2 * cos(-cosAngle * seedB + u_time * speed)), u_reach, 1.0) * clamp((diagonal - length(sourceToCoord)) / diagonal, u_reach, 1.0); } void main() { vec2 uv = gl_FragCoord.xy / u_resolution.xy; uv.y = 1.0 - uv.y; vec2 coord = vec2(gl_FragCoord.x, u_resolution.y - gl_FragCoord.y); float speed = u_rays * 10.0; // Set the parameters of the sun rays vec2 rayPos1 = u_rayPos1; vec2 rayRefDir1 = normalize(vec2(1.0, -0.116)); float raySeedA1 = 36.2214*speed; float raySeedB1 = 21.11349*speed; float raySpeed1 = 1.5*speed; vec2 rayPos2 = u_rayPos2; vec2 rayRefDir2 = normalize(vec2(1.0, 0.241)); float raySeedA2 = 22.39910*speed; float raySeedB2 = 18.0234*speed; float raySpeed2 = 1.1*speed; // Calculate ray strengths float strength1 = rayStrength(rayPos1, rayRefDir1, coord, raySeedA1, raySeedB1, raySpeed1); float strength2 = rayStrength(rayPos2, rayRefDir2, coord, raySeedA2, raySeedB2, raySpeed2); // Calculate brightness attenuation float brightness = 1.0*u_reach - (coord.y / u_resolution.y); float attenuation = clamp(brightness + (0.5 + u_intensity), 0.0, 1.0); // Calculate alpha values while preserving color float alpha1 = strength1 * attenuation * u_colors[0].a; float alpha2 = strength2 * attenuation * u_colors[1].a; // Pre-multiply the colors with their alpha values vec3 premultColor1 = u_colors[0].rgb * alpha1; vec3 premultColor2 = u_colors[1].rgb * alpha2; // Blend the pre-multiplied colors vec3 blendedColor = premultColor1 + premultColor2; float blendedAlpha = alpha1 + alpha2 * (1.0 - alpha1); // Un-premultiply the final color vec3 finalRGB = blendedColor / max(blendedAlpha, 0.0001); gl_FragColor = vec4(finalRGB * blendedAlpha, blendedAlpha); }`,x={RAY_1:-.4,RAY_2:-.5},m=(e,n,c,r,v)=>{const o=(e-n)/(c-n);return r+o*(v-r)},z=e=>{if(!e||typeof e!="string")return[1,1,1,1];let n=1,c=1,r=1,v=1;if(e.startsWith("rgba")){const o=e.slice(5,-1).split(",");[n,c,r]=o.map(i=>parseInt(i)/255),v=parseFloat(o[3])}else if(e.startsWith("rgb"))[n,c,r]=e.slice(4,-1).split(",").map(i=>parseInt(i)/255);else if(e.startsWith("#")){const o=e.slice(1);o.length===3?(n=parseInt(o[0]+o[0],16)/255,c=parseInt(o[1]+o[1],16)/255,r=parseInt(o[2]+o[2],16)/255):o.length===6?(n=parseInt(o.slice(0,2),16)/255,c=parseInt(o.slice(2,4),16)/255,r=parseInt(o.slice(4,6),16)/255):o.length===8&&(n=parseInt(o.slice(0,2),16)/255,c=parseInt(o.slice(2,4),16)/255,r=parseInt(o.slice(4,6),16)/255,v=parseInt(o.slice(6,8),16)/255)}return[n,c,r,v]};function A(e){const n=l.ref(null),c=l.ref(null);let r=null,v=null,o=null,i=null,u=null,p=!0;const O=()=>{if(!n.value||!c.value)return;r=new y.WebGLRenderer({canvas:c.value,antialias:!0,alpha:!0,powerPreference:"high-performance",precision:"mediump"}),r.setPixelRatio(Math.min(window.devicePixelRatio,2)),r.setSize(n.value.clientWidth,n.value.clientHeight),v=new y.Scene,o=new y.PerspectiveCamera(75,n.value.clientWidth/n.value.clientHeight,.1,1e3),o.position.z=5;const t=new y.PlaneGeometry(1024,1024),a=E();i=new y.Mesh(t,a),v.add(i)},E=()=>{if(!n.value)return null;const t=F();return new y.ShaderMaterial({vertexShader:C,fragmentShader:I,transparent:!0,depthWrite:!1,uniforms:M(t)})},M=t=>{var a,g,f,d;return n.value?{u_resolution:{value:[n.value.clientWidth,n.value.clientHeight]},u_mouse:{value:[.5,.5]},u_time:{value:0},u_colors:{value:[new y.Vector4(...t.color1,1),new y.Vector4(...t.color2,1)]},u_intensity:{value:m(e.intensity??50,0,100,0,.5)},u_rays:{value:m(e.rays??30,0,100,0,.3)},u_reach:{value:m(e.reach??40,0,100,0,.5)},u_rayPos1:{value:[(e.position??80)/100*(((a=n.value)==null?void 0:a.clientWidth)??0),x.RAY_1*(((g=n.value)==null?void 0:g.clientHeight)??0)]},u_rayPos2:{value:[((e.position??80)/100+.02)*(((f=n.value)==null?void 0:f.clientWidth)??0),x.RAY_2*(((d=n.value)==null?void 0:d.clientHeight)??0)]}}:{}},P=()=>{var g;if(!p||!r||!v||!o||!i)return;const t=i.material,a=performance.now()*.001*(((g=e.animation)==null?void 0:g.speed)??10)/10;t.uniforms.u_time.value=a,r.render(v,o),u=requestAnimationFrame(P)},G=()=>{u!=null&&cancelAnimationFrame(u),r&&r.dispose(),i&&(i.geometry.dispose(),i.material.dispose())},h=()=>{if(!n.value||!r||!o||!i)return;const t=n.value.clientWidth,a=n.value.clientHeight;o.aspect=t/a,o.updateProjectionMatrix(),r.setSize(t,a);const g=i.material;g.uniforms&&(g.uniforms.u_resolution.value=[t,a],g.uniforms.u_rayPos1.value=[(e.position??80)/100*t,x.RAY_1*a],g.uniforms.u_rayPos2.value=[((e.position??80)/100+.02)*t,x.RAY_2*a])},b=t=>{if(!i||!n.value)return;const a=n.value.getBoundingClientRect(),g=(t.clientX-a.left)/a.width,f=1-(t.clientY-a.top)/a.height;i.material.uniforms.u_mouse.value=[g,f]},F=()=>{const t={color1:[.6,.8,1],color2:[.4,.6,.9],opacity:1};if(!e.raysColor)return t;switch(e.raysColor.mode){case"single":{const[a,g,f,d]=z(e.raysColor.color);return{color1:[a,g,f],color2:[a,g,f],opacity:d}}case"multi":{const[a,g,f,d]=z(e.raysColor.color1),[L,T,q,k]=z(e.raysColor.color2);return{color1:[a,g,f],color2:[L,T,q],opacity:Math.min(d,k)}}case"random":return{color1:[Math.random(),Math.random(),Math.random()],color2:[Math.random(),Math.random(),Math.random()],opacity:1};default:return t}};return l.onMounted(()=>{var t;O(),P(),window.addEventListener("resize",h),(t=n.value)==null||t.addEventListener("mousemove",b)}),l.onBeforeUnmount(()=>{var t;G(),window.removeEventListener("resize",h),(t=n.value)==null||t.removeEventListener("mousemove",b)}),l.watch(()=>{var t;return(t=e.animation)==null?void 0:t.animate},t=>{p=t??!0,t&&u===null&&P()}),{containerRef:n,canvasRef:c}}const w=((e,n)=>{const c=e.__vccOpts||e;for(const[r,v]of n)c[r]=v;return c})(l.defineComponent({__name:"GodRays",props:{animation:{},raysColor:{},backgroundColor:{},intensity:{},rays:{},reach:{},position:{},radius:{},style:{}},setup(e){const n=e,{containerRef:c,canvasRef:r}=A(n);return(v,o)=>(l.openBlock(),l.createElementBlock("div",{ref_key:"containerRef",ref:c,style:l.normalizeStyle({borderRadius:n.radius,overflow:"hidden",backgroundColor:n.backgroundColor,...n.style})},[l.createElementVNode("canvas",{ref_key:"canvasRef",ref:r},null,512)],4))}}),[["__scopeId","data-v-c38bbf36"]]),B=w;function _(e){e.component("GodRays",w)}const N={install:_};s.GodRays=B,s.default=N,s.install=_,Object.defineProperties(s,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});