@paper-design/shaders 0.0.0-canary.156ab35
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 +7 -0
- package/dist/get-empty-pixel.d.ts +1 -0
- package/dist/get-empty-pixel.js +19 -0
- package/dist/get-empty-pixel.js.map +7 -0
- package/dist/get-shader-color-from-string.d.ts +3 -0
- package/dist/get-shader-color-from-string.js +93 -0
- package/dist/get-shader-color-from-string.js.map +7 -0
- package/dist/get-shader-noise-texture.d.ts +1 -0
- package/dist/get-shader-noise-texture.js +19 -0
- package/dist/get-shader-noise-texture.js.map +7 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.js +168 -0
- package/dist/index.js.map +7 -0
- package/dist/shader-color-spaces.d.ts +6 -0
- package/dist/shader-color-spaces.js +96 -0
- package/dist/shader-color-spaces.js.map +7 -0
- package/dist/shader-mount.d.ts +130 -0
- package/dist/shader-mount.js +483 -0
- package/dist/shader-mount.js.map +7 -0
- package/dist/shader-sizing.d.ts +35 -0
- package/dist/shader-sizing.js +230 -0
- package/dist/shader-sizing.js.map +7 -0
- package/dist/shader-utils.d.ts +10 -0
- package/dist/shader-utils.js +131 -0
- package/dist/shader-utils.js.map +7 -0
- package/dist/shaders/color-panels.d.ts +50 -0
- package/dist/shaders/color-panels.js +224 -0
- package/dist/shaders/color-panels.js.map +7 -0
- package/dist/shaders/dithering.d.ts +56 -0
- package/dist/shaders/dithering.js +223 -0
- package/dist/shaders/dithering.js.map +7 -0
- package/dist/shaders/dot-grid.d.ts +51 -0
- package/dist/shaders/dot-grid.js +110 -0
- package/dist/shaders/dot-grid.js.map +7 -0
- package/dist/shaders/dot-orbit.d.ts +39 -0
- package/dist/shaders/dot-orbit.js +124 -0
- package/dist/shaders/dot-orbit.js.map +7 -0
- package/dist/shaders/fluted-glass.d.ts +73 -0
- package/dist/shaders/fluted-glass.js +187 -0
- package/dist/shaders/fluted-glass.js.map +7 -0
- package/dist/shaders/god-rays.d.ts +45 -0
- package/dist/shaders/god-rays.js +133 -0
- package/dist/shaders/god-rays.js.map +7 -0
- package/dist/shaders/grain-gradient.d.ts +58 -0
- package/dist/shaders/grain-gradient.js +289 -0
- package/dist/shaders/grain-gradient.js.map +7 -0
- package/dist/shaders/heatmap.d.ts +31 -0
- package/dist/shaders/heatmap.js +303 -0
- package/dist/shaders/heatmap.js.map +7 -0
- package/dist/shaders/image-dithering.d.ts +49 -0
- package/dist/shaders/image-dithering.js +163 -0
- package/dist/shaders/image-dithering.js.map +7 -0
- package/dist/shaders/image-halftone-dots.d.ts +46 -0
- package/dist/shaders/image-halftone-dots.js +337 -0
- package/dist/shaders/image-halftone-dots.js.map +7 -0
- package/dist/shaders/liquid-metal.d.ts +66 -0
- package/dist/shaders/liquid-metal.js +627 -0
- package/dist/shaders/liquid-metal.js.map +7 -0
- package/dist/shaders/mesh-gradient.d.ts +33 -0
- package/dist/shaders/mesh-gradient.js +136 -0
- package/dist/shaders/mesh-gradient.js.map +7 -0
- package/dist/shaders/metaballs.d.ts +35 -0
- package/dist/shaders/metaballs.js +112 -0
- package/dist/shaders/metaballs.js.map +7 -0
- package/dist/shaders/neuro-noise.d.ts +27 -0
- package/dist/shaders/neuro-noise.js +80 -0
- package/dist/shaders/neuro-noise.js.map +7 -0
- package/dist/shaders/paper-texture.d.ts +53 -0
- package/dist/shaders/paper-texture.js +248 -0
- package/dist/shaders/paper-texture.js.map +7 -0
- package/dist/shaders/perlin-noise.d.ts +33 -0
- package/dist/shaders/perlin-noise.js +195 -0
- package/dist/shaders/perlin-noise.js.map +7 -0
- package/dist/shaders/pulsing-border.d.ts +72 -0
- package/dist/shaders/pulsing-border.js +237 -0
- package/dist/shaders/pulsing-border.js.map +7 -0
- package/dist/shaders/simplex-noise.d.ts +27 -0
- package/dist/shaders/simplex-noise.js +100 -0
- package/dist/shaders/simplex-noise.js.map +7 -0
- package/dist/shaders/smoke-ring.d.ts +39 -0
- package/dist/shaders/smoke-ring.js +130 -0
- package/dist/shaders/smoke-ring.js.map +7 -0
- package/dist/shaders/spiral.d.ts +41 -0
- package/dist/shaders/spiral.js +81 -0
- package/dist/shaders/spiral.js.map +7 -0
- package/dist/shaders/static-mesh-gradient.d.ts +42 -0
- package/dist/shaders/static-mesh-gradient.js +139 -0
- package/dist/shaders/static-mesh-gradient.js.map +7 -0
- package/dist/shaders/static-radial-gradient.d.ts +50 -0
- package/dist/shaders/static-radial-gradient.js +195 -0
- package/dist/shaders/static-radial-gradient.js.map +7 -0
- package/dist/shaders/swirl.d.ts +42 -0
- package/dist/shaders/swirl.js +102 -0
- package/dist/shaders/swirl.js.map +7 -0
- package/dist/shaders/voronoi.d.ts +44 -0
- package/dist/shaders/voronoi.js +139 -0
- package/dist/shaders/voronoi.js.map +7 -0
- package/dist/shaders/warp.d.ts +54 -0
- package/dist/shaders/warp.js +132 -0
- package/dist/shaders/warp.js.map +7 -0
- package/dist/shaders/water.d.ts +39 -0
- package/dist/shaders/water.js +120 -0
- package/dist/shaders/water.js.map +7 -0
- package/dist/shaders/waves.d.ts +38 -0
- package/dist/shaders/waves.js +66 -0
- package/dist/shaders/waves.js.map +7 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +7 -0
- package/dist/vertex-shader.d.ts +2 -0
- package/dist/vertex-shader.js +211 -0
- package/dist/vertex-shader.js.map +7 -0
- package/package.json +27 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
2
|
+
* Paper Shaders *
|
|
3
|
+
* https://github.com/paper-design/shaders *
|
|
4
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
5
|
+
|
|
6
|
+
const ShaderColorSpaces = {
|
|
7
|
+
rgb: 0,
|
|
8
|
+
oklch: 1
|
|
9
|
+
};
|
|
10
|
+
const declareOklchTransforms = `
|
|
11
|
+
|
|
12
|
+
// magic numbers (and magic could be better tbh)
|
|
13
|
+
#define OKLCH_CHROMA_THRESHOLD .001
|
|
14
|
+
#define OKLCH_HUE_NEUTRALIZER - 2.
|
|
15
|
+
|
|
16
|
+
vec3 srgbToLinear(vec3 srgb) {
|
|
17
|
+
return pow(srgb, vec3(2.2));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
vec3 linearToSrgb(vec3 linear) {
|
|
21
|
+
return pow(linear, vec3(1.0 / 2.2));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
vec3 LrgbToOklab(vec3 rgb) {
|
|
25
|
+
float L = pow(0.4122214708 * rgb.r + 0.5363325363 * rgb.g + 0.0514459929 * rgb.b, 1.0 / 3.0);
|
|
26
|
+
float M = pow(0.2119034982 * rgb.r + 0.6806995451 * rgb.g + 0.1073969566 * rgb.b, 1.0 / 3.0);
|
|
27
|
+
float S = pow(0.0883024619 * rgb.r + 0.2817188376 * rgb.g + 0.6299787005 * rgb.b, 1.0 / 3.0);
|
|
28
|
+
return vec3(
|
|
29
|
+
0.2104542553 * L + 0.793617785 * M - 0.0040720468 * S,
|
|
30
|
+
1.9779984951 * L - 2.428592205 * M + 0.4505937099 * S,
|
|
31
|
+
0.0259040371 * L + 0.7827717662 * M - 0.808675766 * S
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
vec3 OklabToLrgb(vec3 oklab) {
|
|
36
|
+
float L = oklab.x;
|
|
37
|
+
float a = oklab.y;
|
|
38
|
+
float b = oklab.z;
|
|
39
|
+
|
|
40
|
+
float l_ = L + 0.3963377774 * a + 0.2158037573 * b;
|
|
41
|
+
float m_ = L - 0.1055613458 * a - 0.0638541728 * b;
|
|
42
|
+
float s_ = L - 0.0894841775 * a - 1.291485548 * b;
|
|
43
|
+
|
|
44
|
+
float l = l_ * l_ * l_;
|
|
45
|
+
float m = m_ * m_ * m_;
|
|
46
|
+
float s = s_ * s_ * s_;
|
|
47
|
+
|
|
48
|
+
return vec3(
|
|
49
|
+
4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
|
|
50
|
+
-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
|
|
51
|
+
-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
vec3 oklabToOklch(vec3 oklab) {
|
|
56
|
+
float C = length(oklab.yz);
|
|
57
|
+
float H = atan(oklab.z, oklab.y);
|
|
58
|
+
if (C < OKLCH_CHROMA_THRESHOLD) {
|
|
59
|
+
H = OKLCH_HUE_NEUTRALIZER;
|
|
60
|
+
}
|
|
61
|
+
return vec3(oklab.x, C, H);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
vec3 oklchToOklab(vec3 oklch) {
|
|
65
|
+
float a = oklch.y * cos(oklch.z);
|
|
66
|
+
float b = oklch.y * sin(oklch.z);
|
|
67
|
+
return vec3(oklch.x, a, b);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
float mixHue(float h1, float h2, float mixer) {
|
|
71
|
+
float delta = mod(h2 - h1 + PI, TWO_PI) - PI;
|
|
72
|
+
return h1 + mixer * delta;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
vec3 srgbToOklab(vec3 rgb) {
|
|
76
|
+
return oklabToOklch(LrgbToOklab(srgbToLinear(rgb)));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
vec3 oklabToSrgb(vec3 oklab) {
|
|
80
|
+
return linearToSrgb(OklabToLrgb(oklchToOklab(oklab)));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
vec3 mixOklabVector(vec3 color1, vec3 color2, float mixer) {
|
|
84
|
+
color1.x = mix(color1.x, color2.x, mixer);
|
|
85
|
+
color1.y = mix(color1.y, color2.y, mixer);
|
|
86
|
+
if (color1.y > OKLCH_CHROMA_THRESHOLD && color2.y > OKLCH_CHROMA_THRESHOLD) {
|
|
87
|
+
color1.z = mixHue(color1.z, color2.z, mixer);
|
|
88
|
+
}
|
|
89
|
+
return color1;
|
|
90
|
+
}
|
|
91
|
+
`;
|
|
92
|
+
export {
|
|
93
|
+
ShaderColorSpaces,
|
|
94
|
+
declareOklchTransforms
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=shader-color-spaces.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/shader-color-spaces.ts"],
|
|
4
|
+
"sourcesContent": ["export const ShaderColorSpaces = {\n rgb: 0,\n oklch: 1,\n} as const;\n\nexport type ShaderColorSpace = keyof typeof ShaderColorSpaces;\n\nexport const declareOklchTransforms = `\n\n// magic numbers (and magic could be better tbh)\n#define OKLCH_CHROMA_THRESHOLD .001\n#define OKLCH_HUE_NEUTRALIZER - 2.\n\nvec3 srgbToLinear(vec3 srgb) {\n return pow(srgb, vec3(2.2));\n}\n\nvec3 linearToSrgb(vec3 linear) {\n return pow(linear, vec3(1.0 / 2.2));\n}\n\nvec3 LrgbToOklab(vec3 rgb) {\n float L = pow(0.4122214708 * rgb.r + 0.5363325363 * rgb.g + 0.0514459929 * rgb.b, 1.0 / 3.0);\n float M = pow(0.2119034982 * rgb.r + 0.6806995451 * rgb.g + 0.1073969566 * rgb.b, 1.0 / 3.0);\n float S = pow(0.0883024619 * rgb.r + 0.2817188376 * rgb.g + 0.6299787005 * rgb.b, 1.0 / 3.0);\n return vec3(\n 0.2104542553 * L + 0.793617785 * M - 0.0040720468 * S,\n 1.9779984951 * L - 2.428592205 * M + 0.4505937099 * S,\n 0.0259040371 * L + 0.7827717662 * M - 0.808675766 * S\n );\n}\n\nvec3 OklabToLrgb(vec3 oklab) {\n float L = oklab.x;\n float a = oklab.y;\n float b = oklab.z;\n\n float l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n float m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n float s_ = L - 0.0894841775 * a - 1.291485548 * b;\n\n float l = l_ * l_ * l_;\n float m = m_ * m_ * m_;\n float s = s_ * s_ * s_;\n\n return vec3(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s\n );\n}\n\nvec3 oklabToOklch(vec3 oklab) {\n float C = length(oklab.yz);\n float H = atan(oklab.z, oklab.y);\n if (C < OKLCH_CHROMA_THRESHOLD) {\n H = OKLCH_HUE_NEUTRALIZER;\n }\n return vec3(oklab.x, C, H);\n}\n\nvec3 oklchToOklab(vec3 oklch) {\n float a = oklch.y * cos(oklch.z);\n float b = oklch.y * sin(oklch.z);\n return vec3(oklch.x, a, b);\n}\n\nfloat mixHue(float h1, float h2, float mixer) {\n float delta = mod(h2 - h1 + PI, TWO_PI) - PI;\n return h1 + mixer * delta;\n}\n\nvec3 srgbToOklab(vec3 rgb) {\n return oklabToOklch(LrgbToOklab(srgbToLinear(rgb)));\n}\n\nvec3 oklabToSrgb(vec3 oklab) {\n return linearToSrgb(OklabToLrgb(oklchToOklab(oklab)));\n}\n\nvec3 mixOklabVector(vec3 color1, vec3 color2, float mixer) {\n color1.x = mix(color1.x, color2.x, mixer);\n color1.y = mix(color1.y, color2.y, mixer);\n if (color1.y > OKLCH_CHROMA_THRESHOLD && color2.y > OKLCH_CHROMA_THRESHOLD) {\n color1.z = mixHue(color1.z, color2.z, mixer);\n }\n return color1;\n}\n`;\n"],
|
|
5
|
+
"mappings": ";;;;;AAAO,MAAM,oBAAoB;AAAA,EAC/B,KAAK;AAAA,EACL,OAAO;AACT;AAIO,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
export declare class ShaderMount {
|
|
2
|
+
parentElement: PaperShaderElement;
|
|
3
|
+
canvasElement: HTMLCanvasElement;
|
|
4
|
+
private gl;
|
|
5
|
+
private program;
|
|
6
|
+
private uniformLocations;
|
|
7
|
+
/** The fragment shader that we are using */
|
|
8
|
+
private fragmentShader;
|
|
9
|
+
/** Stores the RAF for the render loop */
|
|
10
|
+
private rafId;
|
|
11
|
+
/** Time of the last rendered frame */
|
|
12
|
+
private lastRenderTime;
|
|
13
|
+
/** Total time that we have played any animation, passed as a uniform to the shader for time-based VFX */
|
|
14
|
+
private currentFrame;
|
|
15
|
+
/** The speed that we progress through animation time (multiplies by delta time every update). Allows negatives to play in reverse. If set to 0, rAF will stop entirely so static shaders have no recurring performance costs */
|
|
16
|
+
private speed;
|
|
17
|
+
/** Actual speed used that accounts for document visibility (we pause the shader if the tab is hidden) */
|
|
18
|
+
private currentSpeed;
|
|
19
|
+
/** Uniforms that are provided by the user for the specific shader being mounted (not including uniforms that this Mount adds, like time and resolution) */
|
|
20
|
+
private providedUniforms;
|
|
21
|
+
/** Just a sanity check to make sure frames don't run after we're disposed */
|
|
22
|
+
private hasBeenDisposed;
|
|
23
|
+
/** If the resolution of the canvas has changed since the last render */
|
|
24
|
+
private resolutionChanged;
|
|
25
|
+
/** Store textures that are provided by the user */
|
|
26
|
+
private textures;
|
|
27
|
+
private minPixelRatio;
|
|
28
|
+
private maxPixelCount;
|
|
29
|
+
private isSafari;
|
|
30
|
+
private uniformCache;
|
|
31
|
+
private textureUnitMap;
|
|
32
|
+
constructor(
|
|
33
|
+
/** The div you'd like to mount the shader to. The shader will match its size. */
|
|
34
|
+
parentElement: HTMLElement, fragmentShader: string, uniforms: ShaderMountUniforms, webGlContextAttributes?: WebGLContextAttributes,
|
|
35
|
+
/** The speed of the animation, or 0 to stop it. Supports negative values to play in reverse. */
|
|
36
|
+
speed?: number,
|
|
37
|
+
/** Pass a frame to offset the starting u_time value and give deterministic results*/
|
|
38
|
+
frame?: number,
|
|
39
|
+
/**
|
|
40
|
+
* The minimum pixel ratio to render at, defaults to 2.
|
|
41
|
+
* May be reduced to improve performance or increased together with `maxPixelCount` to improve antialiasing.
|
|
42
|
+
*/
|
|
43
|
+
minPixelRatio?: number,
|
|
44
|
+
/**
|
|
45
|
+
* The maximum amount of physical device pixels to render for the shader,
|
|
46
|
+
* by default it's 1920 * 1080 * 2x dpi (per each side) = 8,294,400 pixels of a 4K screen.
|
|
47
|
+
* Actual DOM size of the canvas can be larger, it will just lose quality after this.
|
|
48
|
+
*
|
|
49
|
+
* May be reduced to improve performance or increased to improve quality on high-resolution screens.
|
|
50
|
+
*/
|
|
51
|
+
maxPixelCount?: number);
|
|
52
|
+
private initProgram;
|
|
53
|
+
private setupPositionAttribute;
|
|
54
|
+
private setupUniforms;
|
|
55
|
+
/**
|
|
56
|
+
* The scale that we should render at.
|
|
57
|
+
* - Used to target 2x rendering even on 1x screens for better antialiasing
|
|
58
|
+
* - Prevents the virtual resolution from going beyond the maximum resolution
|
|
59
|
+
* - Accounts for the page zoom level so we render in physical device pixels rather than CSS pixels
|
|
60
|
+
*/
|
|
61
|
+
private renderScale;
|
|
62
|
+
private parentWidth;
|
|
63
|
+
private parentHeight;
|
|
64
|
+
private parentDevicePixelWidth;
|
|
65
|
+
private parentDevicePixelHeight;
|
|
66
|
+
private devicePixelsSupported;
|
|
67
|
+
private resizeObserver;
|
|
68
|
+
private setupResizeObserver;
|
|
69
|
+
private handleVisualViewportChange;
|
|
70
|
+
/** Resize handler for when the container div changes size or the max pixel count changes and we want to resize our canvas to match */
|
|
71
|
+
private handleResize;
|
|
72
|
+
private render;
|
|
73
|
+
private requestRender;
|
|
74
|
+
/** Creates a texture from an image and sets it into a uniform value */
|
|
75
|
+
private setTextureUniform;
|
|
76
|
+
/** Utility: recursive equality test for all the uniforms */
|
|
77
|
+
private areUniformValuesEqual;
|
|
78
|
+
/** Sets the provided uniform values into the WebGL program, can be a partial list of uniforms that have changed */
|
|
79
|
+
private setUniformValues;
|
|
80
|
+
/** Gets the current total animation time from 0ms */
|
|
81
|
+
getCurrentFrame: () => number;
|
|
82
|
+
/** Set a frame to get a deterministic result, frames are literally just milliseconds from zero since the animation started */
|
|
83
|
+
setFrame: (newFrame: number) => void;
|
|
84
|
+
/** Set an animation speed (or 0 to stop animation) */
|
|
85
|
+
setSpeed: (newSpeed?: number) => void;
|
|
86
|
+
private setCurrentSpeed;
|
|
87
|
+
/** Set the maximum pixel count for the shader, this will limit the number of pixels that will be rendered */
|
|
88
|
+
setMaxPixelCount: (newMaxPixelCount?: number) => void;
|
|
89
|
+
/** Set the minimum pixel ratio for the shader */
|
|
90
|
+
setMinPixelRatio: (newMinPixelRatio?: number) => void;
|
|
91
|
+
/** Update the uniforms that are provided by the outside shader, can be a partial set with only the uniforms that have changed */
|
|
92
|
+
setUniforms: (newUniforms: ShaderMountUniforms) => void;
|
|
93
|
+
private handleDocumentVisibilityChange;
|
|
94
|
+
/** Dispose of the shader mount, cleaning up all of the WebGL resources */
|
|
95
|
+
dispose: () => void;
|
|
96
|
+
}
|
|
97
|
+
/** The parent `<div>` element that has a ShaderMount available on it */
|
|
98
|
+
export interface PaperShaderElement extends HTMLElement {
|
|
99
|
+
paperShaderMount: ShaderMount | undefined;
|
|
100
|
+
}
|
|
101
|
+
/** Check if an element is a Paper shader element */
|
|
102
|
+
export declare function isPaperShaderElement(element: HTMLElement): element is PaperShaderElement;
|
|
103
|
+
/**
|
|
104
|
+
* Uniform types that we support to be auto-mapped into the fragment shader
|
|
105
|
+
*
|
|
106
|
+
* We accept undefined as a convenience for server rendering, when some things may be undefined
|
|
107
|
+
* We just skip setting the uniform if it's undefined. This allows the shader mount to still take up space during server rendering
|
|
108
|
+
*/
|
|
109
|
+
export interface ShaderMountUniforms {
|
|
110
|
+
[key: string]: boolean | number | number[] | number[][] | HTMLImageElement | undefined;
|
|
111
|
+
}
|
|
112
|
+
export interface ShaderMotionParams {
|
|
113
|
+
speed?: number;
|
|
114
|
+
frame?: number;
|
|
115
|
+
}
|
|
116
|
+
export type ShaderPreset<T> = {
|
|
117
|
+
name: string;
|
|
118
|
+
params: Required<T>;
|
|
119
|
+
};
|
|
120
|
+
export type ImageShaderPreset<T> = {
|
|
121
|
+
name: string;
|
|
122
|
+
/**
|
|
123
|
+
* Params for the shader excluding the image.
|
|
124
|
+
* Image is excluded as it isn't considered a preset,
|
|
125
|
+
* e.g. when switching between presets it shouldn't switch the image.
|
|
126
|
+
*
|
|
127
|
+
* While we exclude images from presets they should still be set with a default prop value so the code-first usage of shaders remains great.
|
|
128
|
+
*/
|
|
129
|
+
params: Required<Omit<T, 'image'>>;
|
|
130
|
+
};
|