@edinstvo/glass 0.0.0-stage → 0.1.0-alpha.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.
- package/LICENSE +21 -0
- package/README.md +141 -2
- package/css/glass.css +33 -0
- package/dist/backdrop.d.ts +11 -0
- package/dist/backdrop.js +104 -0
- package/dist/backdrop.js.map +1 -0
- package/dist/color.d.ts +4 -0
- package/dist/color.js +29 -0
- package/dist/color.js.map +1 -0
- package/dist/define.d.ts +1 -0
- package/dist/define.js +3 -0
- package/dist/define.js.map +1 -0
- package/dist/element.d.ts +26 -0
- package/dist/element.js +113 -0
- package/dist/element.js.map +1 -0
- package/dist/geometry.d.ts +17 -0
- package/dist/geometry.js +27 -0
- package/dist/geometry.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +47 -0
- package/dist/interaction.js +91 -0
- package/dist/interaction.js.map +1 -0
- package/dist/material.d.ts +114 -0
- package/dist/material.js +44 -0
- package/dist/material.js.map +1 -0
- package/dist/renderer.d.ts +43 -0
- package/dist/renderer.js +231 -0
- package/dist/renderer.js.map +1 -0
- package/dist/shader.d.ts +3 -0
- package/dist/shader.js +109 -0
- package/dist/shader.js.map +1 -0
- package/dist/surface.d.ts +43 -0
- package/dist/surface.js +224 -0
- package/dist/surface.js.map +1 -0
- package/package.json +52 -4
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export const interactions = {
|
|
2
|
+
none: { follow: 0, press: 0, stretch: 0 },
|
|
3
|
+
calm: { follow: 0.5, press: 0.4, stretch: 0 },
|
|
4
|
+
lively: { follow: 1, press: 1, stretch: 1 },
|
|
5
|
+
};
|
|
6
|
+
export class Spring {
|
|
7
|
+
stiffness;
|
|
8
|
+
damping;
|
|
9
|
+
value;
|
|
10
|
+
target;
|
|
11
|
+
velocity = 0;
|
|
12
|
+
constructor(value = 0, stiffness = 260, damping = 20) {
|
|
13
|
+
this.stiffness = stiffness;
|
|
14
|
+
this.damping = damping;
|
|
15
|
+
this.value = this.target = value;
|
|
16
|
+
}
|
|
17
|
+
step(dt) {
|
|
18
|
+
this.velocity += ((this.target - this.value) * this.stiffness - this.velocity * this.damping) * dt;
|
|
19
|
+
this.value += this.velocity * dt;
|
|
20
|
+
if (this.settled) {
|
|
21
|
+
this.value = this.target;
|
|
22
|
+
this.velocity = 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
get settled() {
|
|
26
|
+
return Math.abs(this.target - this.value) < 0.001 && Math.abs(this.velocity) < 0.01;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class Motion {
|
|
30
|
+
host;
|
|
31
|
+
wake;
|
|
32
|
+
x = new Spring();
|
|
33
|
+
y = new Spring();
|
|
34
|
+
held = new Spring();
|
|
35
|
+
springs = [this.x, this.y, this.held];
|
|
36
|
+
cleanup = null;
|
|
37
|
+
constructor(host, wake) {
|
|
38
|
+
this.host = host;
|
|
39
|
+
this.wake = wake;
|
|
40
|
+
}
|
|
41
|
+
get moving() {
|
|
42
|
+
return this.springs.some((spring) => !spring.settled);
|
|
43
|
+
}
|
|
44
|
+
attach() {
|
|
45
|
+
const { host } = this;
|
|
46
|
+
const move = (event) => {
|
|
47
|
+
const rect = host.getBoundingClientRect();
|
|
48
|
+
this.x.target = ((event.clientX - rect.left) / rect.width) * 2 - 1;
|
|
49
|
+
this.y.target = ((event.clientY - rect.top) / rect.height) * 2 - 1;
|
|
50
|
+
this.wake();
|
|
51
|
+
};
|
|
52
|
+
const leave = () => {
|
|
53
|
+
this.x.target = this.y.target = this.held.target = 0;
|
|
54
|
+
this.wake();
|
|
55
|
+
};
|
|
56
|
+
const down = () => {
|
|
57
|
+
this.held.target = 1;
|
|
58
|
+
this.wake();
|
|
59
|
+
};
|
|
60
|
+
const up = () => {
|
|
61
|
+
this.held.target = 0;
|
|
62
|
+
this.wake();
|
|
63
|
+
};
|
|
64
|
+
host.addEventListener("pointermove", move);
|
|
65
|
+
host.addEventListener("pointerleave", leave);
|
|
66
|
+
host.addEventListener("pointerdown", down);
|
|
67
|
+
addEventListener("pointerup", up);
|
|
68
|
+
this.cleanup = () => {
|
|
69
|
+
host.removeEventListener("pointermove", move);
|
|
70
|
+
host.removeEventListener("pointerleave", leave);
|
|
71
|
+
host.removeEventListener("pointerdown", down);
|
|
72
|
+
removeEventListener("pointerup", up);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
detach() {
|
|
76
|
+
this.cleanup?.();
|
|
77
|
+
this.cleanup = null;
|
|
78
|
+
this.host.style.scale = "";
|
|
79
|
+
}
|
|
80
|
+
step(dt, interaction) {
|
|
81
|
+
for (const spring of this.springs)
|
|
82
|
+
spring.step(dt);
|
|
83
|
+
const grow = this.held.value * interaction.press * 0.05;
|
|
84
|
+
const pull = this.held.value * interaction.stretch * 0.04;
|
|
85
|
+
const sideways = Math.abs(this.x.value) - Math.abs(this.y.value);
|
|
86
|
+
const scaleX = 1 + grow + pull * sideways;
|
|
87
|
+
const scaleY = 1 + grow - pull * sideways;
|
|
88
|
+
this.host.style.scale = scaleX === 1 && scaleY === 1 ? "" : `${scaleX} ${scaleY}`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export interface Material {
|
|
2
|
+
bloom: number;
|
|
3
|
+
light: number;
|
|
4
|
+
glint: number;
|
|
5
|
+
rim: number;
|
|
6
|
+
lift: number;
|
|
7
|
+
lightAngle: number;
|
|
8
|
+
transparency: number;
|
|
9
|
+
refraction: number;
|
|
10
|
+
depth: number;
|
|
11
|
+
dispersion: number;
|
|
12
|
+
frost: number;
|
|
13
|
+
splay: number;
|
|
14
|
+
tint: string;
|
|
15
|
+
}
|
|
16
|
+
export type NumericKey = Exclude<keyof Material, "tint">;
|
|
17
|
+
export declare const ranges: Record<NumericKey, readonly [number, number]>;
|
|
18
|
+
export declare const numericKeys: NumericKey[];
|
|
19
|
+
export declare const presets: {
|
|
20
|
+
readonly pure: {
|
|
21
|
+
readonly bloom: 0.15;
|
|
22
|
+
readonly light: 0.5;
|
|
23
|
+
readonly glint: 0;
|
|
24
|
+
readonly rim: 0.5;
|
|
25
|
+
readonly lift: 0;
|
|
26
|
+
readonly lightAngle: -45;
|
|
27
|
+
readonly transparency: 0.99;
|
|
28
|
+
readonly refraction: 0.55;
|
|
29
|
+
readonly depth: 18;
|
|
30
|
+
readonly dispersion: 0.3;
|
|
31
|
+
readonly frost: 0;
|
|
32
|
+
readonly splay: 0.1;
|
|
33
|
+
readonly tint: "auto";
|
|
34
|
+
};
|
|
35
|
+
readonly clear: {
|
|
36
|
+
readonly bloom: 0.2;
|
|
37
|
+
readonly light: 0.3;
|
|
38
|
+
readonly glint: 0;
|
|
39
|
+
readonly rim: 0.35;
|
|
40
|
+
readonly lift: 0.05;
|
|
41
|
+
readonly lightAngle: -45;
|
|
42
|
+
readonly transparency: 0.8;
|
|
43
|
+
readonly refraction: 0.3;
|
|
44
|
+
readonly depth: 6;
|
|
45
|
+
readonly dispersion: 0.2;
|
|
46
|
+
readonly frost: 0.7;
|
|
47
|
+
readonly splay: 0;
|
|
48
|
+
readonly tint: "auto";
|
|
49
|
+
};
|
|
50
|
+
readonly regular: {
|
|
51
|
+
readonly bloom: 0.2;
|
|
52
|
+
readonly light: 0.3;
|
|
53
|
+
readonly glint: 0;
|
|
54
|
+
readonly rim: 0.35;
|
|
55
|
+
readonly lift: 0.15;
|
|
56
|
+
readonly lightAngle: -45;
|
|
57
|
+
readonly transparency: 0.85;
|
|
58
|
+
readonly refraction: 0.3;
|
|
59
|
+
readonly depth: 6;
|
|
60
|
+
readonly dispersion: 0.2;
|
|
61
|
+
readonly frost: 0.7;
|
|
62
|
+
readonly splay: 0;
|
|
63
|
+
readonly tint: "auto";
|
|
64
|
+
};
|
|
65
|
+
readonly frost: {
|
|
66
|
+
readonly bloom: 0.2;
|
|
67
|
+
readonly light: 0.4;
|
|
68
|
+
readonly glint: 0;
|
|
69
|
+
readonly rim: 0.5;
|
|
70
|
+
readonly lift: 0;
|
|
71
|
+
readonly lightAngle: -45;
|
|
72
|
+
readonly transparency: 0.8;
|
|
73
|
+
readonly refraction: 0.3;
|
|
74
|
+
readonly depth: 14;
|
|
75
|
+
readonly dispersion: 0.05;
|
|
76
|
+
readonly frost: 0.6;
|
|
77
|
+
readonly splay: 0.1;
|
|
78
|
+
readonly tint: "auto";
|
|
79
|
+
};
|
|
80
|
+
readonly lens: {
|
|
81
|
+
readonly bloom: 0.1;
|
|
82
|
+
readonly light: 0.6;
|
|
83
|
+
readonly glint: 0;
|
|
84
|
+
readonly rim: 0.5;
|
|
85
|
+
readonly lift: 0;
|
|
86
|
+
readonly lightAngle: -45;
|
|
87
|
+
readonly transparency: 1;
|
|
88
|
+
readonly refraction: 0.9;
|
|
89
|
+
readonly depth: 48;
|
|
90
|
+
readonly dispersion: 0.35;
|
|
91
|
+
readonly frost: 0;
|
|
92
|
+
readonly splay: 0.8;
|
|
93
|
+
readonly tint: "auto";
|
|
94
|
+
};
|
|
95
|
+
readonly prism: {
|
|
96
|
+
readonly bloom: 0.45;
|
|
97
|
+
readonly light: 0.7;
|
|
98
|
+
readonly glint: 0;
|
|
99
|
+
readonly rim: 0.5;
|
|
100
|
+
readonly lift: 0;
|
|
101
|
+
readonly lightAngle: -60;
|
|
102
|
+
readonly transparency: 0.97;
|
|
103
|
+
readonly refraction: 0.7;
|
|
104
|
+
readonly depth: 28;
|
|
105
|
+
readonly dispersion: 1;
|
|
106
|
+
readonly frost: 0.08;
|
|
107
|
+
readonly splay: 0.3;
|
|
108
|
+
readonly tint: "auto";
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
export type PresetName = keyof typeof presets;
|
|
112
|
+
export declare const clampValue: (key: NumericKey, value: number) => number;
|
|
113
|
+
export declare function resolveMaterial(...layers: (Partial<Material> | undefined)[]): Material;
|
|
114
|
+
export declare const kebab: (key: string) => string;
|
package/dist/material.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const ranges = {
|
|
2
|
+
bloom: [0, 1],
|
|
3
|
+
light: [0, 1],
|
|
4
|
+
glint: [0, 1],
|
|
5
|
+
rim: [0, 1],
|
|
6
|
+
lift: [0, 1],
|
|
7
|
+
lightAngle: [-180, 180],
|
|
8
|
+
transparency: [0, 1],
|
|
9
|
+
refraction: [0, 1],
|
|
10
|
+
depth: [0, 96],
|
|
11
|
+
dispersion: [0, 1],
|
|
12
|
+
frost: [0, 1],
|
|
13
|
+
splay: [0, 1],
|
|
14
|
+
};
|
|
15
|
+
export const numericKeys = Object.keys(ranges);
|
|
16
|
+
export const presets = {
|
|
17
|
+
pure: { bloom: 0.15, light: 0.5, glint: 0, rim: 0.5, lift: 0, lightAngle: -45, transparency: 0.99, refraction: 0.55, depth: 18, dispersion: 0.3, frost: 0, splay: 0.1, tint: "auto" },
|
|
18
|
+
clear: { bloom: 0.2, light: 0.3, glint: 0, rim: 0.35, lift: 0.05, lightAngle: -45, transparency: 0.8, refraction: 0.3, depth: 6, dispersion: 0.2, frost: 0.7, splay: 0, tint: "auto" },
|
|
19
|
+
regular: { bloom: 0.2, light: 0.3, glint: 0, rim: 0.35, lift: 0.15, lightAngle: -45, transparency: 0.85, refraction: 0.3, depth: 6, dispersion: 0.2, frost: 0.7, splay: 0, tint: "auto" },
|
|
20
|
+
frost: { bloom: 0.2, light: 0.4, glint: 0, rim: 0.5, lift: 0, lightAngle: -45, transparency: 0.8, refraction: 0.3, depth: 14, dispersion: 0.05, frost: 0.6, splay: 0.1, tint: "auto" },
|
|
21
|
+
lens: { bloom: 0.1, light: 0.6, glint: 0, rim: 0.5, lift: 0, lightAngle: -45, transparency: 1, refraction: 0.9, depth: 48, dispersion: 0.35, frost: 0, splay: 0.8, tint: "auto" },
|
|
22
|
+
prism: { bloom: 0.45, light: 0.7, glint: 0, rim: 0.5, lift: 0, lightAngle: -60, transparency: 0.97, refraction: 0.7, depth: 28, dispersion: 1, frost: 0.08, splay: 0.3, tint: "auto" },
|
|
23
|
+
};
|
|
24
|
+
export const clampValue = (key, value) => {
|
|
25
|
+
const [min, max] = ranges[key];
|
|
26
|
+
return Math.min(max, Math.max(min, value));
|
|
27
|
+
};
|
|
28
|
+
export function resolveMaterial(...layers) {
|
|
29
|
+
const result = { ...presets.regular };
|
|
30
|
+
for (const layer of layers) {
|
|
31
|
+
if (!layer)
|
|
32
|
+
continue;
|
|
33
|
+
for (const key of numericKeys) {
|
|
34
|
+
const value = layer[key];
|
|
35
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
36
|
+
result[key] = clampValue(key, value);
|
|
37
|
+
}
|
|
38
|
+
if (layer.tint)
|
|
39
|
+
result.tint = layer.tint;
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
export const kebab = (key) => key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
|
|
44
|
+
//# sourceMappingURL=material.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material.js","sourceRoot":"","sources":["../src/material.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Backdrop } from "./backdrop.js";
|
|
2
|
+
import type { Material } from "./material.js";
|
|
3
|
+
export interface DrawJob {
|
|
4
|
+
target: CanvasRenderingContext2D;
|
|
5
|
+
backdrop: Backdrop;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
pad: number;
|
|
9
|
+
size: readonly [number, number];
|
|
10
|
+
radius: number;
|
|
11
|
+
dpr: number;
|
|
12
|
+
uvOrigin: readonly [number, number];
|
|
13
|
+
uvPerPixel: readonly [number, number];
|
|
14
|
+
lightDir: readonly [number, number];
|
|
15
|
+
tint: readonly [number, number, number];
|
|
16
|
+
material: Material;
|
|
17
|
+
}
|
|
18
|
+
export declare class Renderer {
|
|
19
|
+
private static instance;
|
|
20
|
+
static get shared(): Renderer | null;
|
|
21
|
+
onRestore: (() => void) | null;
|
|
22
|
+
private canvas;
|
|
23
|
+
private gl;
|
|
24
|
+
private uniforms;
|
|
25
|
+
private textures;
|
|
26
|
+
private frame;
|
|
27
|
+
private lens;
|
|
28
|
+
private blurProgram;
|
|
29
|
+
private frameBuffer;
|
|
30
|
+
private lost;
|
|
31
|
+
private setup;
|
|
32
|
+
private link;
|
|
33
|
+
private compile;
|
|
34
|
+
private target;
|
|
35
|
+
private pass;
|
|
36
|
+
/** Gaussian at a size where sigma is 3 texels, so any strength costs the same 17 taps per axis. */
|
|
37
|
+
private blurred;
|
|
38
|
+
nextFrame(): void;
|
|
39
|
+
private shrink;
|
|
40
|
+
private bind;
|
|
41
|
+
/** Throws on a tainted source: a cross-origin image without CORS headers can't reach the GPU. */
|
|
42
|
+
draw(job: DrawJob): void;
|
|
43
|
+
}
|
package/dist/renderer.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { blurFragment, fragment, vertex } from "./shader.js";
|
|
2
|
+
const uniformNames = ["uCanvas", "uSize", "uUvOrigin", "uUvPerPx", "uTexSize", "uLightDir", "uTint", "uViewY", "uPad", "uRadius", "uDpr", "uLight", "uTransparency", "uRefraction", "uDepth", "uDispersion", "uFrost", "uSplay", "uBloom", "uGlint", "uRim", "uLift"];
|
|
3
|
+
const maxTextures = 8;
|
|
4
|
+
const maxTextureSide = 4096;
|
|
5
|
+
export class Renderer {
|
|
6
|
+
static instance;
|
|
7
|
+
static get shared() {
|
|
8
|
+
if (Renderer.instance === undefined) {
|
|
9
|
+
const renderer = new Renderer();
|
|
10
|
+
Renderer.instance = renderer.setup() ? renderer : null;
|
|
11
|
+
}
|
|
12
|
+
return Renderer.instance;
|
|
13
|
+
}
|
|
14
|
+
onRestore = null;
|
|
15
|
+
canvas = document.createElement("canvas");
|
|
16
|
+
gl;
|
|
17
|
+
uniforms = {};
|
|
18
|
+
textures = new Map();
|
|
19
|
+
frame = 0;
|
|
20
|
+
lens;
|
|
21
|
+
blurProgram;
|
|
22
|
+
frameBuffer = null;
|
|
23
|
+
lost = false;
|
|
24
|
+
setup() {
|
|
25
|
+
const gl = this.canvas.getContext("webgl2", { alpha: true, premultipliedAlpha: true, antialias: false, depth: false, stencil: false });
|
|
26
|
+
if (!gl)
|
|
27
|
+
return false;
|
|
28
|
+
this.gl = gl;
|
|
29
|
+
this.canvas.addEventListener("webglcontextlost", (event) => {
|
|
30
|
+
event.preventDefault();
|
|
31
|
+
this.lost = true;
|
|
32
|
+
});
|
|
33
|
+
this.canvas.addEventListener("webglcontextrestored", () => {
|
|
34
|
+
this.lost = false;
|
|
35
|
+
this.textures.clear();
|
|
36
|
+
this.compile();
|
|
37
|
+
this.onRestore?.();
|
|
38
|
+
});
|
|
39
|
+
return this.compile();
|
|
40
|
+
}
|
|
41
|
+
link(source) {
|
|
42
|
+
const { gl } = this;
|
|
43
|
+
const program = gl.createProgram();
|
|
44
|
+
for (const [type, code] of [[gl.VERTEX_SHADER, vertex], [gl.FRAGMENT_SHADER, source]]) {
|
|
45
|
+
const shader = gl.createShader(type);
|
|
46
|
+
if (!shader || !program)
|
|
47
|
+
return null;
|
|
48
|
+
gl.shaderSource(shader, code);
|
|
49
|
+
gl.compileShader(shader);
|
|
50
|
+
gl.attachShader(program, shader);
|
|
51
|
+
}
|
|
52
|
+
gl.linkProgram(program);
|
|
53
|
+
if (gl.getProgramParameter(program, gl.LINK_STATUS))
|
|
54
|
+
return program;
|
|
55
|
+
console.warn("@edinstvo/glass:", gl.getProgramInfoLog(program));
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
compile() {
|
|
59
|
+
const { gl } = this;
|
|
60
|
+
const lens = this.link(fragment);
|
|
61
|
+
const blur = this.link(blurFragment);
|
|
62
|
+
if (!lens || !blur)
|
|
63
|
+
return false;
|
|
64
|
+
this.lens = lens;
|
|
65
|
+
this.blurProgram = blur;
|
|
66
|
+
this.frameBuffer = gl.createFramebuffer();
|
|
67
|
+
gl.bindVertexArray(gl.createVertexArray());
|
|
68
|
+
gl.enable(gl.SCISSOR_TEST);
|
|
69
|
+
gl.useProgram(blur);
|
|
70
|
+
gl.uniform1i(gl.getUniformLocation(blur, "uSource"), 0);
|
|
71
|
+
gl.useProgram(lens);
|
|
72
|
+
gl.uniform1i(gl.getUniformLocation(lens, "uBackdrop"), 0);
|
|
73
|
+
gl.uniform1i(gl.getUniformLocation(lens, "uFrosted"), 1);
|
|
74
|
+
for (const name of uniformNames)
|
|
75
|
+
this.uniforms[name] = gl.getUniformLocation(lens, name);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
target(width, height) {
|
|
79
|
+
const { gl } = this;
|
|
80
|
+
const texture = gl.createTexture();
|
|
81
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
82
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
83
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
84
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
85
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);
|
|
86
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);
|
|
87
|
+
return texture;
|
|
88
|
+
}
|
|
89
|
+
pass(source, destination, width, height, step, lod) {
|
|
90
|
+
const { gl, blurProgram: program } = this;
|
|
91
|
+
const u = (name) => gl.getUniformLocation(program, name);
|
|
92
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer);
|
|
93
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, destination, 0);
|
|
94
|
+
gl.viewport(0, 0, width, height);
|
|
95
|
+
gl.scissor(0, 0, width, height);
|
|
96
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
97
|
+
gl.bindTexture(gl.TEXTURE_2D, source);
|
|
98
|
+
gl.uniform2f(u("uStep"), step[0], step[1]);
|
|
99
|
+
gl.uniform2f(u("uInvSize"), 1 / width, 1 / height);
|
|
100
|
+
gl.uniform1f(u("uLod"), lod);
|
|
101
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
102
|
+
}
|
|
103
|
+
/** Gaussian at a size where sigma is 3 texels, so any strength costs the same 17 taps per axis. */
|
|
104
|
+
blurred(entry, sigma) {
|
|
105
|
+
const { gl } = this;
|
|
106
|
+
const key = Math.round(sigma * 4) / 4;
|
|
107
|
+
const cached = entry.blurs.get(key);
|
|
108
|
+
if (cached && cached.frame === entry.frame)
|
|
109
|
+
return cached.texture;
|
|
110
|
+
if (cached)
|
|
111
|
+
gl.deleteTexture(cached.texture);
|
|
112
|
+
if (entry.blurs.size >= 4 && !cached) {
|
|
113
|
+
const [oldest, stale] = entry.blurs.entries().next().value;
|
|
114
|
+
gl.deleteTexture(stale.texture);
|
|
115
|
+
entry.blurs.delete(oldest);
|
|
116
|
+
}
|
|
117
|
+
const scale = Math.min(1, 3 / Math.max(key, 0.25));
|
|
118
|
+
const width = Math.max(4, Math.ceil(entry.width * scale));
|
|
119
|
+
const height = Math.max(4, Math.ceil(entry.height * scale));
|
|
120
|
+
const across = this.target(width, height);
|
|
121
|
+
const result = this.target(width, height);
|
|
122
|
+
gl.useProgram(this.blurProgram);
|
|
123
|
+
this.pass(entry.texture, across, width, height, [1 / width, 0], Math.log2(1 / scale));
|
|
124
|
+
this.pass(across, result, width, height, [0, 1 / height], 0);
|
|
125
|
+
gl.deleteTexture(across);
|
|
126
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
127
|
+
gl.useProgram(this.lens);
|
|
128
|
+
entry.blurs.set(key, { texture: result, frame: entry.frame });
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
nextFrame() {
|
|
132
|
+
this.frame++;
|
|
133
|
+
}
|
|
134
|
+
shrink(backdrop) {
|
|
135
|
+
const limit = Math.min(maxTextureSide, this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE));
|
|
136
|
+
const scale = limit / Math.max(backdrop.width, backdrop.height);
|
|
137
|
+
if (scale >= 1)
|
|
138
|
+
return backdrop.image;
|
|
139
|
+
const canvas = document.createElement("canvas");
|
|
140
|
+
canvas.width = Math.round(backdrop.width * scale);
|
|
141
|
+
canvas.height = Math.round(backdrop.height * scale);
|
|
142
|
+
canvas.getContext("2d").drawImage(backdrop.image, 0, 0, canvas.width, canvas.height);
|
|
143
|
+
return canvas;
|
|
144
|
+
}
|
|
145
|
+
bind(backdrop) {
|
|
146
|
+
const { gl } = this;
|
|
147
|
+
let entry = this.textures.get(backdrop.image);
|
|
148
|
+
if (entry) {
|
|
149
|
+
gl.bindTexture(gl.TEXTURE_2D, entry.texture);
|
|
150
|
+
if (!backdrop.live || entry.frame === this.frame)
|
|
151
|
+
return entry;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const texture = gl.createTexture();
|
|
155
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
156
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
|
|
157
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
158
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);
|
|
159
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);
|
|
160
|
+
entry = { texture, width: 0, height: 0, frame: -1, blurs: new Map() };
|
|
161
|
+
this.textures.set(backdrop.image, entry);
|
|
162
|
+
if (this.textures.size > maxTextures) {
|
|
163
|
+
const [oldest, stale] = this.textures.entries().next().value;
|
|
164
|
+
gl.deleteTexture(stale.texture);
|
|
165
|
+
for (const blur of stale.blurs.values())
|
|
166
|
+
gl.deleteTexture(blur.texture);
|
|
167
|
+
this.textures.delete(oldest);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const pixels = this.shrink(backdrop);
|
|
171
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
|
|
172
|
+
gl.generateMipmap(gl.TEXTURE_2D);
|
|
173
|
+
entry.width = backdrop.width;
|
|
174
|
+
entry.height = backdrop.height;
|
|
175
|
+
entry.frame = this.frame;
|
|
176
|
+
return entry;
|
|
177
|
+
}
|
|
178
|
+
/** Throws on a tainted source: a cross-origin image without CORS headers can't reach the GPU. */
|
|
179
|
+
draw(job) {
|
|
180
|
+
if (this.lost)
|
|
181
|
+
return;
|
|
182
|
+
const { gl, canvas, uniforms: u } = this;
|
|
183
|
+
const { width, height, material: m } = job;
|
|
184
|
+
if (canvas.width < width || canvas.height < height) {
|
|
185
|
+
canvas.width = Math.max(canvas.width, width);
|
|
186
|
+
canvas.height = Math.max(canvas.height, height);
|
|
187
|
+
}
|
|
188
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
189
|
+
const texture = this.bind(job.backdrop);
|
|
190
|
+
if (m.frost > 0) {
|
|
191
|
+
const texels = Math.max(job.uvPerPixel[0] * texture.width, job.uvPerPixel[1] * texture.height);
|
|
192
|
+
const frosted = this.blurred(texture, m.frost * 20 * job.dpr * texels);
|
|
193
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
194
|
+
gl.bindTexture(gl.TEXTURE_2D, frosted);
|
|
195
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
196
|
+
gl.bindTexture(gl.TEXTURE_2D, texture.texture);
|
|
197
|
+
}
|
|
198
|
+
const viewY = canvas.height - height;
|
|
199
|
+
gl.viewport(0, viewY, width, height);
|
|
200
|
+
gl.scissor(0, viewY, width, height);
|
|
201
|
+
gl.clearColor(0, 0, 0, 0);
|
|
202
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
203
|
+
gl.uniform2f(u.uCanvas, width, height);
|
|
204
|
+
gl.uniform2f(u.uSize, job.size[0], job.size[1]);
|
|
205
|
+
gl.uniform2f(u.uUvOrigin, job.uvOrigin[0], job.uvOrigin[1]);
|
|
206
|
+
gl.uniform2f(u.uUvPerPx, job.uvPerPixel[0], job.uvPerPixel[1]);
|
|
207
|
+
gl.uniform2f(u.uTexSize, texture.width, texture.height);
|
|
208
|
+
gl.uniform2f(u.uLightDir, job.lightDir[0], job.lightDir[1]);
|
|
209
|
+
gl.uniform3f(u.uTint, job.tint[0], job.tint[1], job.tint[2]);
|
|
210
|
+
gl.uniform1f(u.uViewY, viewY);
|
|
211
|
+
gl.uniform1f(u.uPad, job.pad);
|
|
212
|
+
gl.uniform1f(u.uRadius, job.radius);
|
|
213
|
+
gl.uniform1f(u.uDpr, job.dpr);
|
|
214
|
+
gl.uniform1f(u.uLight, m.light);
|
|
215
|
+
gl.uniform1f(u.uTransparency, m.transparency);
|
|
216
|
+
gl.uniform1f(u.uRefraction, m.refraction);
|
|
217
|
+
gl.uniform1f(u.uDepth, m.depth);
|
|
218
|
+
gl.uniform1f(u.uDispersion, m.dispersion);
|
|
219
|
+
gl.uniform1f(u.uFrost, m.frost);
|
|
220
|
+
gl.uniform1f(u.uSplay, m.splay);
|
|
221
|
+
gl.uniform1f(u.uBloom, m.bloom);
|
|
222
|
+
gl.uniform1f(u.uGlint, m.glint);
|
|
223
|
+
gl.uniform1f(u.uRim, m.rim);
|
|
224
|
+
gl.uniform1f(u.uLift, m.lift);
|
|
225
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
226
|
+
// ── the drawing buffer is only valid until this task ends, so copy out right here
|
|
227
|
+
job.target.clearRect(0, 0, width, height);
|
|
228
|
+
job.target.drawImage(canvas, 0, 0, width, height, 0, 0, width, height);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/shader.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const vertex = "#version 300 es\nvoid main() {\n vec2 p = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2);\n gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0);\n}";
|
|
2
|
+
export declare const fragment = "#version 300 es\nprecision highp float;\n\nuniform sampler2D uBackdrop, uFrosted;\nuniform vec2 uCanvas, uSize, uUvOrigin, uUvPerPx, uTexSize, uLightDir;\nuniform vec3 uTint;\nuniform float uViewY, uPad, uRadius, uDpr, uLight, uTransparency, uRefraction, uDepth, uDispersion, uFrost, uSplay, uBloom, uGlint, uRim, uLift;\nout vec4 outColor;\n\nconst float SOFTNESS = 2.7;\n\nfloat roundedBox(vec2 p, vec2 b, float r) {\n vec2 q = abs(p) - b + r;\n return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r;\n}\n\nfloat softMin(float a, float b) {\n float lo = min(a, b);\n return lo * pow(1.0 + pow(lo / max(a, b), SOFTNESS), -1.0 / SOFTNESS);\n}\n\nvec2 toUv(vec2 px) {\n return uUvOrigin + px * uUvPerPx;\n}\n\nvec3 pick(vec2 px, float lod) {\n return uFrost > 0.0 ? texture(uFrosted, toUv(px)).rgb : textureLod(uBackdrop, toUv(px), lod).rgb;\n}\n\nvoid main() {\n vec2 px = vec2(gl_FragCoord.x, uCanvas.y - (gl_FragCoord.y - uViewY)) - uPad;\n vec2 half_ = uSize * 0.5;\n vec2 c = px - half_;\n float d = roundedBox(c, half_, uRadius);\n float texels = max(uUvPerPx.x * uTexSize.x, uUvPerPx.y * uTexSize.y);\n float haloLod = log2(max(28.0 * uDpr * texels, 1.0));\n vec3 halo = textureLod(uBackdrop, toUv(px), haloLod).rgb;\n\n float mask = 1.0 - smoothstep(-0.75, 0.75, d);\n float spill = exp(-max(d, 0.0) / (uPad * 0.3)) * uBloom * 0.4 * uLight;\n vec3 spillColor = mix(halo, vec3(1.0), 0.6);\n // \u2500\u2500 a p-norm of the edge distances: smooth everywhere inside, and p = 2.7 lands on the rounded corner\n vec2 edges = max(half_ - abs(c), 0.0) + uRadius + 0.001;\n float soft = softMin(edges.x, edges.y);\n float peak = softMin(half_.x + uRadius, half_.y + uRadius) - uRadius;\n float band = min(mix(max(uDepth * uDpr, 1.0), peak, uSplay * uSplay), peak);\n float s = 1.0 - clamp((soft - uRadius) / band, 0.0, 1.0);\n float height = sqrt(max(1.0 - s * s, 0.0));\n vec2 g = normalize(pow(vec2(soft) / edges, vec2(SOFTNESS + 1.0)) * sign(c) + 0.00001);\n vec3 n = normalize(vec3(g * s * s / sqrt(1.02 - s * s), 1.0));\n\n vec3 ray = refract(vec3(0.0, 0.0, -1.0), n, 1.0 / 1.5);\n vec2 shift = ray.xy / max(-ray.z, 0.5) * band * (0.35 + height) * uRefraction * 1.2;\n\n vec2 at = px + shift;\n float squeeze = log2(max(max(length(dFdx(at)), length(dFdy(at))) * texels, 1.0));\n float k = 0.04 + uDispersion * 0.3;\n vec3 col = vec3(\n pick(at - shift * k, squeeze).r,\n pick(at, squeeze).g,\n pick(at + shift * k, squeeze).b\n );\n\n col = mix(vec3(dot(col, vec3(0.2126, 0.7152, 0.0722))), col, 1.08);\n col = mix(uTint, col, uTransparency);\n col = col * (1.0 + uLift) + uLift * 0.12;\n col += halo * uBloom * 0.22 * s;\n\n float facing = dot(n.xy, uLightDir);\n col += uLight * (max(facing, 0.0) * 0.3 + dot(c / half_, uLightDir) * 0.03);\n col *= 1.0 - uLight * max(-facing, 0.0) * 0.2;\n\n float toward = dot(g, uLightDir);\n col += uGlint * pow(s, 5.0) * (pow(max(toward, 0.0), 6.0) + pow(max(-toward, 0.0), 6.0) * 0.4);\n\n float along = dot(g, uLightDir);\n float line = smoothstep(-1.6 * uDpr, -0.6 * uDpr, d);\n col += uRim * line * (0.18 + 0.82 * along * along);\n\n vec3 inside = clamp(col, 0.0, 1.0) * mask;\n float rest = (1.0 - mask) * spill;\n outColor = vec4(inside + spillColor * rest, mask + rest);\n}";
|
|
3
|
+
export declare const blurFragment = "#version 300 es\nprecision highp float;\n\nuniform sampler2D uSource;\nuniform vec2 uStep, uInvSize;\nuniform float uLod;\nout vec4 outColor;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy * uInvSize;\n vec3 sum = vec3(0.0);\n float total = 0.0;\n for (int i = -8; i <= 8; i++) {\n float x = float(i);\n float weight = exp(-x * x / 18.0);\n sum += textureLod(uSource, uv + uStep * x, uLod).rgb * weight;\n total += weight;\n }\n outColor = vec4(sum / total, 1.0);\n}";
|