fragment-tools 0.1.0

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 (192) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +101 -0
  3. package/bin/index.js +19 -0
  4. package/docs/README.md +18 -0
  5. package/docs/api/CLI.md +44 -0
  6. package/docs/api/renderers.md +80 -0
  7. package/docs/api/sketch.md +216 -0
  8. package/docs/api/triggers.md +101 -0
  9. package/docs/guide/about.md +16 -0
  10. package/docs/guide/exports.md +86 -0
  11. package/docs/guide/external-dependencies.md +22 -0
  12. package/docs/guide/getting-started.md +113 -0
  13. package/docs/guide/hot-shader-reloading.md +20 -0
  14. package/docs/guide/shortcuts.md +12 -0
  15. package/docs/guide/triggers.png +0 -0
  16. package/docs/guide/using-triggers.md +39 -0
  17. package/examples/cube-three.js +34 -0
  18. package/examples/ellipse-p5.js +26 -0
  19. package/examples/icon.fs +96 -0
  20. package/examples/icon.js +63 -0
  21. package/examples/icon.png +0 -0
  22. package/examples/icon.transparent.png +0 -0
  23. package/examples/package-lock.json +40 -0
  24. package/examples/package.json +15 -0
  25. package/examples/shape-2d.js +45 -0
  26. package/examples/shape-three.js +49 -0
  27. package/examples/shape-tree.fs +3 -0
  28. package/package.json +37 -0
  29. package/screenshot.png +0 -0
  30. package/src/cli/db.js +17 -0
  31. package/src/cli/index.js +198 -0
  32. package/src/cli/log.js +26 -0
  33. package/src/cli/plugins/check-dependencies.js +77 -0
  34. package/src/cli/plugins/db.js +12 -0
  35. package/src/cli/plugins/hot-shader-reload.js +86 -0
  36. package/src/cli/plugins/hot-sketch-reload.js +39 -0
  37. package/src/cli/plugins/screenshot.js +31 -0
  38. package/src/cli/server.js +140 -0
  39. package/src/cli/templates/2d.js +15 -0
  40. package/src/cli/templates/fragment.fs +10 -0
  41. package/src/cli/templates/fragment.js +18 -0
  42. package/src/cli/templates/index.js +24 -0
  43. package/src/cli/templates/p5.js +13 -0
  44. package/src/cli/templates/three-fragment.js +53 -0
  45. package/src/cli/templates/three-orthographic.js +23 -0
  46. package/src/cli/templates/three-perspective.js +20 -0
  47. package/src/cli/ws.js +92 -0
  48. package/src/client/app/App.svelte +8 -0
  49. package/src/client/app/client.js +68 -0
  50. package/src/client/app/components/IconCross.svelte +29 -0
  51. package/src/client/app/components/Init.svelte +13 -0
  52. package/src/client/app/components/KeyBinding.svelte +32 -0
  53. package/src/client/app/inputs/Input.js +15 -0
  54. package/src/client/app/inputs/Keyboard.js +21 -0
  55. package/src/client/app/inputs/MIDI.js +144 -0
  56. package/src/client/app/inputs/Mouse.js +5 -0
  57. package/src/client/app/inputs/Webcam.js +98 -0
  58. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +88 -0
  59. package/src/client/app/lib/canvas-recorder/FFMPEGRecorder.js +56 -0
  60. package/src/client/app/lib/canvas-recorder/FrameRecorder.js +40 -0
  61. package/src/client/app/lib/canvas-recorder/GIFRecorder.js +52 -0
  62. package/src/client/app/lib/canvas-recorder/MP4Recorder.js +46 -0
  63. package/src/client/app/lib/canvas-recorder/WebMRecorder.js +30 -0
  64. package/src/client/app/lib/canvas-recorder/mp4.js +20 -0
  65. package/src/client/app/lib/canvas-recorder/mp4.wasm +0 -0
  66. package/src/client/app/lib/canvas-recorder/utils.js +22 -0
  67. package/src/client/app/lib/gl/Geometry.js +39 -0
  68. package/src/client/app/lib/gl/Program.js +130 -0
  69. package/src/client/app/lib/gl/Renderer.js +148 -0
  70. package/src/client/app/lib/gl/Texture.js +114 -0
  71. package/src/client/app/lib/gl/index.js +109 -0
  72. package/src/client/app/lib/gl/utils.js +5 -0
  73. package/src/client/app/lib/helpers/frameDebounce.js +40 -0
  74. package/src/client/app/lib/loader/index.js +20 -0
  75. package/src/client/app/lib/loader/loadImage.js +19 -0
  76. package/src/client/app/lib/loader/loadScript.js +14 -0
  77. package/src/client/app/lib/paper-sizes.js +104 -0
  78. package/src/client/app/lib/presets.js +12 -0
  79. package/src/client/app/lib/tempo/Analyser.js +165 -0
  80. package/src/client/app/lib/tempo/Range.js +97 -0
  81. package/src/client/app/lib/tempo/index.js +138 -0
  82. package/src/client/app/modules/AudioAnalyser/Range.svelte +93 -0
  83. package/src/client/app/modules/AudioAnalyser/Spectrum.svelte +31 -0
  84. package/src/client/app/modules/AudioAnalyser.svelte +70 -0
  85. package/src/client/app/modules/Console/ConsoleLine.svelte +254 -0
  86. package/src/client/app/modules/Console.svelte +82 -0
  87. package/src/client/app/modules/Exports.svelte +105 -0
  88. package/src/client/app/modules/MidiPanel.svelte +106 -0
  89. package/src/client/app/modules/Monitor.svelte +62 -0
  90. package/src/client/app/modules/Params.svelte +112 -0
  91. package/src/client/app/renderers/2DRenderer.js +5 -0
  92. package/src/client/app/renderers/FragmentRenderer.js +62 -0
  93. package/src/client/app/renderers/OGLRenderer.js +0 -0
  94. package/src/client/app/renderers/P5Renderer.js +39 -0
  95. package/src/client/app/renderers/THREERenderer.js +128 -0
  96. package/src/client/app/stores/audioAnalysis.js +10 -0
  97. package/src/client/app/stores/console.js +76 -0
  98. package/src/client/app/stores/errors.js +25 -0
  99. package/src/client/app/stores/exports.js +28 -0
  100. package/src/client/app/stores/index.js +2 -0
  101. package/src/client/app/stores/layout.js +187 -0
  102. package/src/client/app/stores/multisampling.js +16 -0
  103. package/src/client/app/stores/props.js +44 -0
  104. package/src/client/app/stores/renderers.js +60 -0
  105. package/src/client/app/stores/rendering.js +111 -0
  106. package/src/client/app/stores/sketches.js +40 -0
  107. package/src/client/app/stores/time.js +27 -0
  108. package/src/client/app/stores/utils.js +66 -0
  109. package/src/client/app/transitions/fade.js +17 -0
  110. package/src/client/app/transitions/index.js +12 -0
  111. package/src/client/app/transitions/splitX.js +16 -0
  112. package/src/client/app/transitions/splitY.js +16 -0
  113. package/src/client/app/triggers/Keyboard.js +95 -0
  114. package/src/client/app/triggers/MIDI.js +122 -0
  115. package/src/client/app/triggers/Mouse.js +96 -0
  116. package/src/client/app/triggers/Trigger.js +71 -0
  117. package/src/client/app/triggers/index.js +19 -0
  118. package/src/client/app/triggers/shared.js +37 -0
  119. package/src/client/app/ui/Build.svelte +96 -0
  120. package/src/client/app/ui/ErrorOverlay.svelte +130 -0
  121. package/src/client/app/ui/Field.svelte +262 -0
  122. package/src/client/app/ui/FieldGroup.svelte +103 -0
  123. package/src/client/app/ui/FieldSection.svelte +123 -0
  124. package/src/client/app/ui/FieldSpace.svelte +37 -0
  125. package/src/client/app/ui/FieldTrigger.svelte +263 -0
  126. package/src/client/app/ui/FieldTriggers.svelte +58 -0
  127. package/src/client/app/ui/FloatingParams.svelte +49 -0
  128. package/src/client/app/ui/Layout.svelte +50 -0
  129. package/src/client/app/ui/LayoutColumn.svelte +9 -0
  130. package/src/client/app/ui/LayoutComponent.svelte +279 -0
  131. package/src/client/app/ui/LayoutResizer.svelte +218 -0
  132. package/src/client/app/ui/LayoutRoot.svelte +11 -0
  133. package/src/client/app/ui/LayoutRow.svelte +9 -0
  134. package/src/client/app/ui/LayoutToolbar.svelte +264 -0
  135. package/src/client/app/ui/Module.svelte +154 -0
  136. package/src/client/app/ui/ModuleHeaderAction.svelte +87 -0
  137. package/src/client/app/ui/ModuleHeaderButton.svelte +21 -0
  138. package/src/client/app/ui/ModuleHeaderSelect.svelte +50 -0
  139. package/src/client/app/ui/ModuleRenderer.svelte +38 -0
  140. package/src/client/app/ui/OutputRenderer.svelte +149 -0
  141. package/src/client/app/ui/ParamsMultisampling.svelte +109 -0
  142. package/src/client/app/ui/ParamsOutput.svelte +139 -0
  143. package/src/client/app/ui/Preview.svelte +15 -0
  144. package/src/client/app/ui/SelectChevrons.svelte +25 -0
  145. package/src/client/app/ui/SketchRenderer.svelte +672 -0
  146. package/src/client/app/ui/SketchSelect.svelte +49 -0
  147. package/src/client/app/ui/fields/ButtonInput.svelte +54 -0
  148. package/src/client/app/ui/fields/CheckboxInput.svelte +70 -0
  149. package/src/client/app/ui/fields/ColorInput.svelte +187 -0
  150. package/src/client/app/ui/fields/FieldInputRow.svelte +13 -0
  151. package/src/client/app/ui/fields/ImageInput.svelte +145 -0
  152. package/src/client/app/ui/fields/Input.svelte +120 -0
  153. package/src/client/app/ui/fields/ListInput.svelte +106 -0
  154. package/src/client/app/ui/fields/NumberInput.svelte +114 -0
  155. package/src/client/app/ui/fields/ProgressInput.svelte +90 -0
  156. package/src/client/app/ui/fields/Select.svelte +116 -0
  157. package/src/client/app/ui/fields/TextInput.svelte +18 -0
  158. package/src/client/app/ui/fields/Vec2Input.svelte +5 -0
  159. package/src/client/app/ui/fields/Vec3Input.svelte +6 -0
  160. package/src/client/app/ui/fields/VectorInput.svelte +102 -0
  161. package/src/client/app/utils/canvas.utils.js +229 -0
  162. package/src/client/app/utils/color.utils.js +427 -0
  163. package/src/client/app/utils/file.utils.js +77 -0
  164. package/src/client/app/utils/glsl.utils.js +14 -0
  165. package/src/client/app/utils/glslErrors.js +154 -0
  166. package/src/client/app/utils/index.js +39 -0
  167. package/src/client/app/utils/math.utils.js +23 -0
  168. package/src/client/app/utils/props.utils.js +53 -0
  169. package/src/client/index.html +18 -0
  170. package/src/client/main.js +9 -0
  171. package/src/client/public/css/global.css +115 -0
  172. package/src/client/public/favicon.ico +0 -0
  173. package/src/client/public/fonts/Inter-Bold.woff2 +0 -0
  174. package/src/client/public/fonts/Inter-Italic.woff2 +0 -0
  175. package/src/client/public/fonts/Inter-Regular.woff2 +0 -0
  176. package/src/client/public/fonts/Inter-SemiBold.woff2 +0 -0
  177. package/src/client/public/fonts/JetBrainsMono-Regular.woff2 +0 -0
  178. package/src/client/public/icons/chevron-bottom.svg +3 -0
  179. package/src/client/public/icons/chevron-right.svg +3 -0
  180. package/src/client/public/icons/chevron-top.svg +3 -0
  181. package/src/client/public/icons/columns-horizontal.svg +4 -0
  182. package/src/client/public/icons/columns-vertical.svg +4 -0
  183. package/src/client/public/icons/folder-plus.svg +6 -0
  184. package/src/client/public/icons/lock.svg +4 -0
  185. package/src/client/public/icons/picture-in-picture.svg +4 -0
  186. package/src/client/public/icons/trash.svg +5 -0
  187. package/src/client/public/icons/trigger.svg +8 -0
  188. package/src/client/public/icons/unlock.svg +4 -0
  189. package/src/client/public/js/ffmpeg.min.js +2 -0
  190. package/src/client/public/js/ffmpeg.min.js.map +1 -0
  191. package/src/client/public/js/gif.js +2 -0
  192. package/src/client/public/js/gif.worker.js +2 -0
@@ -0,0 +1,88 @@
1
+ let noop = () => {};
2
+
3
+ class CanvasRecorder {
4
+
5
+ constructor(canvas, {
6
+ duration = Infinity,
7
+ framerate = 25,
8
+ quality = 100,
9
+ onStart = noop,
10
+ onTick = noop,
11
+ onComplete = noop,
12
+ }) {
13
+ this.canvas = canvas;
14
+ this.framerate = framerate;
15
+ this.duration = duration;
16
+ this.quality = quality;
17
+ this.onStart = onStart;
18
+ this.onTick = onTick;
19
+ this.onComplete = onComplete;
20
+
21
+ this.time = 0;
22
+ this.deltaTime = (1000 / this.framerate);
23
+
24
+ this.frameDuration = (1000 / this.framerate);
25
+ this.frameTotal = isFinite(duration) ? this.duration * this.framerate : Infinity;
26
+ this.started = false;
27
+ this.stopped = false;
28
+ }
29
+
30
+ async load() {}
31
+
32
+ async start() {
33
+ this.onStart();
34
+
35
+ await this.load();
36
+
37
+ if (this.stopped) {
38
+ console.log(`CanvasRecorder : stopped while loading`);
39
+ return;
40
+ }
41
+
42
+ console.log(`CanvasRecorder - start rendering ${this.frameTotal} frames at ${this.framerate}fps for ${this.duration}s.`);
43
+
44
+ this.frameCount = 0;
45
+ this.started = true;
46
+ this.stopped = false;
47
+
48
+ this._tick();
49
+ }
50
+
51
+ async _tick() {
52
+ console.log(`CanvasRecorder - render frame ${this.frameCount}`);
53
+ this.onTick({
54
+ time: this.time,
55
+ deltaTime: this.deltaTime,
56
+ });
57
+
58
+ await this.tick({
59
+ time: this.time,
60
+ deltaTime: this.deltaTime,
61
+ frameCount: this.frameCount,
62
+ });
63
+
64
+ if (this.started && !this.stopped && (!isFinite(this.frameTotal) || (isFinite(this.frameTotal) && this.frameCount < this.frameTotal))) {
65
+ this.time += this.deltaTime;
66
+ this.frameCount++;
67
+ requestAnimationFrame(() => {
68
+ this._tick()
69
+ });
70
+ } else {
71
+ console.log(`CanvasRecorder - compiling ${this.frameCount} frames...`);
72
+ this.end();
73
+ }
74
+ }
75
+
76
+ tick() {}
77
+
78
+ end() {
79
+ console.log(`CanvasRecorder - compiled ${this.frameCount} frames`);
80
+ this.onComplete(this.result);
81
+ }
82
+
83
+ stop() {
84
+ this.stopped = true;
85
+ }
86
+ }
87
+
88
+ export default CanvasRecorder;
@@ -0,0 +1,56 @@
1
+ import { loadScript } from "../loader/loadScript";
2
+ import CanvasRecorder from "./CanvasRecorder";
3
+
4
+ let ffmpeg;
5
+
6
+ class MP4Recorder extends CanvasRecorder {
7
+
8
+ static loaded = false;
9
+
10
+ constructor(canvas, options) {
11
+ super(canvas, options);
12
+ }
13
+
14
+ async load() {
15
+ if (!MP4Recorder.loaded) {
16
+ await loadScript("/js/ffmpeg.min.js");
17
+
18
+ MP4Recorder.loaded = true;
19
+ }
20
+
21
+ if (!ffmpeg) {
22
+ const { createFFmpeg } = FFmpeg;
23
+
24
+ ffmpeg = createFFmpeg({ log: false });
25
+ }
26
+
27
+ if (!ffmpeg.isLoaded()) {
28
+ console.log(`[fragment] MP4Recorder - loading ffmpeg...`);
29
+ return ffmpeg.load().then(() => {
30
+ console.log(`[fragment] MP4 Recorder - loaded ffpmpeg`);
31
+ })
32
+ }
33
+ }
34
+
35
+ tick() {
36
+ return new Promise((resolve, reject) => {
37
+ this.canvas.toBlob(async (blob) => {
38
+ const fn = `frame_${this.frameCount.toString().padStart(4, '0')}.png`;
39
+ ffmpeg.FS('writeFile', fn, new Uint8Array(await blob.arrayBuffer()));
40
+ resolve();
41
+ });
42
+ });
43
+ }
44
+
45
+ async end() {
46
+ await ffmpeg.run(...(`-r ${this.framerate} -i frame_%04d.png -vcodec libx264 -pix_fmt yuv420p output.mp4`.split(' ')));
47
+ const data = ffmpeg.FS('readFile', `output.mp4`);
48
+
49
+ this.result = new Blob([data.buffer], { type: `video/mp4` });
50
+
51
+ super.end();
52
+ }
53
+
54
+ }
55
+
56
+ export default MP4Recorder;
@@ -0,0 +1,40 @@
1
+ import { createBlobFromDataURL } from "../../utils/file.utils";
2
+ import { map } from "../../utils/math.utils";
3
+ import CanvasRecorder from "./CanvasRecorder";
4
+ import { exportCanvas } from "./utils";
5
+
6
+ class FrameRecorder extends CanvasRecorder {
7
+
8
+ constructor(canvas, options) {
9
+ super(canvas, options);
10
+
11
+ const { imageEncoding = 'png' } = options;
12
+
13
+ this.imageEncoding = imageEncoding;
14
+
15
+ this.imageQuality = map(this.quality, 1, 100, 0, 1);
16
+ }
17
+
18
+ start() {
19
+ this.frames = [];
20
+
21
+ super.start();
22
+ }
23
+
24
+ tick() {
25
+ let { dataURL } = exportCanvas(this.canvas, {
26
+ encoding: `image/${this.imageEncoding}`,
27
+ encodingQuality: this.imageQuality,
28
+ });
29
+
30
+ this.frames[this.frameCount] = dataURL;
31
+ }
32
+
33
+ async end() {
34
+ this.result = await Promise.all(this.frames.map((dataURL) => createBlobFromDataURL(dataURL)));
35
+
36
+ super.end();
37
+ }
38
+ }
39
+
40
+ export default FrameRecorder;
@@ -0,0 +1,52 @@
1
+ import { map } from "../../utils/math.utils";
2
+ import { loadScript } from "../loader/loadScript";
3
+ import CanvasRecorder from "./CanvasRecorder";
4
+
5
+ class GIFRecorder extends CanvasRecorder {
6
+
7
+ static loaded = false;
8
+
9
+ async load() {
10
+ if (!GIFRecorder.loaded) {
11
+ await loadScript('/js/gif.worker.js');
12
+ await loadScript('/js/gif.js');
13
+
14
+ GIFRecorder.loaded = true;
15
+ }
16
+
17
+ const quality = map(this.quality, 1, 100, 10, 0);
18
+
19
+ this.writer = new GIF({
20
+ workerScript: '/js/gif.worker.js',
21
+ workers: 4,
22
+ quality,
23
+ width: this.canvas.width,
24
+ height: this.canvas.height,
25
+ });
26
+ }
27
+
28
+ tick() {
29
+ this.writer.addFrame(this.canvas, { copy: true, delay: this.frameDuration });
30
+ }
31
+
32
+ end() {
33
+ return new Promise((resolve, reject) => {
34
+ this.writer.on('finished', (result) => {
35
+ this.result = result;
36
+ this.writer = null;
37
+
38
+ super.end();
39
+
40
+ resolve();
41
+ });
42
+
43
+ this.writer.on('error', (err) => {
44
+ reject(err);
45
+ });
46
+
47
+ this.writer.render();
48
+ });
49
+ }
50
+ }
51
+
52
+ export default GIFRecorder;
@@ -0,0 +1,46 @@
1
+ import loadMP4Module, { isWebCodecsSupported } from "./mp4.js";
2
+ import CanvasRecorder from "./CanvasRecorder";
3
+
4
+ let MP4;
5
+
6
+ class MP4Recorder extends CanvasRecorder {
7
+
8
+ static loaded = false;
9
+ static isSupported = true;
10
+
11
+ constructor(canvas, options) {
12
+ super(canvas, options);
13
+ }
14
+
15
+ async load() {
16
+ if (!MP4Recorder.loaded) {
17
+ MP4 = await loadMP4Module();
18
+
19
+ MP4Recorder.loaded = true;
20
+ }
21
+
22
+ this.encoder = MP4.createWebCodecsEncoder({
23
+ width: this.canvas.width,
24
+ height: this.canvas.height,
25
+ fps: this.framerate,
26
+ });
27
+ }
28
+
29
+ async tick() {
30
+ const bitmap = await window.createImageBitmap(this.canvas);
31
+
32
+ // Add bitmap to encoder
33
+ await this.encoder.addFrame(bitmap);
34
+ }
35
+
36
+ async end() {
37
+ const buffer = await this.encoder.end();
38
+
39
+ this.result = new Blob([buffer], { type: "video/mp4" })
40
+
41
+ super.end();
42
+ }
43
+
44
+ }
45
+
46
+ export default MP4Recorder;
@@ -0,0 +1,30 @@
1
+ import WebMWriter from "webm-writer";
2
+ import { map } from "../../utils/math.utils";
3
+ import CanvasRecorder from "./CanvasRecorder";
4
+
5
+ class WebMRecorder extends CanvasRecorder {
6
+
7
+ start() {
8
+ const quality = map(this.quality, 1, 100, 0, 0.99999);
9
+
10
+ this.writer = new WebMWriter({
11
+ quality,
12
+ frameRate: this.framerate,
13
+ });
14
+
15
+ super.start();
16
+ }
17
+
18
+ tick() {
19
+ this.writer.addFrame(this.canvas);
20
+ }
21
+
22
+ async end() {
23
+ this.result = await this.writer.complete();
24
+ this.writer = null;
25
+
26
+ super.end();
27
+ }
28
+ }
29
+
30
+ export default WebMRecorder;
@@ -0,0 +1,20 @@
1
+ //https://unpkg.com/mp4-wasm@1.0.6/build/mp4.js
2
+
3
+ var Pr=function(){var _=import.meta.url;return function(t){t=t||{};var t=typeof t!="undefined"?t:{},u,h;t.ready=new Promise(function(r,n){u=r,h=n}),t.create_buffer=function(n){return t._malloc(n)},t.free_buffer=function(n){return t._free(n)},t.locateFile=function(n,e){return t.simd&&(n=n.replace(/\.wasm$/i,".simd.wasm")),t.getWasmPath?t.getWasmPath(n,e,t.simd):e+n},t.createWebCodecsEncoder=function(n){return Kr(t,n)};var m={},l;for(l in t)t.hasOwnProperty(l)&&(m[l]=t[l]);var p=[],j="./this.program",N=function(r,n){throw n},W=!1,k=!1,x=!1,L=!1;W=typeof window=="object",k=typeof importScripts=="function",x=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",L=!W&&!x&&!k;var y="";function z(r){return t.locateFile?t.locateFile(r,y):y+r}var sr,nr,J,lr;(W||k)&&(k?y=self.location.href:typeof document!="undefined"&&document.currentScript&&(y=document.currentScript.src),_&&(y=_),y.indexOf("blob:")!==0?y=y.substr(0,y.lastIndexOf("/")+1):y="",sr=function(r){var n=new XMLHttpRequest;return n.open("GET",r,!1),n.send(null),n.responseText},k&&(J=function(r){var n=new XMLHttpRequest;return n.open("GET",r,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)}),nr=function(r,n,e){var i=new XMLHttpRequest;i.open("GET",r,!0),i.responseType="arraybuffer",i.onload=function(){if(i.status==200||i.status==0&&i.response){n(i.response);return}e()},i.onerror=e,i.send(null)},lr=function(r){document.title=r});var er=t.print||console.log.bind(console),P=t.printErr||console.warn.bind(console);for(l in m)m.hasOwnProperty(l)&&(t[l]=m[l]);m=null,t.arguments&&(p=t.arguments),t.thisProgram&&(j=t.thisProgram),t.quit&&(N=t.quit);var X;t.wasmBinary&&(X=t.wasmBinary);var Wr=t.noExitRuntime||!0;typeof WebAssembly!="object"&&ar("no native wasm support detected");var K,w=!1,b;function I(r,n,e){for(var i=n+e,a="";!(n>=i);){var f=r[n++];if(!f)return a;if(!(f&128)){a+=String.fromCharCode(f);continue}var c=r[n++]&63;if((f&224)==192){a+=String.fromCharCode((f&31)<<6|c);continue}var o=r[n++]&63;if((f&240)==224?f=(f&15)<<12|c<<6|o:f=(f&7)<<18|c<<12|o<<6|r[n++]&63,f<65536)a+=String.fromCharCode(f);else{var s=f-65536;a+=String.fromCharCode(55296|s>>10,56320|s&1023)}}return a}function A(r,n){return r?I(U,r,n):""}function O(r,n,e,i){if(!(i>0))return 0;for(var a=e,f=e+i-1,c=0;c<r.length;++c){var o=r.charCodeAt(c);if(o>=55296&&o<=57343){var s=r.charCodeAt(++c);o=65536+((o&1023)<<10)|s&1023}if(o<=127){if(e>=f)break;n[e++]=o}else if(o<=2047){if(e+1>=f)break;n[e++]=192|o>>6,n[e++]=128|o&63}else if(o<=65535){if(e+2>=f)break;n[e++]=224|o>>12,n[e++]=128|o>>6&63,n[e++]=128|o&63}else{if(e+3>=f)break;n[e++]=240|o>>18,n[e++]=128|o>>12&63,n[e++]=128|o>>6&63,n[e++]=128|o&63}}return n[e]=0,e-a}function E(r,n,e){return O(r,U,n,e)}function vr(r){for(var n=0,e=0;e<r.length;++e){var i=r.charCodeAt(e);i>=55296&&i<=57343&&(i=65536+((i&1023)<<10)|r.charCodeAt(++e)&1023),i<=127?++n:i<=2047?n+=2:i<=65535?n+=3:n+=4}return n}function Zr(r,n){for(var e="",i=0;!(i>=n/2);++i){var a=Z[r+i*2>>1];if(a==0)break;e+=String.fromCharCode(a)}return e}function Qr(r,n,e){if(e===void 0&&(e=2147483647),e<2)return 0;e-=2;for(var i=n,a=e<r.length*2?e/2:r.length,f=0;f<a;++f){var c=r.charCodeAt(f);Z[n>>1]=c,n+=2}return Z[n>>1]=0,n-i}function Mr(r){return r.length*2}function rn(r,n){for(var e=0,i="";!(e>=n/4);){var a=V[r+e*4>>2];if(a==0)break;if(++e,a>=65536){var f=a-65536;i+=String.fromCharCode(55296|f>>10,56320|f&1023)}else i+=String.fromCharCode(a)}return i}function nn(r,n,e){if(e===void 0&&(e=2147483647),e<4)return 0;for(var i=n,a=i+e-4,f=0;f<r.length;++f){var c=r.charCodeAt(f);if(c>=55296&&c<=57343){var o=r.charCodeAt(++f);c=65536+((c&1023)<<10)|o&1023}if(V[n>>2]=c,n+=4,n+4>a)break}return V[n>>2]=0,n-i}function en(r){for(var n=0,e=0;e<r.length;++e){var i=r.charCodeAt(e);i>=55296&&i<=57343&&++e,n+=4}return n}function tn(r,n){return r%n>0&&(r+=n-r%n),r}var pr,_r,U,Z,hr,V,D,kr,Ir;function Or(r){pr=r,t.HEAP8=_r=new Int8Array(r),t.HEAP16=Z=new Int16Array(r),t.HEAP32=V=new Int32Array(r),t.HEAPU8=U=new Uint8Array(r),t.HEAPU16=hr=new Uint16Array(r),t.HEAPU32=D=new Uint32Array(r),t.HEAPF32=kr=new Float32Array(r),t.HEAPF64=Ir=new Float64Array(r)}var me=t.INITIAL_MEMORY||16777216,tr,Lr=[],Vr=[],Dr=[],an=!1;function on(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)cn(t.preRun.shift());yr(Lr)}function fn(){an=!0,yr(Vr)}function sn(){if(t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;)ln(t.postRun.shift());yr(Dr)}function cn(r){Lr.unshift(r)}function un(r){Vr.unshift(r)}function ln(r){Dr.unshift(r)}var G=0,gr=null,ir=null;function vn(r){G++,t.monitorRunDependencies&&t.monitorRunDependencies(G)}function pn(r){if(G--,t.monitorRunDependencies&&t.monitorRunDependencies(G),G==0&&(gr!==null&&(clearInterval(gr),gr=null),ir)){var n=ir;ir=null,n()}}t.preloadedImages={},t.preloadedAudios={};function ar(r){t.onAbort&&t.onAbort(r),r+="",P(r),w=!0,b=1,r="abort("+r+"). Build with -s ASSERTIONS=1 for more info.";var n=new WebAssembly.RuntimeError(r);throw h(n),n}var _n="data:application/octet-stream;base64,";function Hr(r){return r.startsWith(_n)}var R;t.locateFile?(R="mp4.wasm",Hr(R)||(R=z(R))):R=new URL("mp4.wasm",import.meta.url).toString();function Br(r){try{if(r==R&&X)return new Uint8Array(X);if(J)return J(r);throw"both async and sync fetching of the wasm failed"}catch(n){ar(n)}}function hn(){return!X&&(W||k)&&typeof fetch=="function"?fetch(R,{credentials:"same-origin"}).then(function(r){if(!r.ok)throw"failed to load wasm binary file at '"+R+"'";return r.arrayBuffer()}).catch(function(){return Br(R)}):Promise.resolve().then(function(){return Br(R)})}function gn(){var r={a:ce};function n(c,o){var s=c.exports;t.asm=s,K=t.asm.x,Or(K.buffer),tr=t.asm.B,un(t.asm.y),pn("wasm-instantiate")}vn("wasm-instantiate");function e(c){n(c.instance)}function i(c){return hn().then(function(o){var s=WebAssembly.instantiate(o,r);return s}).then(c,function(o){P("failed to asynchronously prepare wasm: "+o),ar(o)})}function a(){return!X&&typeof WebAssembly.instantiateStreaming=="function"&&!Hr(R)&&typeof fetch=="function"?fetch(R,{credentials:"same-origin"}).then(function(c){var o=WebAssembly.instantiateStreaming(c,r);return o.then(e,function(s){return P("wasm streaming compile failed: "+s),P("falling back to ArrayBuffer instantiation"),i(e)})}):i(e)}if(t.instantiateWasm)try{var f=t.instantiateWasm(r,n);return f}catch(c){return P("Module.instantiateWasm callback failed with error: "+c),!1}return a().catch(h),{}}function yr(r){for(;r.length>0;){var n=r.shift();if(typeof n=="function"){n(t);continue}var e=n.func;typeof e=="number"?n.arg===void 0?tr.get(e)():tr.get(e)(n.arg):e(n.arg===void 0?null:n.arg)}}function yn(r,n,e,i){ar("Assertion failed: "+A(r)+", at: "+[n?A(n):"unknown filename",e,i?A(i):"unknown function"])}function dn(r,n,e,i,a){}function dr(r){switch(r){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+r)}}function mn(){for(var r=new Array(256),n=0;n<256;++n)r[n]=String.fromCharCode(n);jr=r}var jr=void 0;function S(r){for(var n="",e=r;U[e];)n+=jr[U[e++]];return n}var Q={},Y={},cr={},wn=48,bn=57;function Nr(r){if(r===void 0)return"_unknown";r=r.replace(/[^a-zA-Z0-9_]/g,"$");var n=r.charCodeAt(0);return n>=wn&&n<=bn?"_"+r:r}function qr(r,n){return r=Nr(r),new Function("body","return function "+r+`() {
4
+ "use strict"; return body.apply(this, arguments);
5
+ };
6
+ `)(n)}function mr(r,n){var e=qr(n,function(i){this.name=n,this.message=i;var a=new Error(i).stack;a!==void 0&&(this.stack=this.toString()+`
7
+ `+a.replace(/^Error(:[^\n]*)?\n/,""))});return e.prototype=Object.create(r.prototype),e.prototype.constructor=e,e.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},e}var xr=void 0;function T(r){throw new xr(r)}var zr=void 0;function Xr(r){throw new zr(r)}function An(r,n,e){r.forEach(function(o){cr[o]=n});function i(o){var s=e(o);s.length!==r.length&&Xr("Mismatched type converter count");for(var v=0;v<r.length;++v)H(r[v],s[v])}var a=new Array(n.length),f=[],c=0;n.forEach(function(o,s){Y.hasOwnProperty(o)?a[s]=Y[o]:(f.push(o),Q.hasOwnProperty(o)||(Q[o]=[]),Q[o].push(function(){a[s]=Y[o],++c,c===f.length&&i(a)}))}),f.length===0&&i(a)}function H(r,n,e){if(e=e||{},!("argPackAdvance"in n))throw new TypeError("registerType registeredInstance requires argPackAdvance");var i=n.name;if(r||T('type "'+i+'" must have a positive integer typeid pointer'),Y.hasOwnProperty(r)){if(e.ignoreDuplicateRegistrations)return;T("Cannot register type '"+i+"' twice")}if(Y[r]=n,delete cr[r],Q.hasOwnProperty(r)){var a=Q[r];delete Q[r],a.forEach(function(f){f()})}}function En(r,n,e,i,a){var f=dr(e);n=S(n),H(r,{name:n,fromWireType:function(c){return!!c},toWireType:function(c,o){return o?i:a},argPackAdvance:8,readValueFromPointer:function(c){var o;if(e===1)o=_r;else if(e===2)o=Z;else if(e===4)o=V;else throw new TypeError("Unknown boolean type size: "+n);return this.fromWireType(o[c>>f])},destructorFunction:null})}var wr=[],C=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function br(r){r>4&&--C[r].refcount==0&&(C[r]=void 0,wr.push(r))}function Tn(){for(var r=0,n=5;n<C.length;++n)C[n]!==void 0&&++r;return r}function Cn(){for(var r=5;r<C.length;++r)if(C[r]!==void 0)return C[r];return null}function Fn(){t.count_emval_handles=Tn,t.get_first_emval=Cn}function M(r){switch(r){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:{var n=wr.length?wr.pop():C.length;return C[n]={refcount:1,value:r},n}}}function Ar(r){return this.fromWireType(D[r>>2])}function Pn(r,n){n=S(n),H(r,{name:n,fromWireType:function(e){var i=C[e].value;return br(e),i},toWireType:function(e,i){return M(i)},argPackAdvance:8,readValueFromPointer:Ar,destructorFunction:null})}function Er(r){if(r===null)return"null";var n=typeof r;return n==="object"||n==="array"||n==="function"?r.toString():""+r}function Un(r,n){switch(n){case 2:return function(e){return this.fromWireType(kr[e>>2])};case 3:return function(e){return this.fromWireType(Ir[e>>3])};default:throw new TypeError("Unknown float type: "+r)}}function Rn(r,n,e){var i=dr(e);n=S(n),H(r,{name:n,fromWireType:function(a){return a},toWireType:function(a,f){if(typeof f!="number"&&typeof f!="boolean")throw new TypeError('Cannot convert "'+Er(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:Un(n,i),destructorFunction:null})}function Sn(r,n){if(!(r instanceof Function))throw new TypeError("new_ called with constructor type "+typeof r+" which is not a function");var e=qr(r.name||"unknownFunctionName",function(){});e.prototype=r.prototype;var i=new e,a=r.apply(i,n);return a instanceof Object?a:i}function Gr(r){for(;r.length;){var n=r.pop(),e=r.pop();e(n)}}function Wn(r,n,e,i,a){var f=n.length;f<2&&T("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var c=n[1]!==null&&e!==null,o=!1,s=1;s<n.length;++s)if(n[s]!==null&&n[s].destructorFunction===void 0){o=!0;break}for(var v=n[0].name!=="void",g="",d="",s=0;s<f-2;++s)g+=(s!==0?", ":"")+"arg"+s,d+=(s!==0?", ":"")+"arg"+s+"Wired";var F="return function "+Nr(r)+"("+g+`) {
8
+ if (arguments.length !== `+(f-2)+`) {
9
+ throwBindingError('function `+r+" called with ' + arguments.length + ' arguments, expected "+(f-2)+` args!');
10
+ }
11
+ `;o&&(F+=`var destructors = [];
12
+ `);var $=o?"destructors":"null",q=["throwBindingError","invoker","fn","runDestructors","retType","classParam"],fr=[T,i,a,Gr,n[0],n[1]];c&&(F+="var thisWired = classParam.toWireType("+$+`, this);
13
+ `);for(var s=0;s<f-2;++s)F+="var arg"+s+"Wired = argType"+s+".toWireType("+$+", arg"+s+"); // "+n[s+2].name+`
14
+ `,q.push("argType"+s),fr.push(n[s+2]);if(c&&(d="thisWired"+(d.length>0?", ":"")+d),F+=(v?"var rv = ":"")+"invoker(fn"+(d.length>0?", ":"")+d+`);
15
+ `,o)F+=`runDestructors(destructors);
16
+ `;else for(var s=c?1:2;s<n.length;++s){var rr=s===1?"thisWired":"arg"+(s-2)+"Wired";n[s].destructorFunction!==null&&(F+=rr+"_dtor("+rr+"); // "+n[s].name+`
17
+ `,q.push(rr+"_dtor"),fr.push(n[s].destructorFunction))}v&&(F+=`var ret = retType.fromWireType(rv);
18
+ return ret;
19
+ `),F+=`}
20
+ `,q.push(F);var pe=Sn(Function,q).apply(null,fr);return pe}function kn(r,n,e){if(r[n].overloadTable===void 0){var i=r[n];r[n]=function(){return r[n].overloadTable.hasOwnProperty(arguments.length)||T("Function '"+e+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+r[n].overloadTable+")!"),r[n].overloadTable[arguments.length].apply(this,arguments)},r[n].overloadTable=[],r[n].overloadTable[i.argCount]=i}}function In(r,n,e){t.hasOwnProperty(r)?((e===void 0||t[r].overloadTable!==void 0&&t[r].overloadTable[e]!==void 0)&&T("Cannot register public name '"+r+"' twice"),kn(t,r,r),t.hasOwnProperty(e)&&T("Cannot register multiple overloads of a function with the same number of arguments ("+e+")!"),t[r].overloadTable[e]=n):(t[r]=n,e!==void 0&&(t[r].numArguments=e))}function On(r,n){for(var e=[],i=0;i<r;i++)e.push(V[(n>>2)+i]);return e}function Ln(r,n,e){t.hasOwnProperty(r)||Xr("Replacing nonexistant public symbol"),t[r].overloadTable!==void 0&&e!==void 0?t[r].overloadTable[e]=n:(t[r]=n,t[r].argCount=e)}function Vn(r,n,e){var i=t["dynCall_"+r];return e&&e.length?i.apply(null,[n].concat(e)):i.call(null,n)}function Dn(r,n,e){return r.includes("j")?Vn(r,n,e):tr.get(n).apply(null,e)}function Hn(r,n){var e=[];return function(){e.length=arguments.length;for(var i=0;i<arguments.length;i++)e[i]=arguments[i];return Dn(r,n,e)}}function Bn(r,n){r=S(r);function e(){return r.includes("j")?Hn(r,n):tr.get(n)}var i=e();return typeof i!="function"&&T("unknown function pointer with signature "+r+": "+n),i}var Yr=void 0;function $r(r){var n=Jr(r),e=S(n);return B(n),e}function jn(r,n){var e=[],i={};function a(f){if(!i[f]&&!Y[f]){if(cr[f]){cr[f].forEach(a);return}e.push(f),i[f]=!0}}throw n.forEach(a),new Yr(r+": "+e.map($r).join([", "]))}function Nn(r,n,e,i,a,f){var c=On(n,e);r=S(r),a=Bn(i,a),In(r,function(){jn("Cannot call "+r+" due to unbound types",c)},n-1),An([],c,function(o){var s=[o[0],null].concat(o.slice(1));return Ln(r,Wn(r,s,null,a,f),n-1),[]})}function qn(r,n,e){switch(n){case 0:return e?function(a){return _r[a]}:function(a){return U[a]};case 1:return e?function(a){return Z[a>>1]}:function(a){return hr[a>>1]};case 2:return e?function(a){return V[a>>2]}:function(a){return D[a>>2]};default:throw new TypeError("Unknown integer type: "+r)}}function xn(r,n,e,i,a){n=S(n),a===-1&&(a=4294967295);var f=dr(e),c=function(v){return v};if(i===0){var o=32-8*e;c=function(v){return v<<o>>>o}}var s=n.includes("unsigned");H(r,{name:n,fromWireType:c,toWireType:function(v,g){if(typeof g!="number"&&typeof g!="boolean")throw new TypeError('Cannot convert "'+Er(g)+'" to '+this.name);if(g<i||g>a)throw new TypeError('Passing a number "'+Er(g)+'" from JS side to C/C++ side to an argument of type "'+n+'", which is outside the valid range ['+i+", "+a+"]!");return s?g>>>0:g|0},argPackAdvance:8,readValueFromPointer:qn(n,f,i!==0),destructorFunction:null})}function zn(r,n,e){var i=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],a=i[n];function f(c){c=c>>2;var o=D,s=o[c],v=o[c+1];return new a(pr,v,s)}e=S(e),H(r,{name:e,fromWireType:f,argPackAdvance:8,readValueFromPointer:f},{ignoreDuplicateRegistrations:!0})}function Xn(r,n){n=S(n);var e=n==="std::string";H(r,{name:n,fromWireType:function(i){var a=D[i>>2],f;if(e)for(var c=i+4,o=0;o<=a;++o){var s=i+4+o;if(o==a||U[s]==0){var v=s-c,g=A(c,v);f===void 0?f=g:(f+=String.fromCharCode(0),f+=g),c=s+1}}else{for(var d=new Array(a),o=0;o<a;++o)d[o]=String.fromCharCode(U[i+4+o]);f=d.join("")}return B(i),f},toWireType:function(i,a){a instanceof ArrayBuffer&&(a=new Uint8Array(a));var f,c=typeof a=="string";c||a instanceof Uint8Array||a instanceof Uint8ClampedArray||a instanceof Int8Array||T("Cannot pass non-string to std::string"),e&&c?f=function(){return vr(a)}:f=function(){return a.length};var o=f(),s=Cr(4+o+1);if(D[s>>2]=o,e&&c)E(a,s+4,o+1);else if(c)for(var v=0;v<o;++v){var g=a.charCodeAt(v);g>255&&(B(s),T("String has UTF-16 code units that do not fit in 8 bits")),U[s+4+v]=g}else for(var v=0;v<o;++v)U[s+4+v]=a[v];return i!==null&&i.push(B,s),s},argPackAdvance:8,readValueFromPointer:Ar,destructorFunction:function(i){B(i)}})}function Gn(r,n,e){e=S(e);var i,a,f,c,o;n===2?(i=Zr,a=Qr,c=Mr,f=function(){return hr},o=1):n===4&&(i=rn,a=nn,c=en,f=function(){return D},o=2),H(r,{name:e,fromWireType:function(s){for(var v=D[s>>2],g=f(),d,F=s+4,$=0;$<=v;++$){var q=s+4+$*n;if($==v||g[q>>o]==0){var fr=q-F,rr=i(F,fr);d===void 0?d=rr:(d+=String.fromCharCode(0),d+=rr),F=q+n}}return B(s),d},toWireType:function(s,v){typeof v!="string"&&T("Cannot pass non-string to C++ string type "+e);var g=c(v),d=Cr(4+g+n);return D[d>>2]=g>>o,a(v,d+4,g+n),s!==null&&s.push(B,d),d},argPackAdvance:8,readValueFromPointer:Ar,destructorFunction:function(s){B(s)}})}function Yn(r,n){n=S(n),H(r,{isVoid:!0,name:n,argPackAdvance:0,fromWireType:function(){},toWireType:function(e,i){}})}function or(r){return r||T("Cannot use deleted val. handle = "+r),C[r].value}function Tr(r,n){var e=Y[r];return e===void 0&&T(n+" has unknown type "+$r(r)),e}function $n(r,n,e){r=or(r),n=Tr(n,"emval::as");var i=[],a=M(i);return V[e>>2]=a,n.toWireType(i,r)}function Jn(r,n){for(var e=new Array(r),i=0;i<r;++i)e[i]=Tr(V[(n>>2)+i],"parameter "+i);return e}function Kn(r,n,e,i){r=or(r);for(var a=Jn(n,e),f=new Array(n),c=0;c<n;++c){var o=a[c];f[c]=o.readValueFromPointer(i),i+=o.argPackAdvance}var s=r.apply(void 0,f);return M(s)}function Zn(r,n){return r=or(r),n=or(n),M(r[n])}function Qn(r){r>4&&(C[r].refcount+=1)}function Mn(r){return r=or(r),typeof r=="number"}var re={};function ne(r){var n=re[r];return n===void 0?S(r):n}function ee(r){return M(ne(r))}function te(r){var n=C[r].value;Gr(n),br(r)}function ie(r,n){r=Tr(r,"_emval_take_value");var e=r.readValueFromPointer(n);return M(e)}function ae(){ar()}function oe(r,n,e){U.copyWithin(r,n,n+e)}function fe(r){try{return K.grow(r-pr.byteLength+65535>>>16),Or(K.buffer),1}catch(n){}}function se(r){var n=U.length;r=r>>>0;var e=2147483648;if(r>e)return!1;for(var i=1;i<=4;i*=2){var a=n*(1+.2/i);a=Math.min(a,r+100663296);var f=Math.min(e,tn(Math.max(r,a),65536)),c=fe(f);if(c)return!0}return!1}mn(),xr=t.BindingError=mr(Error,"BindingError"),zr=t.InternalError=mr(Error,"InternalError"),Fn(),Yr=t.UnboundTypeError=mr(Error,"UnboundTypeError");var ce={a:yn,q:dn,u:En,t:Pn,m:Rn,k:Nn,d:xn,c:zn,n:Xn,l:Gn,v:Yn,j:$n,w:Kn,b:br,e:Zn,g:Qn,p:Mn,f:ee,i:te,h:ie,o:ae,r:oe,s:se},we=gn(),ue=t.___wasm_call_ctors=function(){return(ue=t.___wasm_call_ctors=t.asm.y).apply(null,arguments)},Cr=t._malloc=function(){return(Cr=t._malloc=t.asm.z).apply(null,arguments)},B=t._free=function(){return(B=t._free=t.asm.A).apply(null,arguments)},Jr=t.___getTypeName=function(){return(Jr=t.___getTypeName=t.asm.C).apply(null,arguments)},le=t.___embind_register_native_and_builtin_types=function(){return(le=t.___embind_register_native_and_builtin_types=t.asm.D).apply(null,arguments)},ve=t.dynCall_ijiii=function(){return(ve=t.dynCall_ijiii=t.asm.E).apply(null,arguments)},ur;ir=function r(){ur||Fr(),ur||(ir=r)};function Fr(r){if(r=r||p,G>0||(on(),G>0))return;function n(){ur||(ur=!0,t.calledRun=!0,!w&&(fn(),u(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),sn()))}t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),n()},1)):n()}if(t.run=Fr,t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return Fr(),t.ready}}(),_e=Pr,Ur=new Uint8Array([0,0,0,1]);function he(_){console.error(_)}Pr.createFile=Rr;function Rr(_=256){let t=0,u=0,h=new Uint8Array(_);return{contents:function(){return h.slice(0,u)},seek:function(l){t=l},write:function(l){let p=l.byteLength;return m(t+p),h.set(l,t),t+=p,u=Math.max(u,t),p}};function m(l){var p=h.length;if(p>=l)return;var j=1024*1024;l=Math.max(l,p*(p<j?2:1.125)>>>0),p!=0&&(l=Math.max(l,256));let N=h;h=new Uint8Array(l),u>0&&h.set(N.subarray(0,u),0)}}Pr.isWebCodecsSupported=Sr;function Sr(){return typeof window!="undefined"&&typeof window.VideoEncoder=="function"}function Kr(_,t={}){let{width:u,height:h,groupOfPictures:m=20,fps:l=30,fragmentation:p=!1,sequential:j=!1,hevc:N=!1,format:W="annexb",codec:k="avc1.4d0034",acceleration:x,bitrate:L,error:y=he,encoderOptions:z={},flushFrequency:sr=10}=t;if(!Sr())throw new Error("MP4 H264 encoding/decoding depends on WebCodecs API which is not supported in this environment");if(typeof u!="number"||typeof h!="number")throw new Error("Must specify { width, height } options");if(!isFinite(u)||u<0||!isFinite(h)||h<0)throw new Error("{ width, height } options must be positive integers");let nr=Rr(),J=_.create_muxer({width:u,height:h,fps:l,fragmentation:p,sequential:j,hevc:N},X),lr={codec:k,width:u,height:h,avc:{format:W},hardwareAcceleration:x,bitrate:L,...z},er=0,P=new window.VideoEncoder({output(w,b){K(w,b)},error:y});return P.configure(lr),{async end(){return await P.flush(),P.close(),_.finalize_muxer(J),nr.contents()},async addFrame(w){let b=1/l*er*1e6,I=er%m==0,A=new VideoFrame(w,{timestamp:b});P.encode(A,{keyFrame:I}),A.close(),sr!=null&&(er+1)%sr==0&&await P.flush(),er++},async flush(){return P.flush()}};function X(w,b,I){nr.seek(I);let A=_.HEAPU8.subarray(w,w+b);return nr.write(A)!==A.byteLength}function Wr(w){let b=_._malloc(w.byteLength);_.HEAPU8.set(w,b),_.mux_nal(J,b,w.byteLength),_._free(b)}function K(w,b){let I=null,A;if(b&&(b.description&&(A=b.description),b.decoderConfig&&b.decoderConfig.description&&(A=b.decoderConfig.description)),A)try{I=de(A)}catch(E){y(E);return}let O=[];if(I&&(I.sps_list.forEach(E=>{O.push(Ur),O.push(E)}),I.pps_list.forEach(E=>{O.push(Ur),O.push(E)})),W==="annexb"){let E=new Uint8Array(w.byteLength);w.copyTo(E),O.push(E)}else try{let E=new ArrayBuffer(w.byteLength);w.copyTo(E),ye(E).forEach(vr=>{O.push(Ur),O.push(vr)})}catch(E){y(E);return}Wr(ge(O))}}function ge(_){let t=_.reduce((m,l)=>m+l.byteLength,0),u=new Uint8Array(t),h=0;for(let m=0;m<_.length;m++){let l=_[m];u.set(l,h),h+=l.byteLength}return u}function ye(_){let t=4,u=0,h=[],m=_.byteLength,l=new Uint8Array(_);for(;u+t<m;){let p=l[u];if(p=(p<<8)+l[u+1],p=(p<<8)+l[u+2],p=(p<<8)+l[u+3],h.push(new Uint8Array(_,u+t,p)),p==0)throw new Error("Error: invalid nal_length 0");u+=t+p}return h}function de(_){let t=new DataView(_),u=0,h=t.getUint8(u++),m=t.getUint8(u++),l=t.getUint8(u++),p=t.getUint8(u++),j=(t.getUint8(u++)&3)+1;if(j!==4)throw new Error("Expected length_size to indicate 4 bytes");let N=t.getUint8(u++)&31,W=[];for(let L=0;L<N;L++){let y=t.getUint16(u,!1);u+=2;let z=new Uint8Array(t.buffer,u,y);W.push(z),u+=y}let k=t.getUint8(u++),x=[];for(let L=0;L<k;L++){let y=t.getUint16(u,!1);u+=2;let z=new Uint8Array(t.buffer,u,y);x.push(z),u+=y}return{offset:u,version:h,profile:m,compat:l,level:p,length_size:j,pps_list:x,sps_list:W,numSPS:N}}export{Rr as createFile,Kr as createWebCodecsEncoderWithModule,_e as default,Sr as isWebCodecsSupported};
@@ -0,0 +1,22 @@
1
+ const supportedEncodings = [
2
+ 'image/png',
3
+ 'image/jpeg',
4
+ 'image/webp'
5
+ ];
6
+
7
+ export function exportCanvas (canvas, { encoding = 'image/png', encodingQuality = 0.92 } = {}) {
8
+ if (!supportedEncodings.includes(encoding)) throw new Error(`Invalid canvas encoding ${encoding}`);
9
+
10
+ let extension = (encoding.split('/')[1] || '').replace(/jpeg/i, 'jpg');
11
+ if (extension) {
12
+ extension = `.${extension}`.toLowerCase();
13
+ }
14
+
15
+ let dataURL = canvas.toDataURL(encoding, encodingQuality);
16
+
17
+ return {
18
+ extension,
19
+ type: encoding,
20
+ dataURL
21
+ };
22
+ }
@@ -0,0 +1,39 @@
1
+ class Geometry {
2
+ constructor(gl, {
3
+ attributes = {
4
+ position: { data: [-1, -1, 3, -1, -1, 3] },
5
+ uv: { data: [0, 0, 2, 0, 0, 2] }
6
+ }
7
+ } = {}) {
8
+ this.gl = gl;
9
+ this.attributes = attributes;
10
+ this.buffers = Object.keys(attributes).reduce((all, name) => {
11
+ let buffer = gl.createBuffer();
12
+
13
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
14
+ gl.bufferData(
15
+ gl.ARRAY_BUFFER,
16
+ new Float32Array(attributes[name].data),
17
+ gl.STATIC_DRAW
18
+ );
19
+
20
+ all[name] = buffer;
21
+
22
+ return all;
23
+ }, {});
24
+ }
25
+
26
+ destroy() {
27
+ Object.keys(this.buffers).forEach(name => {
28
+ let buffer = this.buffers[name];
29
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);
30
+ this.gl.bufferData(this.gl.ARRAY_BUFFER, 1, this.gl.STATIC_DRAW);
31
+ this.gl.deleteBuffer(buffer);
32
+ });
33
+
34
+ this.buffers = null;
35
+ this.attributes = null;
36
+ }
37
+ }
38
+
39
+ export default Geometry;
@@ -0,0 +1,130 @@
1
+ function createShader(gl, type, source) {
2
+ let shader = gl.createShader(type);
3
+ gl.shaderSource(shader, source);
4
+ gl.compileShader(shader);
5
+ let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
6
+
7
+ if (success) {
8
+ return shader;
9
+ }
10
+
11
+ console.warn(`fragment-gl.Program: Shader Info Log: ${gl.getShaderInfoLog(shader)}`);
12
+ gl.deleteShader(shader);
13
+ }
14
+
15
+ let P_ID = 0;
16
+
17
+ let defaultVertex = /* glsl */`
18
+ attribute vec4 position;
19
+ attribute vec2 uv;
20
+
21
+ varying vec2 vUv;
22
+
23
+ void main(){
24
+ vUv = uv;
25
+ gl_Position = position;
26
+ }
27
+ `;
28
+
29
+ let defaultFragment = /* glsl */`
30
+ precision highp float;
31
+
32
+ varying vec2 vUv;
33
+
34
+ void main() {
35
+ gl_FragColor = vec4(vec3(0., 1., 0.), 1.);
36
+ }
37
+ `;
38
+
39
+ class Program {
40
+
41
+ constructor(gl, { vertex = defaultVertex, fragment = defaultFragment, uniforms = {} } = {}) {
42
+ this.gl = gl;
43
+
44
+ this.vertexShader = vertex;
45
+ this.fragmentShader = fragment;
46
+ this.uniforms = uniforms;
47
+ this.needsUpdate = true;
48
+
49
+ this._program = gl.createProgram();
50
+ this.id = P_ID++;
51
+
52
+ this.compile();
53
+ }
54
+
55
+ set vertexShader(text) {
56
+ this.vertex = text;
57
+ this._vertexShader = createShader(this.gl, this.gl.VERTEX_SHADER, text);
58
+ this.needsUpdate = true;
59
+ }
60
+
61
+ get vertexShader() {
62
+ return this._vertexShader;
63
+ }
64
+
65
+ set fragmentShader(text) {
66
+ this.fragment = text;
67
+ this._fragmentShader = createShader(this.gl, this.gl.FRAGMENT_SHADER, text);
68
+ this.needsUpdate = true;
69
+ }
70
+
71
+ get fragmentShader() {
72
+ return this._fragmentShader;
73
+ }
74
+
75
+ compile() {
76
+ const { gl, _program, uniforms } = this;
77
+
78
+ if (!this.vertexShader || !this.fragmentShader) return;
79
+
80
+ gl.attachShader(_program, this.vertexShader);
81
+ gl.attachShader(_program, this.fragmentShader);
82
+ gl.linkProgram(_program);
83
+
84
+ let programLog = gl.getProgramInfoLog(_program);
85
+ let vertexLog = gl.getShaderInfoLog(this.vertexShader);
86
+ let fragmentLog = gl.getShaderInfoLog(this.fragmentShader);
87
+
88
+ if (gl.getProgramParameter(_program, gl.LINK_STATUS) === false) {
89
+ console.error(`Program: shader error
90
+ ${vertexLog}
91
+ ${fragmentLog}
92
+ `);
93
+ } else if (programLog !== '') {
94
+ console.warn(`fragment-gl.Program: Program Info Log: ${programLog}`);
95
+ }
96
+
97
+ let success = gl.getProgramParameter(_program, gl.LINK_STATUS);
98
+ if (!success) {
99
+ console.warn(`fragment-gl.Program: Program Info Log: ${gl.getProgramInfoLog(_program)}`);
100
+ gl.deleteProgram(_program);
101
+ }
102
+
103
+ let uniformsLocations = Object.keys(uniforms).reduce((all, name) => {
104
+ all[name] = gl.getUniformLocation(_program, name);
105
+
106
+ return all;
107
+ }, {});
108
+
109
+ let attributesCount = gl.getProgramParameter(_program, gl.ACTIVE_ATTRIBUTES);
110
+ let attributesLocations = {};
111
+
112
+ for (let aIndex = 0; aIndex < attributesCount; aIndex++) {
113
+ let attribute = gl.getActiveAttrib(_program, aIndex);
114
+ let location = gl.getAttribLocation(_program, attribute.name);
115
+ attributesLocations[attribute.name] = location;
116
+ }
117
+
118
+ this.gl.detachShader(_program, this._vertexShader);
119
+ this.gl.detachShader(_program, this._fragmentShader);
120
+
121
+ this.attributesLocations = attributesLocations;
122
+ this.uniformsLocations = uniformsLocations;
123
+
124
+ this.needsUpdate = false;
125
+ }
126
+ }
127
+
128
+ export default Program;
129
+
130
+ export { defaultVertex, defaultFragment };