svelte-ag 1.0.14 → 1.0.16
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/app.css +2 -20
- package/dist/lib/components/gradient/Gradient.svelte +1 -1
- package/dist/lib/components/shader/BaseShader.svelte +204 -0
- package/dist/lib/components/shader/BaseShader.svelte.d.ts +23 -0
- package/dist/lib/components/shader/BaseShader.svelte.d.ts.map +1 -0
- package/dist/lib/components/shader/WebGlShader.svelte +259 -0
- package/dist/lib/components/shader/WebGlShader.svelte.d.ts +15 -0
- package/dist/lib/components/shader/WebGlShader.svelte.d.ts.map +1 -0
- package/dist/lib/components/shader/WebGpuShader.svelte +376 -0
- package/dist/lib/components/shader/WebGpuShader.svelte.d.ts +15 -0
- package/dist/lib/components/shader/WebGpuShader.svelte.d.ts.map +1 -0
- package/dist/lib/components/shader/devicePixelResizeObserver.d.ts +14 -0
- package/dist/lib/components/shader/devicePixelResizeObserver.d.ts.map +1 -0
- package/dist/lib/components/shader/devicePixelResizeObserver.js +56 -0
- package/dist/lib/components/shader/index.d.ts +3 -0
- package/dist/lib/components/shader/index.d.ts.map +1 -0
- package/dist/lib/components/shader/index.js +2 -0
- package/dist/lib/components/shader/intersectionObserver.d.ts +14 -0
- package/dist/lib/components/shader/intersectionObserver.d.ts.map +1 -0
- package/dist/lib/components/shader/intersectionObserver.js +35 -0
- package/dist/lib/components/shader/resources/banner.png +0 -0
- package/dist/lib/components/shader/resources/bubbles.png +0 -0
- package/dist/lib/components/shader/resources/collage.png +0 -0
- package/dist/lib/components/shader/resources/debugShaderWebGl.png +0 -0
- package/dist/lib/components/shader/resources/debugShaderWebGpu.png +0 -0
- package/dist/lib/components/shader/resources/halo.png +0 -0
- package/dist/lib/components/shader/resources/logoDark.png +0 -0
- package/dist/lib/components/shader/resources/logoLight.png +0 -0
- package/dist/lib/components/shader/resources/slider.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgl.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu-unsupported.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgl.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu-unsupported.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgl.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu-unsupported.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-3.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-3.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-1.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-2.png +0 -0
- package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-3.png +0 -0
- package/dist/lib/components/shader/tests/test-pages.spec.d.ts +2 -0
- package/dist/lib/components/shader/tests/test-pages.spec.d.ts.map +1 -0
- package/dist/lib/components/shader/tests/test-pages.spec.js +77 -0
- package/dist/lib/components/shader/types.d.ts +66 -0
- package/dist/lib/components/shader/types.d.ts.map +1 -0
- package/dist/lib/components/shader/types.js +3 -0
- package/dist/lib/components/shader/utils.d.ts +11 -0
- package/dist/lib/components/shader/utils.d.ts.map +1 -0
- package/dist/lib/components/shader/utils.js +30 -0
- package/dist/lib/vite/vite-plugin-component-source-collector.d.ts.map +1 -1
- package/dist/lib/vite/vite-plugin-component-source-collector.js +6 -4
- package/dist/routes/+layout.svelte +3 -4
- package/dist/routes/+layout.svelte.d.ts +4 -17
- package/dist/routes/+layout.svelte.d.ts.map +1 -1
- package/dist/routes/+page.svelte +7 -0
- package/dist/routes/+page.svelte.d.ts +6 -14
- package/dist/routes/+page.svelte.d.ts.map +1 -1
- package/dist/routes/shader/+page.svelte +16 -0
- package/dist/routes/shader/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/hello-world/+page.svelte +8 -0
- package/dist/routes/shader/hello-world/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/hello-world/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/hello-world/webgl/+page.svelte +22 -0
- package/dist/routes/shader/hello-world/webgl/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/hello-world/webgl/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/hello-world/webgl/shader.frag +13 -0
- package/dist/routes/shader/hello-world/webgpu/+page.svelte +24 -0
- package/dist/routes/shader/hello-world/webgpu/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/hello-world/webgpu/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/hello-world/webgpu/shader.wgsl +9 -0
- package/dist/routes/shader/landing-page-bubbles/+page.svelte +8 -0
- package/dist/routes/shader/landing-page-bubbles/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/landing-page-bubbles/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/landing-page-bubbles/webgl/+page.svelte +95 -0
- package/dist/routes/shader/landing-page-bubbles/webgl/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/landing-page-bubbles/webgl/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/landing-page-bubbles/webgl/shader.frag +64 -0
- package/dist/routes/shader/landing-page-bubbles/webgpu/+page.svelte +94 -0
- package/dist/routes/shader/landing-page-bubbles/webgpu/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/landing-page-bubbles/webgpu/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/landing-page-bubbles/webgpu/shader.wgsl +56 -0
- package/dist/routes/shader/landing-page-halo/+page.svelte +8 -0
- package/dist/routes/shader/landing-page-halo/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/landing-page-halo/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/landing-page-halo/webgl/+page.svelte +70 -0
- package/dist/routes/shader/landing-page-halo/webgl/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/landing-page-halo/webgl/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/landing-page-halo/webgl/shader.frag +69 -0
- package/dist/routes/shader/landing-page-halo/webgpu/+page.svelte +72 -0
- package/dist/routes/shader/landing-page-halo/webgpu/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/landing-page-halo/webgpu/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/landing-page-halo/webgpu/shader.wgsl +66 -0
- package/dist/routes/shader/oversized-canvas/+page.svelte +8 -0
- package/dist/routes/shader/oversized-canvas/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/oversized-canvas/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/oversized-canvas/webgl/+page.svelte +22 -0
- package/dist/routes/shader/oversized-canvas/webgl/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/oversized-canvas/webgl/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/oversized-canvas/webgl/shader.frag +13 -0
- package/dist/routes/shader/oversized-canvas/webgpu/+page.svelte +24 -0
- package/dist/routes/shader/oversized-canvas/webgpu/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/oversized-canvas/webgpu/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/oversized-canvas/webgpu/shader.wgsl +9 -0
- package/dist/routes/shader/remount/+page.svelte +8 -0
- package/dist/routes/shader/remount/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/remount/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/remount/webgl/+page.svelte +28 -0
- package/dist/routes/shader/remount/webgl/+page.svelte.d.ts +7 -0
- package/dist/routes/shader/remount/webgl/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/remount/webgl/shader.frag +13 -0
- package/dist/routes/shader/remount/webgpu/+page.svelte +30 -0
- package/dist/routes/shader/remount/webgpu/+page.svelte.d.ts +7 -0
- package/dist/routes/shader/remount/webgpu/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/remount/webgpu/shader.wgsl +9 -0
- package/dist/routes/shader/slider/+page.svelte +8 -0
- package/dist/routes/shader/slider/+page.svelte.d.ts +27 -0
- package/dist/routes/shader/slider/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/slider/webgl/+page.svelte +78 -0
- package/dist/routes/shader/slider/webgl/+page.svelte.d.ts +7 -0
- package/dist/routes/shader/slider/webgl/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/slider/webgl/shader.frag +63 -0
- package/dist/routes/shader/slider/webgpu/+page.svelte +81 -0
- package/dist/routes/shader/slider/webgpu/+page.svelte.d.ts +7 -0
- package/dist/routes/shader/slider/webgpu/+page.svelte.d.ts.map +1 -0
- package/dist/routes/shader/slider/webgpu/shader.wgsl +59 -0
- package/package.json +6 -4
- package/src/app.css +2 -20
- package/src/lib/components/gradient/Gradient.svelte +1 -1
- package/src/lib/components/shader/BaseShader.svelte +204 -0
- package/src/lib/components/shader/WebGlShader.svelte +259 -0
- package/src/lib/components/shader/WebGpuShader.svelte +376 -0
- package/src/lib/components/shader/devicePixelResizeObserver.ts +70 -0
- package/src/lib/components/shader/index.ts +2 -0
- package/src/lib/components/shader/intersectionObserver.ts +55 -0
- package/src/lib/components/shader/resources/banner.png +0 -0
- package/src/lib/components/shader/resources/bubbles.png +0 -0
- package/src/lib/components/shader/resources/collage.png +0 -0
- package/src/lib/components/shader/resources/debugShaderWebGl.png +0 -0
- package/src/lib/components/shader/resources/debugShaderWebGpu.png +0 -0
- package/src/lib/components/shader/resources/halo.png +0 -0
- package/src/lib/components/shader/resources/logoDark.png +0 -0
- package/src/lib/components/shader/resources/logoLight.png +0 -0
- package/src/lib/components/shader/resources/slider.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgl.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu-unsupported.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgl.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu-unsupported.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgl.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu-unsupported.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-3.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-3.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-1.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-2.png +0 -0
- package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-3.png +0 -0
- package/src/lib/components/shader/tests/test-pages.spec.ts +97 -0
- package/src/lib/components/shader/types.ts +66 -0
- package/src/lib/components/shader/utils.ts +38 -0
- package/src/lib/vite/vite-plugin-component-source-collector.ts +6 -4
- package/src/routes/+layout.svelte +3 -4
- package/src/routes/+page.svelte +7 -0
- package/src/routes/shader/+page.svelte +16 -0
- package/src/routes/shader/hello-world/+page.svelte +8 -0
- package/src/routes/shader/hello-world/webgl/+page.svelte +22 -0
- package/src/routes/shader/hello-world/webgl/shader.frag +13 -0
- package/src/routes/shader/hello-world/webgpu/+page.svelte +24 -0
- package/src/routes/shader/hello-world/webgpu/shader.wgsl +9 -0
- package/src/routes/shader/landing-page-bubbles/+page.svelte +8 -0
- package/src/routes/shader/landing-page-bubbles/webgl/+page.svelte +95 -0
- package/src/routes/shader/landing-page-bubbles/webgl/shader.frag +64 -0
- package/src/routes/shader/landing-page-bubbles/webgpu/+page.svelte +94 -0
- package/src/routes/shader/landing-page-bubbles/webgpu/shader.wgsl +56 -0
- package/src/routes/shader/landing-page-halo/+page.svelte +8 -0
- package/src/routes/shader/landing-page-halo/webgl/+page.svelte +70 -0
- package/src/routes/shader/landing-page-halo/webgl/shader.frag +69 -0
- package/src/routes/shader/landing-page-halo/webgpu/+page.svelte +72 -0
- package/src/routes/shader/landing-page-halo/webgpu/shader.wgsl +66 -0
- package/src/routes/shader/oversized-canvas/+page.svelte +8 -0
- package/src/routes/shader/oversized-canvas/webgl/+page.svelte +22 -0
- package/src/routes/shader/oversized-canvas/webgl/shader.frag +13 -0
- package/src/routes/shader/oversized-canvas/webgpu/+page.svelte +24 -0
- package/src/routes/shader/oversized-canvas/webgpu/shader.wgsl +9 -0
- package/src/routes/shader/remount/+page.svelte +8 -0
- package/src/routes/shader/remount/webgl/+page.svelte +28 -0
- package/src/routes/shader/remount/webgl/shader.frag +13 -0
- package/src/routes/shader/remount/webgpu/+page.svelte +30 -0
- package/src/routes/shader/remount/webgpu/shader.wgsl +9 -0
- package/src/routes/shader/slider/+page.svelte +8 -0
- package/src/routes/shader/slider/webgl/+page.svelte +78 -0
- package/src/routes/shader/slider/webgl/shader.frag +63 -0
- package/src/routes/shader/slider/webgpu/+page.svelte +81 -0
- package/src/routes/shader/slider/webgpu/shader.wgsl +59 -0
package/dist/app.css
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
/* --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Ubuntu', sans-serif; */
|
|
14
14
|
|
|
15
|
-
html {
|
|
15
|
+
/* html {
|
|
16
16
|
scrollbar-gutter: stable;
|
|
17
|
-
}
|
|
17
|
+
} */
|
|
18
18
|
|
|
19
19
|
/* Below is for shadcn */
|
|
20
20
|
|
|
@@ -185,21 +185,3 @@ html {
|
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
|
-
|
|
189
|
-
@layer base {
|
|
190
|
-
* {
|
|
191
|
-
@apply border-border;
|
|
192
|
-
}
|
|
193
|
-
body {
|
|
194
|
-
@apply bg-background text-foreground;
|
|
195
|
-
}
|
|
196
|
-
h1 {
|
|
197
|
-
@apply text-2xl font-bold;
|
|
198
|
-
}
|
|
199
|
-
h2 {
|
|
200
|
-
@apply text-xl font-bold;
|
|
201
|
-
}
|
|
202
|
-
h3 {
|
|
203
|
-
@apply text-lg font-bold;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onDestroy, onMount } from 'svelte';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
|
|
5
|
+
import { pixelScale, clamp } from './utils.js';
|
|
6
|
+
import { intersectionObserver } from './intersectionObserver.js';
|
|
7
|
+
import { devicePixelResizeObserver, type DevicePixelResizeEvent } from './devicePixelResizeObserver.js';
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
width?: string;
|
|
11
|
+
height?: string;
|
|
12
|
+
canRender: boolean;
|
|
13
|
+
maxSize: number;
|
|
14
|
+
render: () => void | Promise<void>;
|
|
15
|
+
rerenderEveryFrame: boolean;
|
|
16
|
+
forceAnimation: boolean;
|
|
17
|
+
offsetFromBottom?: boolean;
|
|
18
|
+
updateCanvasSize?: (canvasWidth: number, canvasHeight: number) => void | Promise<void>;
|
|
19
|
+
updateContainerSize: (containerWidth: number, containerHeight: number) => void | Promise<void>;
|
|
20
|
+
updateOffset: (offsetX: number, offsetY: number) => void | Promise<void>;
|
|
21
|
+
updateScale: (scale: number) => void | Promise<void>;
|
|
22
|
+
updateTime: (time: number) => void | Promise<void>;
|
|
23
|
+
canvasElement: HTMLCanvasElement | null;
|
|
24
|
+
requestRender: () => void;
|
|
25
|
+
children?: Snippet;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
let {
|
|
29
|
+
width,
|
|
30
|
+
height,
|
|
31
|
+
canRender,
|
|
32
|
+
maxSize,
|
|
33
|
+
render,
|
|
34
|
+
rerenderEveryFrame,
|
|
35
|
+
forceAnimation,
|
|
36
|
+
offsetFromBottom = false,
|
|
37
|
+
updateCanvasSize = () => {},
|
|
38
|
+
updateContainerSize,
|
|
39
|
+
updateOffset,
|
|
40
|
+
updateScale,
|
|
41
|
+
updateTime,
|
|
42
|
+
canvasElement = $bindable(),
|
|
43
|
+
requestRender = $bindable(),
|
|
44
|
+
children
|
|
45
|
+
}: Props = $props();
|
|
46
|
+
|
|
47
|
+
function prefersReducedMotion() {
|
|
48
|
+
if (typeof window === 'undefined') return false;
|
|
49
|
+
return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const shouldRerenderEveryFrame = $derived(forceAnimation || !prefersReducedMotion() ? rerenderEveryFrame : false);
|
|
53
|
+
|
|
54
|
+
let mountTime = 0;
|
|
55
|
+
onMount(() => {
|
|
56
|
+
mountTime = performance.now() / 1000;
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
let containerElement = $state<HTMLElement | null>(null);
|
|
60
|
+
|
|
61
|
+
let requestHandle: number | null = null;
|
|
62
|
+
const renderCallbacks: Array<() => void> = [];
|
|
63
|
+
|
|
64
|
+
requestRender = () => {
|
|
65
|
+
if (!canRender) return;
|
|
66
|
+
if (requestHandle !== null) return;
|
|
67
|
+
|
|
68
|
+
requestHandle = requestAnimationFrame(() => {
|
|
69
|
+
renderCallbacks.forEach((callback) => callback());
|
|
70
|
+
renderCallbacks.length = 0;
|
|
71
|
+
|
|
72
|
+
if (shouldRerenderEveryFrame) updateTime(performance.now() / 1000 - mountTime);
|
|
73
|
+
|
|
74
|
+
render();
|
|
75
|
+
|
|
76
|
+
requestHandle = null;
|
|
77
|
+
|
|
78
|
+
if (shouldRerenderEveryFrame) requestRender();
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
function cancelRender() {
|
|
83
|
+
if (requestHandle !== null) {
|
|
84
|
+
cancelAnimationFrame(requestHandle);
|
|
85
|
+
requestHandle = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function updateCanvasSizeInner(event: DevicePixelResizeEvent) {
|
|
90
|
+
if (!canvasElement) return;
|
|
91
|
+
const nextCanvasElement = canvasElement;
|
|
92
|
+
|
|
93
|
+
// Resizing must happen right before the next render pass.
|
|
94
|
+
renderCallbacks.push(() => {
|
|
95
|
+
const canvasWidth = event.detail.width;
|
|
96
|
+
const canvasHeight = event.detail.height;
|
|
97
|
+
|
|
98
|
+
nextCanvasElement.width = canvasWidth;
|
|
99
|
+
nextCanvasElement.height = canvasHeight;
|
|
100
|
+
|
|
101
|
+
updateCanvasSize(canvasWidth, canvasHeight);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
requestRender();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function updateContainerSizeInner(event: DevicePixelResizeEvent) {
|
|
108
|
+
const canvasWidth = event.detail.width;
|
|
109
|
+
const canvasHeight = event.detail.height;
|
|
110
|
+
|
|
111
|
+
updateContainerSize(canvasWidth, canvasHeight);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let offsetX = $state(0);
|
|
115
|
+
let offsetY = $state(0);
|
|
116
|
+
|
|
117
|
+
$effect(() => {
|
|
118
|
+
updateOffset(offsetX, offsetY);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
$effect(() => {
|
|
122
|
+
updateScale($pixelScale);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
function updateCanvasCutout() {
|
|
126
|
+
if (!containerElement || !canvasElement) return;
|
|
127
|
+
|
|
128
|
+
const containerRect = containerElement.getBoundingClientRect();
|
|
129
|
+
|
|
130
|
+
const windowSizeX = window.innerWidth;
|
|
131
|
+
const canvasSizeX = canvasElement.offsetWidth;
|
|
132
|
+
const containerSizeX = containerElement.offsetWidth;
|
|
133
|
+
const containerOvershootX = -containerRect.left;
|
|
134
|
+
offsetX =
|
|
135
|
+
clamp(0, containerOvershootX - (canvasSizeX - windowSizeX) / 2, containerSizeX - canvasSizeX) * $pixelScale;
|
|
136
|
+
|
|
137
|
+
const windowSizeY = window.innerHeight;
|
|
138
|
+
const canvasSizeY = canvasElement.offsetHeight;
|
|
139
|
+
const containerSizeY = containerElement.offsetHeight;
|
|
140
|
+
const containerOvershootY = offsetFromBottom
|
|
141
|
+
? containerRect.top + containerSizeY - windowSizeY
|
|
142
|
+
: -containerRect.top;
|
|
143
|
+
offsetY =
|
|
144
|
+
clamp(0, containerOvershootY - (canvasSizeY - windowSizeY) / 2, containerSizeY - canvasSizeY) * $pixelScale;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
onDestroy(cancelRender);
|
|
148
|
+
</script>
|
|
149
|
+
|
|
150
|
+
{#if canRender}
|
|
151
|
+
<div
|
|
152
|
+
bind:this={containerElement}
|
|
153
|
+
use:devicePixelResizeObserver
|
|
154
|
+
ondevicepixelresize={updateContainerSizeInner}
|
|
155
|
+
use:intersectionObserver
|
|
156
|
+
onintersectionchanged={updateCanvasCutout}
|
|
157
|
+
style:--width={width}
|
|
158
|
+
style:--height={height}
|
|
159
|
+
>
|
|
160
|
+
<canvas
|
|
161
|
+
bind:this={canvasElement}
|
|
162
|
+
use:devicePixelResizeObserver
|
|
163
|
+
ondevicepixelresize={updateCanvasSizeInner}
|
|
164
|
+
use:intersectionObserver={{ rootMargin: '100px' }}
|
|
165
|
+
onintersectionchanged={updateCanvasCutout}
|
|
166
|
+
class:offset-from-bottom={offsetFromBottom}
|
|
167
|
+
style:--max-size="{maxSize / $pixelScale}px"
|
|
168
|
+
style:--offset-x="{offsetX / $pixelScale}px"
|
|
169
|
+
style:--offset-y="{offsetY / $pixelScale}px"
|
|
170
|
+
>
|
|
171
|
+
{@render children?.()}
|
|
172
|
+
</canvas>
|
|
173
|
+
</div>
|
|
174
|
+
{:else}
|
|
175
|
+
{@render children?.()}
|
|
176
|
+
{/if}
|
|
177
|
+
|
|
178
|
+
<style>
|
|
179
|
+
div {
|
|
180
|
+
position: relative;
|
|
181
|
+
width: var(--width, 100%);
|
|
182
|
+
height: var(--height, 100%);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
canvas {
|
|
186
|
+
/* Fix bottom spacing */
|
|
187
|
+
display: block;
|
|
188
|
+
|
|
189
|
+
width: 100%;
|
|
190
|
+
height: 100%;
|
|
191
|
+
max-width: var(--max-size);
|
|
192
|
+
max-height: var(--max-size);
|
|
193
|
+
|
|
194
|
+
position: absolute;
|
|
195
|
+
left: var(--offset-x);
|
|
196
|
+
|
|
197
|
+
top: var(--offset-y);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
canvas.offset-from-bottom {
|
|
201
|
+
top: unset;
|
|
202
|
+
bottom: var(--offset-y);
|
|
203
|
+
}
|
|
204
|
+
</style>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
type Props = {
|
|
3
|
+
width?: string;
|
|
4
|
+
height?: string;
|
|
5
|
+
canRender: boolean;
|
|
6
|
+
maxSize: number;
|
|
7
|
+
render: () => void | Promise<void>;
|
|
8
|
+
rerenderEveryFrame: boolean;
|
|
9
|
+
forceAnimation: boolean;
|
|
10
|
+
offsetFromBottom?: boolean;
|
|
11
|
+
updateCanvasSize?: (canvasWidth: number, canvasHeight: number) => void | Promise<void>;
|
|
12
|
+
updateContainerSize: (containerWidth: number, containerHeight: number) => void | Promise<void>;
|
|
13
|
+
updateOffset: (offsetX: number, offsetY: number) => void | Promise<void>;
|
|
14
|
+
updateScale: (scale: number) => void | Promise<void>;
|
|
15
|
+
updateTime: (time: number) => void | Promise<void>;
|
|
16
|
+
canvasElement: HTMLCanvasElement | null;
|
|
17
|
+
requestRender: () => void;
|
|
18
|
+
children?: Snippet;
|
|
19
|
+
};
|
|
20
|
+
declare const BaseShader: import("svelte").Component<Props, {}, "canvasElement" | "requestRender">;
|
|
21
|
+
type BaseShader = ReturnType<typeof BaseShader>;
|
|
22
|
+
export default BaseShader;
|
|
23
|
+
//# sourceMappingURL=BaseShader.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseShader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shader/BaseShader.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAOpC,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAkJJ,QAAA,MAAM,UAAU,0EAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
export type { BuiltinValue, BuiltinParameter, NonBuiltinParameter, WebGlParameter as Parameter } from './types.js';
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import { onMount } from 'svelte';
|
|
7
|
+
import type { Snippet } from 'svelte';
|
|
8
|
+
|
|
9
|
+
import BaseShader from './BaseShader.svelte';
|
|
10
|
+
import type { BuiltinParameter, WebGlParameter as Parameter } from './types.js';
|
|
11
|
+
import { isBuiltinValue } from './types.js';
|
|
12
|
+
|
|
13
|
+
type Props = {
|
|
14
|
+
width?: string;
|
|
15
|
+
height?: string;
|
|
16
|
+
code: string | Promise<string>;
|
|
17
|
+
parameters?: readonly Parameter[];
|
|
18
|
+
forceAnimation?: boolean;
|
|
19
|
+
children?: Snippet;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let {
|
|
23
|
+
width = undefined,
|
|
24
|
+
height = undefined,
|
|
25
|
+
code,
|
|
26
|
+
parameters = [],
|
|
27
|
+
forceAnimation = false,
|
|
28
|
+
children
|
|
29
|
+
}: Props = $props();
|
|
30
|
+
|
|
31
|
+
const rerenderEveryFrame = $derived(parameters.some((parameter) => parameter.value === 'time'));
|
|
32
|
+
|
|
33
|
+
const maxTextureSize = 4096;
|
|
34
|
+
|
|
35
|
+
let requestRender = $state<() => void>(() => {});
|
|
36
|
+
let canvasElement = $state<HTMLCanvasElement | null>(null);
|
|
37
|
+
|
|
38
|
+
let canRender = $state(typeof WebGL2RenderingContext !== 'undefined');
|
|
39
|
+
|
|
40
|
+
type Config = {
|
|
41
|
+
gl: WebGL2RenderingContext;
|
|
42
|
+
shaderProgram: WebGLProgram;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const configPromise = new Promise<Config>((resolve) =>
|
|
46
|
+
onMount(async () => {
|
|
47
|
+
try {
|
|
48
|
+
if (!canRender) return;
|
|
49
|
+
|
|
50
|
+
if (canvasElement === null) return;
|
|
51
|
+
const gl = canvasElement.getContext('webgl2');
|
|
52
|
+
if (gl === null) throw new Error('Failed to get WebGL2 context.');
|
|
53
|
+
const shaderProgram = gl.createProgram();
|
|
54
|
+
if (shaderProgram === null) throw new Error('Failed to create WebGL shader program.');
|
|
55
|
+
|
|
56
|
+
const loadShader = (source: string, type: number) => {
|
|
57
|
+
const shader = gl.createShader(type);
|
|
58
|
+
if (shader === null) throw new Error('Failed to create texture.');
|
|
59
|
+
gl.shaderSource(shader, source);
|
|
60
|
+
gl.compileShader(shader);
|
|
61
|
+
|
|
62
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
|
|
63
|
+
throw new Error(`An error occurred compiling the shaders: ${gl.getShaderInfoLog(shader)}`);
|
|
64
|
+
|
|
65
|
+
gl.attachShader(shaderProgram, shader);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Simple identity function
|
|
69
|
+
const vertexShaderSource = `#version 300 es
|
|
70
|
+
in vec4 pos;
|
|
71
|
+
void main() {
|
|
72
|
+
gl_Position = pos;
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
75
|
+
loadShader(vertexShaderSource, gl.VERTEX_SHADER);
|
|
76
|
+
loadShader(await code, gl.FRAGMENT_SHADER);
|
|
77
|
+
|
|
78
|
+
gl.linkProgram(shaderProgram);
|
|
79
|
+
gl.useProgram(shaderProgram);
|
|
80
|
+
|
|
81
|
+
// Create a rectangle covering the canvas
|
|
82
|
+
const vertexAttributePosition = gl.getAttribLocation(shaderProgram, 'pos');
|
|
83
|
+
const positionBuffer = gl.createBuffer();
|
|
84
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
|
85
|
+
const positions = [1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0];
|
|
86
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
|
|
87
|
+
const numComponents = 2;
|
|
88
|
+
const type = gl.FLOAT;
|
|
89
|
+
const normalize = false;
|
|
90
|
+
const stride = 0;
|
|
91
|
+
const offset = 0;
|
|
92
|
+
gl.vertexAttribPointer(vertexAttributePosition, numComponents, type, normalize, stride, offset);
|
|
93
|
+
gl.enableVertexAttribArray(vertexAttributePosition);
|
|
94
|
+
|
|
95
|
+
resolve({ gl, shaderProgram });
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.warn(error);
|
|
98
|
+
canRender = false;
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
async function render() {
|
|
104
|
+
const { gl } = await configPromise;
|
|
105
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function updateCanvasSize(canvasWidth: number, canvasHeight: number) {
|
|
109
|
+
const { gl } = await configPromise;
|
|
110
|
+
gl.viewport(0, 0, canvasWidth, canvasHeight);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function updateContainerSize(containerWidth: number, containerHeight: number) {
|
|
114
|
+
const { gl, shaderProgram } = await configPromise;
|
|
115
|
+
|
|
116
|
+
const resolutionParam = parameters.find(
|
|
117
|
+
(parameter): parameter is BuiltinParameter => parameter.value === 'resolution'
|
|
118
|
+
);
|
|
119
|
+
if (resolutionParam !== undefined) {
|
|
120
|
+
const uniformPosition = gl.getUniformLocation(shaderProgram, resolutionParam.name);
|
|
121
|
+
gl.uniform2fv(uniformPosition, [containerWidth, containerHeight]);
|
|
122
|
+
|
|
123
|
+
// If the resolution is not passed to the shader, rerendering cannot change the output.
|
|
124
|
+
requestRender();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async function updateOffset(offsetX: number, offsetY: number) {
|
|
129
|
+
const { gl, shaderProgram } = await configPromise;
|
|
130
|
+
|
|
131
|
+
const offsetParam = parameters.find((parameter): parameter is BuiltinParameter => parameter.value === 'offset');
|
|
132
|
+
if (offsetParam !== undefined) {
|
|
133
|
+
const uniformPosition = gl.getUniformLocation(shaderProgram, offsetParam.name);
|
|
134
|
+
gl.uniform2fv(uniformPosition, [offsetX, offsetY]);
|
|
135
|
+
|
|
136
|
+
// If the offset is not passed to the shader, rerendering cannot change the output.
|
|
137
|
+
requestRender();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function updateScale(scale: number) {
|
|
142
|
+
const { gl, shaderProgram } = await configPromise;
|
|
143
|
+
|
|
144
|
+
const scaleParam = parameters.find((parameter): parameter is BuiltinParameter => parameter.value === 'scale');
|
|
145
|
+
if (scaleParam !== undefined) {
|
|
146
|
+
const uniformPosition = gl.getUniformLocation(shaderProgram, scaleParam.name);
|
|
147
|
+
gl.uniform1f(uniformPosition, scale);
|
|
148
|
+
|
|
149
|
+
// If the scale is not passed to the shader, rerendering cannot change the output.
|
|
150
|
+
requestRender();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function updateTime(time: number) {
|
|
155
|
+
const { gl, shaderProgram } = await configPromise;
|
|
156
|
+
|
|
157
|
+
const timeParam = parameters.find((parameter): parameter is BuiltinParameter => parameter.value === 'time');
|
|
158
|
+
if (timeParam !== undefined) {
|
|
159
|
+
const uniformPosition = gl.getUniformLocation(shaderProgram, timeParam.name);
|
|
160
|
+
gl.uniform1f(uniformPosition, time);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function isBuiltinParameter(parameter: Parameter): parameter is BuiltinParameter {
|
|
165
|
+
const shouldBeBuiltin = typeof parameter.value === 'string';
|
|
166
|
+
if (!shouldBeBuiltin) return false;
|
|
167
|
+
|
|
168
|
+
if (isBuiltinValue(parameter.value)) return true;
|
|
169
|
+
|
|
170
|
+
throw new Error(`Unknown built-in value: ${parameter.value}`);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function updateParameters(nextParameters: readonly Parameter[]) {
|
|
174
|
+
const { gl, shaderProgram } = await configPromise;
|
|
175
|
+
|
|
176
|
+
for (const parameter of nextParameters) {
|
|
177
|
+
if (parameter.value === undefined) throw new Error('One or more parameters had an undefined value field.');
|
|
178
|
+
|
|
179
|
+
if (!isBuiltinParameter(parameter)) {
|
|
180
|
+
const uniformPosition = gl.getUniformLocation(shaderProgram, parameter.name);
|
|
181
|
+
switch (parameter.type) {
|
|
182
|
+
case 'float':
|
|
183
|
+
gl.uniform1f(uniformPosition, parameter.value);
|
|
184
|
+
break;
|
|
185
|
+
case 'vec2':
|
|
186
|
+
gl.uniform2fv(uniformPosition, parameter.value);
|
|
187
|
+
break;
|
|
188
|
+
case 'vec3':
|
|
189
|
+
gl.uniform3fv(uniformPosition, parameter.value);
|
|
190
|
+
break;
|
|
191
|
+
case 'vec4':
|
|
192
|
+
gl.uniform4fv(uniformPosition, parameter.value);
|
|
193
|
+
break;
|
|
194
|
+
case 'int':
|
|
195
|
+
gl.uniform1i(uniformPosition, parameter.value);
|
|
196
|
+
break;
|
|
197
|
+
case 'ivec2':
|
|
198
|
+
gl.uniform2iv(uniformPosition, parameter.value);
|
|
199
|
+
break;
|
|
200
|
+
case 'ivec3':
|
|
201
|
+
gl.uniform3iv(uniformPosition, parameter.value);
|
|
202
|
+
break;
|
|
203
|
+
case 'ivec4':
|
|
204
|
+
gl.uniform4iv(uniformPosition, parameter.value);
|
|
205
|
+
break;
|
|
206
|
+
case 'uint':
|
|
207
|
+
gl.uniform1ui(uniformPosition, parameter.value);
|
|
208
|
+
break;
|
|
209
|
+
case 'uvec2':
|
|
210
|
+
gl.uniform2uiv(uniformPosition, parameter.value);
|
|
211
|
+
break;
|
|
212
|
+
case 'uvec3':
|
|
213
|
+
gl.uniform3uiv(uniformPosition, parameter.value);
|
|
214
|
+
break;
|
|
215
|
+
case 'uvec4':
|
|
216
|
+
gl.uniform4uiv(uniformPosition, parameter.value);
|
|
217
|
+
break;
|
|
218
|
+
case 'mat2':
|
|
219
|
+
gl.uniformMatrix2fv(uniformPosition, false, parameter.value);
|
|
220
|
+
break;
|
|
221
|
+
case 'mat3':
|
|
222
|
+
gl.uniformMatrix3fv(uniformPosition, false, parameter.value);
|
|
223
|
+
break;
|
|
224
|
+
case 'mat4':
|
|
225
|
+
gl.uniformMatrix4fv(uniformPosition, false, parameter.value);
|
|
226
|
+
break;
|
|
227
|
+
default:
|
|
228
|
+
throw new Error(`Unknown parameter type: ${(parameter as { type: string }).type}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
requestRender();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
$effect(() => {
|
|
237
|
+
updateParameters(parameters);
|
|
238
|
+
});
|
|
239
|
+
</script>
|
|
240
|
+
|
|
241
|
+
<BaseShader
|
|
242
|
+
{width}
|
|
243
|
+
{height}
|
|
244
|
+
{canRender}
|
|
245
|
+
maxSize={maxTextureSize}
|
|
246
|
+
offsetFromBottom
|
|
247
|
+
{rerenderEveryFrame}
|
|
248
|
+
{forceAnimation}
|
|
249
|
+
{render}
|
|
250
|
+
{updateCanvasSize}
|
|
251
|
+
{updateContainerSize}
|
|
252
|
+
{updateOffset}
|
|
253
|
+
{updateScale}
|
|
254
|
+
{updateTime}
|
|
255
|
+
bind:canvasElement
|
|
256
|
+
bind:requestRender
|
|
257
|
+
>
|
|
258
|
+
{@render children?.()}
|
|
259
|
+
</BaseShader>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type { BuiltinValue, BuiltinParameter, NonBuiltinParameter, WebGlParameter as Parameter } from './types.js';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { WebGlParameter as Parameter } from './types.js';
|
|
4
|
+
type Props = {
|
|
5
|
+
width?: string;
|
|
6
|
+
height?: string;
|
|
7
|
+
code: string | Promise<string>;
|
|
8
|
+
parameters?: readonly Parameter[];
|
|
9
|
+
forceAnimation?: boolean;
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
};
|
|
12
|
+
declare const WebGlShader: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type WebGlShader = ReturnType<typeof WebGlShader>;
|
|
14
|
+
export default WebGlShader;
|
|
15
|
+
//# sourceMappingURL=WebGlShader.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGlShader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shader/WebGlShader.svelte.ts"],"names":[],"mappings":"AAGE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAIrH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAoB,cAAc,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAI9E,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AA8OJ,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|