@sliiu/present-transition-fx 0.0.0-stage → 0.1.1

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 (48) hide show
  1. package/COPYRIGHT +5 -0
  2. package/LICENSE +661 -0
  3. package/README.md +8 -2
  4. package/THIRD-PARTY-NOTICES.md +221 -0
  5. package/dist/cjs/2d.js +487 -0
  6. package/dist/cjs/3d.js +566 -0
  7. package/dist/cjs/geometry.js +141 -0
  8. package/dist/cjs/index.js +98 -0
  9. package/dist/cjs/morph-audit.js +603 -0
  10. package/dist/cjs/morph-match.js +103 -0
  11. package/dist/cjs/morph-path.js +649 -0
  12. package/dist/cjs/morph.js +223 -0
  13. package/dist/cjs/package.json +1 -0
  14. package/dist/cjs/registry.js +130 -0
  15. package/dist/cjs/snapshot.js +420 -0
  16. package/dist/cjs/twin.js +88 -0
  17. package/dist/cjs/types.js +2 -0
  18. package/dist/cjs/util.js +50 -0
  19. package/dist/cjs/webgl.js +271 -0
  20. package/dist/esm/2d.js +454 -0
  21. package/dist/esm/3d.js +538 -0
  22. package/dist/esm/geometry.js +127 -0
  23. package/dist/esm/index.js +6 -0
  24. package/dist/esm/morph-audit.js +558 -0
  25. package/dist/esm/morph-match.js +97 -0
  26. package/dist/esm/morph-path.js +636 -0
  27. package/dist/esm/morph.js +219 -0
  28. package/dist/esm/registry.js +91 -0
  29. package/dist/esm/snapshot.js +414 -0
  30. package/dist/esm/twin.js +84 -0
  31. package/dist/esm/types.js +1 -0
  32. package/dist/esm/util.js +43 -0
  33. package/dist/esm/webgl.js +231 -0
  34. package/dist/types/2d.d.ts +40 -0
  35. package/dist/types/3d.d.ts +38 -0
  36. package/dist/types/geometry.d.ts +38 -0
  37. package/dist/types/index.d.ts +7 -0
  38. package/dist/types/morph-audit.d.ts +127 -0
  39. package/dist/types/morph-match.d.ts +28 -0
  40. package/dist/types/morph-path.d.ts +37 -0
  41. package/dist/types/morph.d.ts +2 -0
  42. package/dist/types/registry.d.ts +6 -0
  43. package/dist/types/snapshot.d.ts +19 -0
  44. package/dist/types/twin.d.ts +2 -0
  45. package/dist/types/types.d.ts +13 -0
  46. package/dist/types/util.d.ts +12 -0
  47. package/dist/types/webgl.d.ts +5 -0
  48. package/package.json +36 -4
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.dissolveWebGL = exports.boxWebGL = exports.cubeWebGL = exports.pageCurlWebGL = void 0;
37
+ const fx2d = __importStar(require("./2d"));
38
+ const fx3d = __importStar(require("./3d"));
39
+ const snapshot_1 = require("./snapshot");
40
+ const util_1 = require("./util");
41
+ function compile(gl, type, src) {
42
+ const sh = gl.createShader(type);
43
+ if (!sh)
44
+ return null;
45
+ gl.shaderSource(sh, src);
46
+ gl.compileShader(sh);
47
+ if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {
48
+ gl.deleteShader(sh);
49
+ return null;
50
+ }
51
+ return sh;
52
+ }
53
+ function program(gl, vs, fs) {
54
+ const v = compile(gl, gl.VERTEX_SHADER, vs);
55
+ const f = compile(gl, gl.FRAGMENT_SHADER, fs);
56
+ if (!v || !f)
57
+ return null;
58
+ const p = gl.createProgram();
59
+ if (!p)
60
+ return null;
61
+ gl.attachShader(p, v);
62
+ gl.attachShader(p, f);
63
+ gl.bindAttribLocation(p, 0, "aPos");
64
+ gl.linkProgram(p);
65
+ if (!gl.getProgramParameter(p, gl.LINK_STATUS)) {
66
+ gl.deleteProgram(p);
67
+ return null;
68
+ }
69
+ return p;
70
+ }
71
+ function uploadTexture(gl, canvas) {
72
+ const tex = gl.createTexture();
73
+ if (!tex)
74
+ return null;
75
+ gl.bindTexture(gl.TEXTURE_2D, tex);
76
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
77
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
78
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
79
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
80
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
81
+ try {
82
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);
83
+ }
84
+ catch {
85
+ // 画布被跨域资源弄脏时浏览器抛 SecurityError。删掉纹理,让切换改走 CSS。
86
+ gl.deleteTexture(tex);
87
+ return null;
88
+ }
89
+ return tex;
90
+ }
91
+ const VS = `attribute vec2 aPos; varying vec2 vUv; void main(){ vUv = aPos * 0.5 + 0.5; gl_Position = vec4(aPos, 0.0, 1.0); }`;
92
+ const FS_PAGE_CURL = `
93
+ precision highp float;
94
+ varying vec2 vUv;
95
+ uniform sampler2D uFrom;
96
+ uniform sampler2D uTo;
97
+ uniform float uProgress;
98
+ const float MIN_AMOUNT = -0.16;
99
+ const float MAX_AMOUNT = 1.5;
100
+ float amount() { return uProgress * (MAX_AMOUNT - MIN_AMOUNT) + MIN_AMOUNT; }
101
+ const float PI = 3.141592653589793;
102
+ const float scale = 512.0;
103
+ const float sharpness = 3.0;
104
+
105
+ float cylinder(float r) {
106
+ float amt = amount();
107
+ return atan(r, 1.0 - amt);
108
+ }
109
+
110
+ void main() {
111
+ vec2 uv = vUv;
112
+ float a = amount();
113
+ float dist = (uv.x - 1.0) * (uv.x - 1.0) + (uv.y - 1.0) * (uv.y - 1.0);
114
+ vec2 fromCoord = uv;
115
+ vec4 colorFrom = texture2D(uFrom, fromCoord);
116
+ vec4 colorTo = texture2D(uTo, uv);
117
+ float radius = 0.1 + a * 0.4;
118
+ vec2 center = vec2(1.0 - a, 1.0 - a);
119
+ float d = length(uv - center);
120
+ float curl = smoothstep(radius, radius + 0.05, d);
121
+ vec4 res = mix(colorTo, colorFrom, curl);
122
+ // Shadow under the curl
123
+ float shadow = smoothstep(radius - 0.08, radius, d) * (1.0 - smoothstep(radius, radius + 0.04, d));
124
+ res.rgb *= 1.0 - 0.35 * shadow * (1.0 - uProgress);
125
+ gl_FragColor = res;
126
+ }`;
127
+ const FS_CUBE = `
128
+ precision highp float;
129
+ varying vec2 vUv;
130
+ uniform sampler2D uFrom;
131
+ uniform sampler2D uTo;
132
+ uniform float uProgress;
133
+ uniform float uDir;
134
+ void main() {
135
+ float p = uProgress;
136
+ vec2 uv = vUv;
137
+ float face = uv.x + (uDir > 0.0 ? -p : p);
138
+ if (face < 0.0 || face > 1.0) {
139
+ vec2 to = vec2(face < 0.0 ? face + 1.0 : face - 1.0, uv.y);
140
+ gl_FragColor = texture2D(uTo, to);
141
+ } else {
142
+ gl_FragColor = texture2D(uFrom, vec2(face, uv.y));
143
+ }
144
+ }`;
145
+ const FS_DISSOLVE = `
146
+ precision highp float;
147
+ varying vec2 vUv;
148
+ uniform sampler2D uFrom;
149
+ uniform sampler2D uTo;
150
+ uniform float uProgress;
151
+ float rand(vec2 co){ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); }
152
+ void main(){
153
+ float n = rand(vUv);
154
+ gl_FragColor = (n < uProgress) ? texture2D(uTo, vUv) : texture2D(uFrom, vUv);
155
+ }`;
156
+ async function runWebGLTransition(ctx, fragment, uniforms = () => undefined) {
157
+ const w = ctx.stageSize.w;
158
+ const h = ctx.stageSize.h;
159
+ const cache = new Map();
160
+ const [from, to] = await Promise.all([
161
+ (0, snapshot_1.snapshotElement)(ctx.ghost, w, h, cache),
162
+ (0, snapshot_1.snapshotElement)(ctx.stage, w, h, cache),
163
+ ]);
164
+ if (!from || !to)
165
+ return false;
166
+ const canvas = document.createElement("canvas");
167
+ canvas.width = w;
168
+ canvas.height = h;
169
+ Object.assign(canvas.style, {
170
+ position: "absolute",
171
+ left: ctx.stage.style.left || `${ctx.stage.offsetLeft}px`,
172
+ top: ctx.stage.style.top || `${ctx.stage.offsetTop}px`,
173
+ width: ctx.stage.style.width || `${w}px`,
174
+ height: ctx.stage.style.height || `${h}px`,
175
+ transform: ctx.stage.style.transform || "",
176
+ transformOrigin: ctx.stage.style.transformOrigin || "center center",
177
+ zIndex: "3",
178
+ pointerEvents: "none",
179
+ });
180
+ const ghostVis = ctx.ghost.style.visibility;
181
+ const stageVis = ctx.stage.style.visibility;
182
+ let gl = null;
183
+ let succeeded = false;
184
+ ctx.stage.parentElement?.appendChild(canvas);
185
+ try {
186
+ gl = canvas.getContext("webgl", { premultipliedAlpha: true });
187
+ if (!gl)
188
+ return false;
189
+ const prog = program(gl, VS, fragment);
190
+ if (!prog)
191
+ return false;
192
+ const buf = gl.createBuffer();
193
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf);
194
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);
195
+ gl.enableVertexAttribArray(0);
196
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
197
+ const tFrom = uploadTexture(gl, from.canvas);
198
+ const tTo = uploadTexture(gl, to.canvas);
199
+ if (!tFrom || !tTo)
200
+ return false;
201
+ gl.useProgram(prog);
202
+ gl.activeTexture(gl.TEXTURE0);
203
+ gl.bindTexture(gl.TEXTURE_2D, tFrom);
204
+ gl.uniform1i(gl.getUniformLocation(prog, "uFrom"), 0);
205
+ gl.activeTexture(gl.TEXTURE1);
206
+ gl.bindTexture(gl.TEXTURE_2D, tTo);
207
+ gl.uniform1i(gl.getUniformLocation(prog, "uTo"), 1);
208
+ const uP = gl.getUniformLocation(prog, "uProgress");
209
+ uniforms(gl, prog);
210
+ ctx.ghost.style.visibility = "hidden";
211
+ ctx.stage.style.visibility = "hidden";
212
+ const duration = (0, util_1.ms)(ctx);
213
+ const start = performance.now();
214
+ const glCtx = gl;
215
+ await new Promise((resolve) => {
216
+ const step = () => {
217
+ try {
218
+ const t = Math.min(1, (performance.now() - start) / Math.max(1, duration));
219
+ glCtx.viewport(0, 0, canvas.width, canvas.height);
220
+ glCtx.clearColor(0, 0, 0, 0);
221
+ glCtx.clear(glCtx.COLOR_BUFFER_BIT);
222
+ glCtx.uniform1f(uP, t);
223
+ glCtx.drawArrays(glCtx.TRIANGLE_STRIP, 0, 4);
224
+ if (t < 1)
225
+ requestAnimationFrame(step);
226
+ else
227
+ resolve();
228
+ }
229
+ catch {
230
+ resolve();
231
+ }
232
+ };
233
+ requestAnimationFrame(step);
234
+ });
235
+ succeeded = true;
236
+ return true;
237
+ }
238
+ catch {
239
+ return false;
240
+ }
241
+ finally {
242
+ canvas.remove();
243
+ ctx.stage.style.visibility = stageVis;
244
+ if (!succeeded)
245
+ ctx.ghost.style.visibility = ghostVis;
246
+ gl?.getExtension("WEBGL_lose_context")?.loseContext();
247
+ }
248
+ }
249
+ const pageCurlWebGL = async (ctx) => {
250
+ const ok = await runWebGLTransition(ctx, FS_PAGE_CURL);
251
+ if (!ok)
252
+ await fx3d.pageCurl(ctx);
253
+ };
254
+ exports.pageCurlWebGL = pageCurlWebGL;
255
+ const cubeWebGL = async (ctx) => {
256
+ const dir = String(ctx.params.dir ?? "left");
257
+ const ok = await runWebGLTransition(ctx, FS_CUBE, (gl, p) => {
258
+ gl.uniform1f(gl.getUniformLocation(p, "uDir"), dir === "left" || dir === "up" ? 1 : -1);
259
+ });
260
+ if (!ok)
261
+ await fx3d.cube(ctx);
262
+ };
263
+ exports.cubeWebGL = cubeWebGL;
264
+ const boxWebGL = (ctx) => fx3d.box(ctx);
265
+ exports.boxWebGL = boxWebGL;
266
+ const dissolveWebGL = async (ctx) => {
267
+ const ok = await runWebGLTransition(ctx, FS_DISSOLVE);
268
+ if (!ok)
269
+ await fx2d.dissolve(ctx);
270
+ };
271
+ exports.dissolveWebGL = dissolveWebGL;