@cos-design/ripple-water 3.5.2 → 3.5.3
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.
- package/dist/index.cjs +93 -1
- package/dist/index.js +163 -51
- package/dist/src/components/rippleWater/index.d.ts +27 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1 +1,93 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});require('./index.css');var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("react");c=s(c,1);let l=require("@cos-design/shared"),u=require("react/jsx-runtime");var d={rippleWater:`cos-rippleWater-wsinI`,canvas:`cos-canvas-XOdSF`,hint:`cos-hint-0JH5D`},f
|
|
1
|
+
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});require('./index.css');var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("react");c=s(c,1);let l=require("@cos-design/shared"),u=require("react/jsx-runtime");var d={rippleWater:`cos-rippleWater-wsinI`,canvas:`cos-canvas-XOdSF`,hint:`cos-hint-0JH5D`},f=`
|
|
2
|
+
attribute vec2 a_pos;
|
|
3
|
+
varying vec2 v_uv;
|
|
4
|
+
void main() {
|
|
5
|
+
v_uv = a_pos * 0.5 + 0.5;
|
|
6
|
+
gl_Position = vec4(a_pos, 0.0, 1.0);
|
|
7
|
+
}
|
|
8
|
+
`,p=`
|
|
9
|
+
precision highp float;
|
|
10
|
+
|
|
11
|
+
uniform float u_time;
|
|
12
|
+
uniform vec2 u_res;
|
|
13
|
+
uniform vec3 u_tint;
|
|
14
|
+
uniform vec3 u_from;
|
|
15
|
+
uniform vec3 u_to;
|
|
16
|
+
uniform sampler2D u_height;
|
|
17
|
+
uniform vec2 u_sim;
|
|
18
|
+
uniform float u_waveAmp;
|
|
19
|
+
uniform float u_waveSpeed;
|
|
20
|
+
uniform float u_shimmer;
|
|
21
|
+
uniform float u_reflection;
|
|
22
|
+
|
|
23
|
+
varying vec2 v_uv;
|
|
24
|
+
|
|
25
|
+
float hash(vec2 p) {
|
|
26
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
float ambientH(vec2 p, float t) {
|
|
30
|
+
float h = 0.0;
|
|
31
|
+
h += sin(p.x * 3.2 + t * 1.3) * cos(p.y * 2.4 - t * 0.9) * 0.45;
|
|
32
|
+
h += sin(p.x * 6.8 - t * 1.7 + p.y * 1.1) * 0.22;
|
|
33
|
+
h += sin(p.x * 12.0 + p.y * 9.0 + t * 2.4) * 0.08;
|
|
34
|
+
h += sin(p.x * 1.4 + p.y * 1.8 + t * 0.55) * 0.35;
|
|
35
|
+
return h;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
float sampleHeight(vec2 uv) {
|
|
39
|
+
float rip = texture2D(u_height, uv).r * 2.0 - 1.0;
|
|
40
|
+
vec2 p = uv * vec2(u_res.x / u_res.y, 1.0) * 2.8;
|
|
41
|
+
float amb = ambientH(p, u_time * u_waveSpeed) * 0.035 * u_waveAmp;
|
|
42
|
+
return rip * 0.55 + amb;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
vec3 calcNormal(vec2 uv) {
|
|
46
|
+
vec2 e = vec2(1.5 / u_sim.x, 1.5 / u_sim.y);
|
|
47
|
+
float hL = sampleHeight(uv - vec2(e.x, 0.0));
|
|
48
|
+
float hR = sampleHeight(uv + vec2(e.x, 0.0));
|
|
49
|
+
float hD = sampleHeight(uv - vec2(0.0, e.y));
|
|
50
|
+
float hU = sampleHeight(uv + vec2(0.0, e.y));
|
|
51
|
+
return normalize(vec3((hL - hR) * 14.0, (hD - hU) * 14.0, 1.0));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void main() {
|
|
55
|
+
vec2 uv = v_uv;
|
|
56
|
+
vec3 n = calcNormal(uv);
|
|
57
|
+
float h = sampleHeight(uv);
|
|
58
|
+
|
|
59
|
+
vec3 V = normalize(vec3(0.0, 0.25, 1.0));
|
|
60
|
+
vec3 L = normalize(vec3(0.45, 0.75, 0.55));
|
|
61
|
+
|
|
62
|
+
float ndotl = max(dot(n, L), 0.0);
|
|
63
|
+
float fresnel = pow(1.0 - max(dot(n, V), 0.0), 3.2);
|
|
64
|
+
|
|
65
|
+
float g = clamp((uv.x + (1.0 - uv.y)) * 0.5, 0.0, 1.0);
|
|
66
|
+
vec3 water = mix(u_from, u_to, g);
|
|
67
|
+
water = mix(water, u_from, clamp(h * 1.8 + ndotl * 0.12, 0.0, 0.28));
|
|
68
|
+
water *= 0.92 + n.y * 0.1;
|
|
69
|
+
|
|
70
|
+
vec3 sky = mix(u_from * 1.15, vec3(0.85, 0.92, 1.0), 0.45);
|
|
71
|
+
vec3 reflectCol = mix(sky, vec3(0.9, 0.95, 1.0), pow(max(n.y, 0.0), 2.0));
|
|
72
|
+
water = mix(water, reflectCol, fresnel * u_reflection);
|
|
73
|
+
|
|
74
|
+
vec3 H = normalize(L + V);
|
|
75
|
+
float spec = pow(max(dot(n, H), 0.0), 180.0);
|
|
76
|
+
float glitter = pow(max(dot(n, H), 0.0), 48.0);
|
|
77
|
+
float sparkThresh = step(0.992, glitter) * glitter;
|
|
78
|
+
vec3 sparkle = u_tint * (spec * 1.8 + sparkThresh * 2.5) * u_shimmer
|
|
79
|
+
+ vec3(1.0) * sparkThresh * 0.8 * u_shimmer;
|
|
80
|
+
|
|
81
|
+
float softSpec = pow(max(dot(n, H), 0.0), 16.0) * 0.22 * u_shimmer;
|
|
82
|
+
water += u_tint * softSpec + sparkle;
|
|
83
|
+
|
|
84
|
+
float crest = smoothstep(0.02, 0.12, abs(h)) * fresnel;
|
|
85
|
+
water += mix(u_tint, vec3(1.0), 0.4) * crest * 0.35;
|
|
86
|
+
|
|
87
|
+
float vig = smoothstep(1.15, 0.35, length((uv - 0.5) * vec2(1.1, 1.0)));
|
|
88
|
+
water *= 0.88 + 0.12 * vig;
|
|
89
|
+
water += (hash(uv * u_res + u_time) - 0.5) * 0.015;
|
|
90
|
+
|
|
91
|
+
gl_FragColor = vec4(water, 1.0);
|
|
92
|
+
}
|
|
93
|
+
`,m=e=>{let t=e.replace(`#`,``),n=t.length===3?t.split(``).map(e=>e+e).join(``):t,r=Number.parseInt(n,16);return Number.isNaN(r)?[.22,.74,.97]:[(r>>16&255)/255,(r>>8&255)/255,(r&255)/255]},h=(e,t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},g=(e,t,n)=>{let r=h(e,e.VERTEX_SHADER,t),i=h(e,e.FRAGMENT_SHADER,n);if(!r||!i)return null;let a=e.createProgram();return a?(e.attachShader(a,r),e.attachShader(a,i),e.linkProgram(a),e.deleteShader(r),e.deleteShader(i),e.getProgramParameter(a,e.LINK_STATUS)?a:(e.deleteProgram(a),null)):null},_=192,v=({width:e=800,height:t=500,fromColor:n=`#52ade3`,toColor:r=`#013565`,color:i=`#a8d8f5`,waveAmplitude:a=1,waveSpeed:o=1,shimmer:s=1,reflection:h=.38,rippleStrength:v=1,rippleRadius:y=6,damping:b=.985,spread:x=.5,interactive:S=!0,showHint:C=!0,hint:w=`点击水面产生涟漪`})=>{let T=(0,c.useRef)(null),E=(0,c.useRef)(0),D=(0,c.useRef)(null),O=(0,c.useRef)({fromColor:n,toColor:r,color:i,waveAmplitude:a,waveSpeed:o,shimmer:s,reflection:h,rippleStrength:v,rippleRadius:y,damping:b,spread:x,interactive:S});(0,c.useEffect)(()=>{O.current={fromColor:n,toColor:r,color:i,waveAmplitude:a,waveSpeed:o,shimmer:s,reflection:h,rippleStrength:v,rippleRadius:y,damping:b,spread:x,interactive:S}},[n,r,i,a,o,s,h,v,y,b,x,S]);let k=(0,c.useCallback)((e,t)=>{if(!O.current.interactive)return;let n=T.current;if(!n)return;let r=n.getBoundingClientRect();D.current={x:(e-r.left)/r.width,y:1-(t-r.top)/r.height,strength:O.current.rippleStrength}},[]);return(0,c.useEffect)(()=>{let e=T.current;if(!e)return;let t=e=>k(e.clientX,e.clientY),n=e=>{let t=e.touches[0];t&&k(t.clientX,t.clientY)};return e.addEventListener(`click`,t),e.addEventListener(`touchstart`,n,{passive:!0}),()=>{e.removeEventListener(`click`,t),e.removeEventListener(`touchstart`,n)}},[k]),(0,c.useEffect)(()=>{let n=T.current;if(!n)return;let r=Math.min(window.devicePixelRatio||1,2);n.width=Math.floor(e*r),n.height=Math.floor(t*r);let i=n.getContext(`webgl`,{alpha:!1,antialias:!1,depth:!1,stencil:!1,premultipliedAlpha:!1});if(!i)return;let a=g(i,f,p);if(!a)return;let o=i.createBuffer();i.bindBuffer(i.ARRAY_BUFFER,o),i.bufferData(i.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,1,1]),i.STATIC_DRAW);let s=i.getAttribLocation(a,`a_pos`),c=i.getUniformLocation(a,`u_time`),u=i.getUniformLocation(a,`u_res`),d=i.getUniformLocation(a,`u_tint`),h=i.getUniformLocation(a,`u_from`),v=i.getUniformLocation(a,`u_to`),y=i.getUniformLocation(a,`u_height`),b=i.getUniformLocation(a,`u_sim`),x=i.getUniformLocation(a,`u_waveAmp`),S=i.getUniformLocation(a,`u_waveSpeed`),C=i.getUniformLocation(a,`u_shimmer`),w=i.getUniformLocation(a,`u_reflection`),k=_*_,A=new Float32Array(k),j=new Float32Array(k),M=new Float32Array(k),N=i.createTexture();i.bindTexture(i.TEXTURE_2D,N),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);let P=new Uint8Array(k*4),F=()=>{for(let e=0;e<k;e++){let t=Math.max(0,Math.min(255,Math.floor((j[e]*.5+.5)*255))),n=e*4;P[n]=t,P[n+1]=t,P[n+2]=t,P[n+3]=255}i.bindTexture(i.TEXTURE_2D,N),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,_,_,0,i.RGBA,i.UNSIGNED_BYTE,P)},I=(e,t,n,r)=>{let i=e*(_-1),a=t*(_-1),o=(0,l.clamp)(r,2,12);for(let e=-o-1;e<=o+1;e++)for(let t=-o-1;t<=o+1;t++){let r=Math.round(i+t),s=Math.round(a+e);if(r<=0||r>=_-1||s<=0||s>=_-1)continue;let c=Math.sqrt(t*t+e*e),l=Math.exp(-c*c*.55)*-.35,u=Math.exp(-((c-o*.55)**2)*.9);j[s*_+r]+=n*(l+u*1.1)}},L=(e,t)=>{let n=(0,l.clamp)(e,.9,.999),r=(0,l.clamp)(t,.3,.7);for(let e=0;e<2;e++){for(let e=1;e<_-1;e++){let t=e*_;for(let e=1;e<_-1;e++){let i=t+e,a=j[i-1]+j[i+1]+j[i-_]+j[i+_];M[i]=(a*r-A[i])*n,M[i]>1.5?M[i]=1.5:M[i]<-1.5&&(M[i]=-1.5)}}let e=A;A=j,j=M,M=e,M.fill(0)}},R=document.hidden,z=(0,l.bindVisibilityPause)(e=>{R=e}),B=performance.now();F();let V=e=>{if(E.current=requestAnimationFrame(V),R)return;let t=O.current;if(D.current){let e=D.current,n=(0,l.clamp)(e.strength,0,3),r=t.rippleRadius;I(e.x,e.y,n,r),I(e.x+.004,e.y-.003,n*.35,r),D.current=null}L(t.damping,t.spread),F();let r=m(t.color),f=m(t.fromColor),p=m(t.toColor);i.viewport(0,0,n.width,n.height),i.useProgram(a),i.bindBuffer(i.ARRAY_BUFFER,o),i.enableVertexAttribArray(s),i.vertexAttribPointer(s,2,i.FLOAT,!1,0,0),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,N),i.uniform1i(y,0),i.uniform1f(c,(e-B)/1e3),i.uniform2f(u,n.width,n.height),i.uniform3f(d,r[0],r[1],r[2]),i.uniform3f(h,f[0],f[1],f[2]),i.uniform3f(v,p[0],p[1],p[2]),i.uniform2f(b,_,_),i.uniform1f(x,(0,l.clamp)(t.waveAmplitude,0,2)),i.uniform1f(S,(0,l.clamp)(t.waveSpeed,0,3)),i.uniform1f(C,(0,l.clamp)(t.shimmer,0,2)),i.uniform1f(w,(0,l.clamp)(t.reflection,0,1)),i.drawArrays(i.TRIANGLE_STRIP,0,4)};return E.current=requestAnimationFrame(V),()=>{cancelAnimationFrame(E.current),z(),i.deleteTexture(N),i.deleteBuffer(o),i.deleteProgram(a)}},[t,e]),(0,u.jsxs)(`div`,{className:d.rippleWater,style:{width:e,height:t},children:[(0,u.jsx)(`canvas`,{ref:T,className:d.canvas,style:{width:e,height:t,cursor:S?`pointer`:`default`}}),C?(0,u.jsx)(`span`,{className:d.hint,children:w}):null]})};exports.RippleWater=v,exports.default=v;
|
package/dist/index.js
CHANGED
|
@@ -1,74 +1,186 @@
|
|
|
1
1
|
import { useCallback as e, useEffect as t, useRef as n } from "react";
|
|
2
|
-
import { bindVisibilityPause as r } from "@cos-design/shared";
|
|
3
|
-
import { jsx as
|
|
4
|
-
import './index.css';var
|
|
2
|
+
import { bindVisibilityPause as r, clamp as i } from "@cos-design/shared";
|
|
3
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
|
+
import './index.css';var s = {
|
|
5
5
|
rippleWater: "cos-rippleWater-wsinI",
|
|
6
6
|
canvas: "cos-canvas-XOdSF",
|
|
7
7
|
hint: "cos-hint-0JH5D"
|
|
8
|
-
},
|
|
9
|
-
let
|
|
10
|
-
|
|
8
|
+
}, c = "\nattribute vec2 a_pos;\nvarying vec2 v_uv;\nvoid main() {\n v_uv = a_pos * 0.5 + 0.5;\n gl_Position = vec4(a_pos, 0.0, 1.0);\n}\n", l = "\nprecision highp float;\n\nuniform float u_time;\nuniform vec2 u_res;\nuniform vec3 u_tint;\nuniform vec3 u_from;\nuniform vec3 u_to;\nuniform sampler2D u_height;\nuniform vec2 u_sim;\nuniform float u_waveAmp;\nuniform float u_waveSpeed;\nuniform float u_shimmer;\nuniform float u_reflection;\n\nvarying vec2 v_uv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nfloat ambientH(vec2 p, float t) {\n float h = 0.0;\n h += sin(p.x * 3.2 + t * 1.3) * cos(p.y * 2.4 - t * 0.9) * 0.45;\n h += sin(p.x * 6.8 - t * 1.7 + p.y * 1.1) * 0.22;\n h += sin(p.x * 12.0 + p.y * 9.0 + t * 2.4) * 0.08;\n h += sin(p.x * 1.4 + p.y * 1.8 + t * 0.55) * 0.35;\n return h;\n}\n\nfloat sampleHeight(vec2 uv) {\n float rip = texture2D(u_height, uv).r * 2.0 - 1.0;\n vec2 p = uv * vec2(u_res.x / u_res.y, 1.0) * 2.8;\n float amb = ambientH(p, u_time * u_waveSpeed) * 0.035 * u_waveAmp;\n return rip * 0.55 + amb;\n}\n\nvec3 calcNormal(vec2 uv) {\n vec2 e = vec2(1.5 / u_sim.x, 1.5 / u_sim.y);\n float hL = sampleHeight(uv - vec2(e.x, 0.0));\n float hR = sampleHeight(uv + vec2(e.x, 0.0));\n float hD = sampleHeight(uv - vec2(0.0, e.y));\n float hU = sampleHeight(uv + vec2(0.0, e.y));\n return normalize(vec3((hL - hR) * 14.0, (hD - hU) * 14.0, 1.0));\n}\n\nvoid main() {\n vec2 uv = v_uv;\n vec3 n = calcNormal(uv);\n float h = sampleHeight(uv);\n\n vec3 V = normalize(vec3(0.0, 0.25, 1.0));\n vec3 L = normalize(vec3(0.45, 0.75, 0.55));\n\n float ndotl = max(dot(n, L), 0.0);\n float fresnel = pow(1.0 - max(dot(n, V), 0.0), 3.2);\n\n float g = clamp((uv.x + (1.0 - uv.y)) * 0.5, 0.0, 1.0);\n vec3 water = mix(u_from, u_to, g);\n water = mix(water, u_from, clamp(h * 1.8 + ndotl * 0.12, 0.0, 0.28));\n water *= 0.92 + n.y * 0.1;\n\n vec3 sky = mix(u_from * 1.15, vec3(0.85, 0.92, 1.0), 0.45);\n vec3 reflectCol = mix(sky, vec3(0.9, 0.95, 1.0), pow(max(n.y, 0.0), 2.0));\n water = mix(water, reflectCol, fresnel * u_reflection);\n\n vec3 H = normalize(L + V);\n float spec = pow(max(dot(n, H), 0.0), 180.0);\n float glitter = pow(max(dot(n, H), 0.0), 48.0);\n float sparkThresh = step(0.992, glitter) * glitter;\n vec3 sparkle = u_tint * (spec * 1.8 + sparkThresh * 2.5) * u_shimmer\n + vec3(1.0) * sparkThresh * 0.8 * u_shimmer;\n\n float softSpec = pow(max(dot(n, H), 0.0), 16.0) * 0.22 * u_shimmer;\n water += u_tint * softSpec + sparkle;\n\n float crest = smoothstep(0.02, 0.12, abs(h)) * fresnel;\n water += mix(u_tint, vec3(1.0), 0.4) * crest * 0.35;\n\n float vig = smoothstep(1.15, 0.35, length((uv - 0.5) * vec2(1.1, 1.0)));\n water *= 0.88 + 0.12 * vig;\n water += (hash(uv * u_res + u_time) - 0.5) * 0.015;\n\n gl_FragColor = vec4(water, 1.0);\n}\n", u = (e) => {
|
|
9
|
+
let t = e.replace("#", ""), n = t.length === 3 ? t.split("").map((e) => e + e).join("") : t, r = Number.parseInt(n, 16);
|
|
10
|
+
return Number.isNaN(r) ? [
|
|
11
|
+
.22,
|
|
12
|
+
.74,
|
|
13
|
+
.97
|
|
14
|
+
] : [
|
|
15
|
+
(r >> 16 & 255) / 255,
|
|
16
|
+
(r >> 8 & 255) / 255,
|
|
17
|
+
(r & 255) / 255
|
|
18
|
+
];
|
|
19
|
+
}, d = (e, t, n) => {
|
|
20
|
+
let r = e.createShader(t);
|
|
21
|
+
return r ? (e.shaderSource(r, n), e.compileShader(r), e.getShaderParameter(r, e.COMPILE_STATUS) ? r : (e.deleteShader(r), null)) : null;
|
|
22
|
+
}, f = (e, t, n) => {
|
|
23
|
+
let r = d(e, e.VERTEX_SHADER, t), i = d(e, e.FRAGMENT_SHADER, n);
|
|
24
|
+
if (!r || !i) return null;
|
|
25
|
+
let a = e.createProgram();
|
|
26
|
+
return a ? (e.attachShader(a, r), e.attachShader(a, i), e.linkProgram(a), e.deleteShader(r), e.deleteShader(i), e.getProgramParameter(a, e.LINK_STATUS) ? a : (e.deleteProgram(a), null)) : null;
|
|
27
|
+
}, p = 192, m = ({ width: d = 800, height: m = 500, fromColor: h = "#52ade3", toColor: g = "#013565", color: _ = "#a8d8f5", waveAmplitude: v = 1, waveSpeed: y = 1, shimmer: b = 1, reflection: x = .38, rippleStrength: S = 1, rippleRadius: C = 6, damping: w = .985, spread: T = .5, interactive: E = !0, showHint: D = !0, hint: O = "点击水面产生涟漪" }) => {
|
|
28
|
+
let k = n(null), A = n(0), j = n(null), M = n({
|
|
29
|
+
fromColor: h,
|
|
30
|
+
toColor: g,
|
|
31
|
+
color: _,
|
|
32
|
+
waveAmplitude: v,
|
|
33
|
+
waveSpeed: y,
|
|
34
|
+
shimmer: b,
|
|
35
|
+
reflection: x,
|
|
36
|
+
rippleStrength: S,
|
|
37
|
+
rippleRadius: C,
|
|
38
|
+
damping: w,
|
|
39
|
+
spread: T,
|
|
40
|
+
interactive: E
|
|
41
|
+
});
|
|
42
|
+
t(() => {
|
|
43
|
+
M.current = {
|
|
44
|
+
fromColor: h,
|
|
45
|
+
toColor: g,
|
|
46
|
+
color: _,
|
|
47
|
+
waveAmplitude: v,
|
|
48
|
+
waveSpeed: y,
|
|
49
|
+
shimmer: b,
|
|
50
|
+
reflection: x,
|
|
51
|
+
rippleStrength: S,
|
|
52
|
+
rippleRadius: C,
|
|
53
|
+
damping: w,
|
|
54
|
+
spread: T,
|
|
55
|
+
interactive: E
|
|
56
|
+
};
|
|
57
|
+
}, [
|
|
58
|
+
h,
|
|
59
|
+
g,
|
|
60
|
+
_,
|
|
61
|
+
v,
|
|
62
|
+
y,
|
|
63
|
+
b,
|
|
64
|
+
x,
|
|
65
|
+
S,
|
|
66
|
+
C,
|
|
67
|
+
w,
|
|
68
|
+
T,
|
|
69
|
+
E
|
|
70
|
+
]);
|
|
71
|
+
let N = e((e, t) => {
|
|
72
|
+
if (!M.current.interactive) return;
|
|
73
|
+
let n = k.current;
|
|
11
74
|
if (!n) return;
|
|
12
|
-
let r = n.getBoundingClientRect()
|
|
13
|
-
|
|
14
|
-
x:
|
|
15
|
-
y:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
}, [c, s]);
|
|
75
|
+
let r = n.getBoundingClientRect();
|
|
76
|
+
j.current = {
|
|
77
|
+
x: (e - r.left) / r.width,
|
|
78
|
+
y: 1 - (t - r.top) / r.height,
|
|
79
|
+
strength: M.current.rippleStrength
|
|
80
|
+
};
|
|
81
|
+
}, []);
|
|
21
82
|
return t(() => {
|
|
22
|
-
let e =
|
|
83
|
+
let e = k.current;
|
|
23
84
|
if (!e) return;
|
|
24
|
-
let t = (e) =>
|
|
85
|
+
let t = (e) => N(e.clientX, e.clientY), n = (e) => {
|
|
25
86
|
let t = e.touches[0];
|
|
26
|
-
t &&
|
|
87
|
+
t && N(t.clientX, t.clientY);
|
|
27
88
|
};
|
|
28
89
|
return e.addEventListener("click", t), e.addEventListener("touchstart", n, { passive: !0 }), () => {
|
|
29
90
|
e.removeEventListener("click", t), e.removeEventListener("touchstart", n);
|
|
30
91
|
};
|
|
31
|
-
}, [
|
|
32
|
-
let e =
|
|
92
|
+
}, [N]), t(() => {
|
|
93
|
+
let e = k.current;
|
|
33
94
|
if (!e) return;
|
|
34
|
-
let t = window.devicePixelRatio || 1;
|
|
35
|
-
e.width =
|
|
36
|
-
let n = e.getContext("
|
|
95
|
+
let t = Math.min(window.devicePixelRatio || 1, 2);
|
|
96
|
+
e.width = Math.floor(d * t), e.height = Math.floor(m * t);
|
|
97
|
+
let n = e.getContext("webgl", {
|
|
98
|
+
alpha: !1,
|
|
99
|
+
antialias: !1,
|
|
100
|
+
depth: !1,
|
|
101
|
+
stencil: !1,
|
|
102
|
+
premultipliedAlpha: !1
|
|
103
|
+
});
|
|
37
104
|
if (!n) return;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
105
|
+
let a = f(n, c, l);
|
|
106
|
+
if (!a) return;
|
|
107
|
+
let o = n.createBuffer();
|
|
108
|
+
n.bindBuffer(n.ARRAY_BUFFER, o), n.bufferData(n.ARRAY_BUFFER, new Float32Array([
|
|
109
|
+
-1,
|
|
110
|
+
-1,
|
|
111
|
+
1,
|
|
112
|
+
-1,
|
|
113
|
+
-1,
|
|
114
|
+
1,
|
|
115
|
+
1,
|
|
116
|
+
1
|
|
117
|
+
]), n.STATIC_DRAW);
|
|
118
|
+
let s = n.getAttribLocation(a, "a_pos"), h = n.getUniformLocation(a, "u_time"), g = n.getUniformLocation(a, "u_res"), _ = n.getUniformLocation(a, "u_tint"), v = n.getUniformLocation(a, "u_from"), y = n.getUniformLocation(a, "u_to"), b = n.getUniformLocation(a, "u_height"), x = n.getUniformLocation(a, "u_sim"), S = n.getUniformLocation(a, "u_waveAmp"), C = n.getUniformLocation(a, "u_waveSpeed"), w = n.getUniformLocation(a, "u_shimmer"), T = n.getUniformLocation(a, "u_reflection"), E = p * p, D = new Float32Array(E), O = new Float32Array(E), N = new Float32Array(E), P = n.createTexture();
|
|
119
|
+
n.bindTexture(n.TEXTURE_2D, P), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MIN_FILTER, n.LINEAR), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MAG_FILTER, n.LINEAR), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_S, n.CLAMP_TO_EDGE), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_T, n.CLAMP_TO_EDGE);
|
|
120
|
+
let F = new Uint8Array(E * 4), I = () => {
|
|
121
|
+
for (let e = 0; e < E; e++) {
|
|
122
|
+
let t = Math.max(0, Math.min(255, Math.floor((O[e] * .5 + .5) * 255))), n = e * 4;
|
|
123
|
+
F[n] = t, F[n + 1] = t, F[n + 2] = t, F[n + 3] = 255;
|
|
124
|
+
}
|
|
125
|
+
n.bindTexture(n.TEXTURE_2D, P), n.texImage2D(n.TEXTURE_2D, 0, n.RGBA, p, p, 0, n.RGBA, n.UNSIGNED_BYTE, F);
|
|
126
|
+
}, L = (e, t, n, r) => {
|
|
127
|
+
let a = e * (p - 1), o = t * (p - 1), s = i(r, 2, 12);
|
|
128
|
+
for (let e = -s - 1; e <= s + 1; e++) for (let t = -s - 1; t <= s + 1; t++) {
|
|
129
|
+
let r = Math.round(a + t), i = Math.round(o + e);
|
|
130
|
+
if (r <= 0 || r >= p - 1 || i <= 0 || i >= p - 1) continue;
|
|
131
|
+
let c = Math.sqrt(t * t + e * e), l = Math.exp(-c * c * .55) * -.35, u = Math.exp(-((c - s * .55) ** 2) * .9);
|
|
132
|
+
O[i * p + r] += n * (l + u * 1.1);
|
|
133
|
+
}
|
|
134
|
+
}, R = (e, t) => {
|
|
135
|
+
let n = i(e, .9, .999), r = i(t, .3, .7);
|
|
136
|
+
for (let e = 0; e < 2; e++) {
|
|
137
|
+
for (let e = 1; e < p - 1; e++) {
|
|
138
|
+
let t = e * p;
|
|
139
|
+
for (let e = 1; e < p - 1; e++) {
|
|
140
|
+
let i = t + e, a = O[i - 1] + O[i + 1] + O[i - p] + O[i + p];
|
|
141
|
+
N[i] = (a * r - D[i]) * n, N[i] > 1.5 ? N[i] = 1.5 : N[i] < -1.5 && (N[i] = -1.5);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
let e = D;
|
|
145
|
+
D = O, O = N, N = e, N.fill(0);
|
|
146
|
+
}
|
|
147
|
+
}, z = document.hidden, B = r((e) => {
|
|
148
|
+
z = e;
|
|
149
|
+
}), V = performance.now();
|
|
150
|
+
I();
|
|
151
|
+
let H = (t) => {
|
|
152
|
+
if (A.current = requestAnimationFrame(H), z) return;
|
|
153
|
+
let r = M.current;
|
|
154
|
+
if (j.current) {
|
|
155
|
+
let e = j.current, t = i(e.strength, 0, 3), n = r.rippleRadius;
|
|
156
|
+
L(e.x, e.y, t, n), L(e.x + .004, e.y - .003, t * .35, n), j.current = null;
|
|
157
|
+
}
|
|
158
|
+
R(r.damping, r.spread), I();
|
|
159
|
+
let c = u(r.color), l = u(r.fromColor), d = u(r.toColor);
|
|
160
|
+
n.viewport(0, 0, e.width, e.height), n.useProgram(a), n.bindBuffer(n.ARRAY_BUFFER, o), n.enableVertexAttribArray(s), n.vertexAttribPointer(s, 2, n.FLOAT, !1, 0, 0), n.activeTexture(n.TEXTURE0), n.bindTexture(n.TEXTURE_2D, P), n.uniform1i(b, 0), n.uniform1f(h, (t - V) / 1e3), n.uniform2f(g, e.width, e.height), n.uniform3f(_, c[0], c[1], c[2]), n.uniform3f(v, l[0], l[1], l[2]), n.uniform3f(y, d[0], d[1], d[2]), n.uniform2f(x, p, p), n.uniform1f(S, i(r.waveAmplitude, 0, 2)), n.uniform1f(C, i(r.waveSpeed, 0, 3)), n.uniform1f(w, i(r.shimmer, 0, 2)), n.uniform1f(T, i(r.reflection, 0, 1)), n.drawArrays(n.TRIANGLE_STRIP, 0, 4);
|
|
46
161
|
};
|
|
47
|
-
return
|
|
48
|
-
cancelAnimationFrame(
|
|
162
|
+
return A.current = requestAnimationFrame(H), () => {
|
|
163
|
+
cancelAnimationFrame(A.current), B(), n.deleteTexture(P), n.deleteBuffer(o), n.deleteProgram(a);
|
|
49
164
|
};
|
|
50
|
-
}, [
|
|
51
|
-
|
|
52
|
-
c,
|
|
53
|
-
s
|
|
54
|
-
]), /* @__PURE__ */ a("div", {
|
|
55
|
-
className: o.rippleWater,
|
|
165
|
+
}, [m, d]), /* @__PURE__ */ o("div", {
|
|
166
|
+
className: s.rippleWater,
|
|
56
167
|
style: {
|
|
57
|
-
width:
|
|
58
|
-
height:
|
|
168
|
+
width: d,
|
|
169
|
+
height: m
|
|
59
170
|
},
|
|
60
|
-
children: [/* @__PURE__ */
|
|
61
|
-
ref:
|
|
62
|
-
className:
|
|
171
|
+
children: [/* @__PURE__ */ a("canvas", {
|
|
172
|
+
ref: k,
|
|
173
|
+
className: s.canvas,
|
|
63
174
|
style: {
|
|
64
|
-
width:
|
|
65
|
-
height:
|
|
175
|
+
width: d,
|
|
176
|
+
height: m,
|
|
177
|
+
cursor: E ? "pointer" : "default"
|
|
66
178
|
}
|
|
67
|
-
}), /* @__PURE__ */
|
|
68
|
-
className:
|
|
69
|
-
children:
|
|
70
|
-
})]
|
|
179
|
+
}), D ? /* @__PURE__ */ a("span", {
|
|
180
|
+
className: s.hint,
|
|
181
|
+
children: O
|
|
182
|
+
}) : null]
|
|
71
183
|
});
|
|
72
184
|
};
|
|
73
185
|
//#endregion
|
|
74
|
-
export {
|
|
186
|
+
export { m as RippleWater, m as default };
|
|
@@ -2,8 +2,34 @@ import { default as React } from 'react';
|
|
|
2
2
|
export interface RippleWaterProps {
|
|
3
3
|
width?: number;
|
|
4
4
|
height?: number;
|
|
5
|
-
/**
|
|
5
|
+
/** 水面渐变浅端(左上) */
|
|
6
|
+
fromColor?: string;
|
|
7
|
+
/** 水面渐变深端(右下) */
|
|
8
|
+
toColor?: string;
|
|
9
|
+
/** 涟漪高光色 */
|
|
6
10
|
color?: string;
|
|
11
|
+
/** 环境波浪强度 0~2,默认 1 */
|
|
12
|
+
waveAmplitude?: number;
|
|
13
|
+
/** 环境波浪速度 0~3,默认 1 */
|
|
14
|
+
waveSpeed?: number;
|
|
15
|
+
/** 波光闪烁强度 0~2,默认 1 */
|
|
16
|
+
shimmer?: number;
|
|
17
|
+
/** 水面反射强度 0~1,默认 0.38 */
|
|
18
|
+
reflection?: number;
|
|
19
|
+
/** 点击涟漪力度 0~3,默认 1 */
|
|
20
|
+
rippleStrength?: number;
|
|
21
|
+
/** 涟漪落点半径(仿真格点 2~12),默认 6 */
|
|
22
|
+
rippleRadius?: number;
|
|
23
|
+
/** 涟漪衰减 0.9~0.999,越大越持久,默认 0.985 */
|
|
24
|
+
damping?: number;
|
|
25
|
+
/** 涟漪传播速度 0.3~0.7,默认 0.5 */
|
|
26
|
+
spread?: number;
|
|
27
|
+
/** 是否响应点击/触摸产生涟漪,默认 true */
|
|
28
|
+
interactive?: boolean;
|
|
29
|
+
/** 是否显示底部提示,默认 true */
|
|
30
|
+
showHint?: boolean;
|
|
31
|
+
/** 底部提示文案 */
|
|
32
|
+
hint?: string;
|
|
7
33
|
}
|
|
8
34
|
declare const RippleWater: React.FC<RippleWaterProps>;
|
|
9
35
|
export default RippleWater;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cos-design/ripple-water",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.3",
|
|
4
4
|
"description": "RippleWater component from cos-design",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -52,6 +52,6 @@
|
|
|
52
52
|
"registry": "https://registry.npmjs.org"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@cos-design/shared": "3.5.
|
|
55
|
+
"@cos-design/shared": "3.5.3"
|
|
56
56
|
}
|
|
57
57
|
}
|