@stevejtrettel/shader-sandbox 0.1.3 → 0.1.4

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 (113) hide show
  1. package/README.md +220 -23
  2. package/bin/cli.js +106 -14
  3. package/dist-lib/app/App.d.ts +143 -15
  4. package/dist-lib/app/App.d.ts.map +1 -1
  5. package/dist-lib/app/App.js +1343 -108
  6. package/dist-lib/app/app.css +349 -24
  7. package/dist-lib/app/types.d.ts +48 -5
  8. package/dist-lib/app/types.d.ts.map +1 -1
  9. package/dist-lib/editor/EditorPanel.d.ts +2 -2
  10. package/dist-lib/editor/EditorPanel.d.ts.map +1 -1
  11. package/dist-lib/editor/EditorPanel.js +1 -1
  12. package/dist-lib/editor/editor-panel.css +55 -32
  13. package/dist-lib/editor/prism-editor.css +16 -16
  14. package/dist-lib/embed.js +1 -1
  15. package/dist-lib/engine/{ShadertoyEngine.d.ts → ShaderEngine.d.ts} +134 -10
  16. package/dist-lib/engine/ShaderEngine.d.ts.map +1 -0
  17. package/dist-lib/engine/ShaderEngine.js +1523 -0
  18. package/dist-lib/engine/glHelpers.d.ts +24 -0
  19. package/dist-lib/engine/glHelpers.d.ts.map +1 -1
  20. package/dist-lib/engine/glHelpers.js +88 -0
  21. package/dist-lib/engine/std140.d.ts +47 -0
  22. package/dist-lib/engine/std140.d.ts.map +1 -0
  23. package/dist-lib/engine/std140.js +119 -0
  24. package/dist-lib/engine/types.d.ts +55 -5
  25. package/dist-lib/engine/types.d.ts.map +1 -1
  26. package/dist-lib/engine/types.js +1 -1
  27. package/dist-lib/index.d.ts +4 -3
  28. package/dist-lib/index.d.ts.map +1 -1
  29. package/dist-lib/index.js +2 -1
  30. package/dist-lib/layouts/SplitLayout.d.ts +2 -1
  31. package/dist-lib/layouts/SplitLayout.d.ts.map +1 -1
  32. package/dist-lib/layouts/SplitLayout.js +3 -0
  33. package/dist-lib/layouts/TabbedLayout.d.ts.map +1 -1
  34. package/dist-lib/layouts/UILayout.d.ts +55 -0
  35. package/dist-lib/layouts/UILayout.d.ts.map +1 -0
  36. package/dist-lib/layouts/UILayout.js +147 -0
  37. package/dist-lib/layouts/default.css +2 -2
  38. package/dist-lib/layouts/index.d.ts +11 -1
  39. package/dist-lib/layouts/index.d.ts.map +1 -1
  40. package/dist-lib/layouts/index.js +17 -1
  41. package/dist-lib/layouts/split.css +33 -31
  42. package/dist-lib/layouts/tabbed.css +127 -74
  43. package/dist-lib/layouts/types.d.ts +14 -3
  44. package/dist-lib/layouts/types.d.ts.map +1 -1
  45. package/dist-lib/main.js +33 -0
  46. package/dist-lib/project/configHelpers.d.ts +45 -0
  47. package/dist-lib/project/configHelpers.d.ts.map +1 -0
  48. package/dist-lib/project/configHelpers.js +196 -0
  49. package/dist-lib/project/generatedLoader.d.ts +2 -2
  50. package/dist-lib/project/generatedLoader.d.ts.map +1 -1
  51. package/dist-lib/project/generatedLoader.js +23 -5
  52. package/dist-lib/project/loadProject.d.ts +6 -6
  53. package/dist-lib/project/loadProject.d.ts.map +1 -1
  54. package/dist-lib/project/loadProject.js +396 -144
  55. package/dist-lib/project/loaderHelper.d.ts +4 -4
  56. package/dist-lib/project/loaderHelper.d.ts.map +1 -1
  57. package/dist-lib/project/loaderHelper.js +278 -116
  58. package/dist-lib/project/types.d.ts +292 -13
  59. package/dist-lib/project/types.d.ts.map +1 -1
  60. package/dist-lib/project/types.js +13 -1
  61. package/dist-lib/styles/base.css +5 -1
  62. package/dist-lib/uniforms/UniformControls.d.ts +60 -0
  63. package/dist-lib/uniforms/UniformControls.d.ts.map +1 -0
  64. package/dist-lib/uniforms/UniformControls.js +518 -0
  65. package/dist-lib/uniforms/UniformStore.d.ts +74 -0
  66. package/dist-lib/uniforms/UniformStore.d.ts.map +1 -0
  67. package/dist-lib/uniforms/UniformStore.js +145 -0
  68. package/dist-lib/uniforms/UniformsPanel.d.ts +53 -0
  69. package/dist-lib/uniforms/UniformsPanel.d.ts.map +1 -0
  70. package/dist-lib/uniforms/UniformsPanel.js +124 -0
  71. package/dist-lib/uniforms/index.d.ts +11 -0
  72. package/dist-lib/uniforms/index.d.ts.map +1 -0
  73. package/dist-lib/uniforms/index.js +8 -0
  74. package/package.json +1 -1
  75. package/src/app/App.ts +1469 -126
  76. package/src/app/app.css +349 -24
  77. package/src/app/types.ts +53 -5
  78. package/src/editor/EditorPanel.ts +5 -5
  79. package/src/editor/editor-panel.css +55 -32
  80. package/src/editor/prism-editor.css +16 -16
  81. package/src/embed.ts +1 -1
  82. package/src/engine/ShaderEngine.ts +1934 -0
  83. package/src/engine/glHelpers.ts +117 -0
  84. package/src/engine/std140.ts +136 -0
  85. package/src/engine/types.ts +69 -5
  86. package/src/index.ts +4 -3
  87. package/src/layouts/SplitLayout.ts +8 -3
  88. package/src/layouts/TabbedLayout.ts +3 -3
  89. package/src/layouts/UILayout.ts +185 -0
  90. package/src/layouts/default.css +2 -2
  91. package/src/layouts/index.ts +20 -1
  92. package/src/layouts/split.css +33 -31
  93. package/src/layouts/tabbed.css +127 -74
  94. package/src/layouts/types.ts +19 -3
  95. package/src/layouts/ui.css +289 -0
  96. package/src/main.ts +39 -1
  97. package/src/project/configHelpers.ts +225 -0
  98. package/src/project/generatedLoader.ts +27 -6
  99. package/src/project/loadProject.ts +459 -173
  100. package/src/project/loaderHelper.ts +377 -130
  101. package/src/project/types.ts +360 -14
  102. package/src/styles/base.css +5 -1
  103. package/src/styles/theme.css +292 -0
  104. package/src/uniforms/UniformControls.ts +660 -0
  105. package/src/uniforms/UniformStore.ts +166 -0
  106. package/src/uniforms/UniformsPanel.ts +163 -0
  107. package/src/uniforms/index.ts +13 -0
  108. package/src/uniforms/uniform-controls.css +342 -0
  109. package/src/uniforms/uniforms-panel.css +277 -0
  110. package/templates/shaders/example-buffer/config.json +1 -0
  111. package/dist-lib/engine/ShadertoyEngine.d.ts.map +0 -1
  112. package/dist-lib/engine/ShadertoyEngine.js +0 -704
  113. package/src/engine/ShadertoyEngine.ts +0 -929
@@ -6,8 +6,8 @@
6
6
  .editor-toolbar {
7
7
  display: flex;
8
8
  align-items: center;
9
- background: #f8f8f8;
10
- border-bottom: 1px solid #e0e0e0;
9
+ background: var(--tab-bg);
10
+ border-bottom: 1px solid var(--border-primary);
11
11
  padding-right: 8px;
12
12
  }
13
13
 
@@ -21,7 +21,7 @@
21
21
  .editor-tab-button {
22
22
  background: transparent;
23
23
  border: none;
24
- color: #666;
24
+ color: var(--tab-text);
25
25
  padding: 10px 16px;
26
26
  cursor: pointer;
27
27
  font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
@@ -32,21 +32,37 @@
32
32
  }
33
33
 
34
34
  .editor-tab-button:hover {
35
- color: #333;
35
+ color: var(--tab-text-hover);
36
36
  }
37
37
 
38
38
  .editor-tab-button.active {
39
- color: #000;
40
- border-bottom-color: #4a9eff;
39
+ color: var(--tab-text-active);
40
+ border-bottom-color: var(--tab-border-active);
41
41
  }
42
42
 
43
43
  .editor-tab-button.image-tab {
44
- color: #7c4dff;
44
+ color: var(--accent-secondary);
45
45
  }
46
46
 
47
47
  .editor-tab-button.image-tab.active {
48
- color: #7c4dff;
49
- border-bottom-color: #7c4dff;
48
+ color: var(--accent-secondary);
49
+ border-bottom-color: var(--accent-secondary);
50
+ }
51
+
52
+ .editor-tab-button.uniforms-tab {
53
+ color: var(--accent-tertiary, var(--accent-primary));
54
+ padding: 8px 12px;
55
+ }
56
+
57
+ .editor-tab-button.uniforms-tab.active {
58
+ color: var(--accent-tertiary, var(--accent-primary));
59
+ border-bottom-color: var(--accent-tertiary, var(--accent-primary));
60
+ }
61
+
62
+ .editor-tab-button .uniforms-icon {
63
+ width: 18px;
64
+ height: 18px;
65
+ display: block;
50
66
  }
51
67
 
52
68
  /* Copy button (icon only) */
@@ -54,9 +70,9 @@
54
70
  display: flex;
55
71
  align-items: center;
56
72
  justify-content: center;
57
- background: transparent;
58
- border: 1px solid #ccc;
59
- color: #666;
73
+ background: var(--button-bg);
74
+ border: 1px solid var(--button-border);
75
+ color: var(--button-text);
60
76
  width: 32px;
61
77
  height: 32px;
62
78
  border-radius: 4px;
@@ -67,19 +83,19 @@
67
83
  }
68
84
 
69
85
  .editor-copy-button:hover {
70
- background: #f0f0f0;
71
- border-color: #999;
72
- color: #333;
86
+ background: var(--button-bg-hover);
87
+ border-color: var(--button-border-hover);
88
+ color: var(--button-text-hover);
73
89
  }
74
90
 
75
91
  .editor-copy-button:active {
76
- background: #e0e0e0;
92
+ background: var(--button-bg-hover);
77
93
  }
78
94
 
79
95
  .editor-copy-button.copied {
80
- background: #e8f5e9;
81
- border-color: #4caf50;
82
- color: #4caf50;
96
+ background: var(--success-bg);
97
+ border-color: var(--success-border);
98
+ color: var(--success-text);
83
99
  }
84
100
 
85
101
  .editor-copy-button svg {
@@ -91,25 +107,25 @@
91
107
  display: flex;
92
108
  align-items: center;
93
109
  gap: 6px;
94
- background: #4a9eff;
110
+ background: var(--recompile-bg);
95
111
  border: none;
96
- color: #fff;
112
+ color: var(--recompile-text);
97
113
  padding: 6px 12px;
98
114
  border-radius: 4px;
99
115
  cursor: pointer;
100
116
  font-family: inherit;
101
117
  font-size: 12px;
102
118
  font-weight: 500;
103
- transition: background 0.15s;
119
+ transition: background 0.15s, color 0.15s;
104
120
  flex-shrink: 0;
105
121
  }
106
122
 
107
123
  .editor-recompile-button:hover {
108
- background: #3a8eef;
124
+ background: var(--recompile-bg-hover);
109
125
  }
110
126
 
111
127
  .editor-recompile-button:active {
112
- background: #2a7edf;
128
+ background: var(--recompile-bg-active);
113
129
  }
114
130
 
115
131
  .editor-recompile-button svg {
@@ -121,7 +137,7 @@
121
137
  flex: 1;
122
138
  overflow: hidden;
123
139
  position: relative;
124
- background: #ffffff;
140
+ background: var(--code-bg);
125
141
  }
126
142
 
127
143
  .editor-prism-container {
@@ -133,8 +149,8 @@
133
149
  .editor-fallback-textarea {
134
150
  width: 100%;
135
151
  height: 100%;
136
- background: #ffffff;
137
- color: #000;
152
+ background: var(--code-bg);
153
+ color: var(--code-text);
138
154
  border: none;
139
155
  padding: 12px;
140
156
  font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
@@ -149,27 +165,34 @@
149
165
  align-items: center;
150
166
  justify-content: center;
151
167
  height: 100%;
152
- background: #f5f5f5;
168
+ background: var(--image-viewer-bg);
153
169
  padding: 20px;
154
170
  }
155
171
 
172
+ /* Uniforms container */
173
+ .editor-uniforms-container {
174
+ height: 100%;
175
+ overflow-y: auto;
176
+ background: var(--bg-secondary);
177
+ }
178
+
156
179
  .editor-image-viewer img {
157
180
  max-width: 100%;
158
181
  max-height: 100%;
159
182
  object-fit: contain;
160
183
  border-radius: 4px;
161
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
184
+ box-shadow: var(--shadow-sm);
162
185
  }
163
186
 
164
187
  /* Error display */
165
188
  .editor-error-display {
166
- background: #fff0f0;
167
- color: #c00;
189
+ background: var(--error-bg);
190
+ color: var(--error-text);
168
191
  padding: 10px 14px;
169
192
  font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
170
193
  font-size: 12px;
171
194
  white-space: pre-wrap;
172
195
  overflow: auto;
173
196
  max-height: 120px;
174
- border-top: 1px solid #fcc;
197
+ border-top: 1px solid var(--error-border);
175
198
  }
@@ -6,7 +6,7 @@
6
6
  .prism-editor-wrapper {
7
7
  display: flex;
8
8
  height: 100%;
9
- background: #ffffff;
9
+ background: var(--code-bg);
10
10
  font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
11
11
  font-size: 13px;
12
12
  line-height: 1.6;
@@ -17,8 +17,8 @@
17
17
  flex-shrink: 0;
18
18
  padding: 16px 12px 16px 16px;
19
19
  text-align: right;
20
- color: #999;
21
- border-right: 1px solid #e0e0e0;
20
+ color: var(--code-line-number);
21
+ border-right: 1px solid var(--code-line-border);
22
22
  user-select: none;
23
23
  overflow: hidden;
24
24
  }
@@ -59,24 +59,24 @@
59
59
  .prism-editor-textarea {
60
60
  background: transparent;
61
61
  color: transparent;
62
- caret-color: #000;
62
+ caret-color: var(--code-text);
63
63
  resize: none;
64
64
  z-index: 1;
65
65
  -webkit-text-fill-color: transparent;
66
66
  }
67
67
 
68
68
  .prism-editor-textarea::selection {
69
- background: rgba(173, 214, 255, 0.4);
69
+ background: var(--code-selection);
70
70
  }
71
71
 
72
72
  .prism-editor-textarea::-moz-selection {
73
- background: rgba(173, 214, 255, 0.4);
73
+ background: var(--code-selection);
74
74
  }
75
75
 
76
76
  /* Highlighted code overlay */
77
77
  .prism-editor-highlight {
78
- background: #ffffff;
79
- color: #000;
78
+ background: var(--code-bg);
79
+ color: var(--code-text);
80
80
  pointer-events: none;
81
81
  z-index: 0;
82
82
  }
@@ -89,11 +89,11 @@
89
89
  }
90
90
 
91
91
  /* Prism syntax highlighting colors */
92
- .prism-editor-highlight .token.comment { color: #6a9955; }
93
- .prism-editor-highlight .token.keyword { color: #0000ff; }
94
- .prism-editor-highlight .token.string { color: #a31515; }
95
- .prism-editor-highlight .token.number { color: #098658; }
96
- .prism-editor-highlight .token.operator { color: #000000; }
97
- .prism-editor-highlight .token.function { color: #795e26; }
98
- .prism-editor-highlight .token.class-name { color: #267f99; }
99
- .prism-editor-highlight .token.punctuation { color: #000000; }
92
+ .prism-editor-highlight .token.comment { color: var(--syntax-comment); }
93
+ .prism-editor-highlight .token.keyword { color: var(--syntax-keyword); }
94
+ .prism-editor-highlight .token.string { color: var(--syntax-string); }
95
+ .prism-editor-highlight .token.number { color: var(--syntax-number); }
96
+ .prism-editor-highlight .token.operator { color: var(--syntax-operator); }
97
+ .prism-editor-highlight .token.function { color: var(--syntax-function); }
98
+ .prism-editor-highlight .token.class-name { color: var(--syntax-class); }
99
+ .prism-editor-highlight .token.punctuation { color: var(--syntax-punctuation); }
package/dist-lib/embed.js CHANGED
@@ -28,7 +28,7 @@ export async function embed(options) {
28
28
  return {
29
29
  app,
30
30
  destroy: () => {
31
- app.stop?.();
31
+ app.dispose();
32
32
  },
33
33
  };
34
34
  }
@@ -9,10 +9,20 @@
9
9
  * - Bind Shadertoy uniforms (iResolution, iTime, iTimeDelta, iFrame, iMouse).
10
10
  * - Bind iChannel0..3 according to ChannelSource.
11
11
  */
12
- import { ShadertoyProject, PassName } from '../project/types';
12
+ import { ShaderProject, PassName, UniformValue, UniformValues } from '../project/types';
13
+ import { UniformStore } from '../uniforms/UniformStore';
13
14
  import { EngineOptions, EngineStats } from './types';
14
- export declare class ShadertoyEngine {
15
- readonly project: ShadertoyProject;
15
+ /** Line mapping for error reporting — maps compiled shader lines back to user source. */
16
+ export interface LineMapping {
17
+ /** 1-indexed line where common.glsl starts in compiled source (0 if no common). */
18
+ commonStartLine: number;
19
+ /** Number of lines in common.glsl. */
20
+ commonLines: number;
21
+ /** 1-indexed line where user shader code starts in compiled source. */
22
+ userCodeStartLine: number;
23
+ }
24
+ export declare class ShaderEngine {
25
+ readonly project: ShaderProject;
16
26
  readonly gl: WebGL2RenderingContext;
17
27
  private _width;
18
28
  private _height;
@@ -26,7 +36,64 @@ export declare class ShadertoyEngine {
26
36
  private _keyStates;
27
37
  private _toggleStates;
28
38
  private _compilationErrors;
39
+ private _uniforms;
40
+ private _ubos;
41
+ private _dirtyScalars;
42
+ private _audioTexture;
43
+ private _needsAudio;
44
+ private _videoTextures;
45
+ private _scriptTextures;
29
46
  constructor(opts: EngineOptions);
47
+ /**
48
+ * Initialize custom uniform store and UBOs from project config.
49
+ */
50
+ private initCustomUniforms;
51
+ /**
52
+ * Create WebGL UBO buffers for all array uniforms.
53
+ */
54
+ private initUBOs;
55
+ /**
56
+ * Scan all passes for audio/video/webcam channels and create placeholder textures.
57
+ */
58
+ private initMediaTextures;
59
+ /**
60
+ * Collect all channel sources from all passes.
61
+ */
62
+ private getAllChannelSources;
63
+ /**
64
+ * Initialize audio input (microphone). Must be called from a user gesture.
65
+ */
66
+ initAudio(): Promise<void>;
67
+ /**
68
+ * Update audio texture with latest FFT/waveform data. Call per-frame.
69
+ */
70
+ updateAudioTexture(): void;
71
+ /**
72
+ * Initialize webcam. Must be called from a user gesture.
73
+ */
74
+ initWebcam(): Promise<void>;
75
+ /**
76
+ * Initialize video file playback.
77
+ */
78
+ initVideo(src: string): Promise<void>;
79
+ /**
80
+ * Update all video/webcam textures with latest frame. Call per-frame.
81
+ */
82
+ updateVideoTextures(): void;
83
+ /**
84
+ * Upload or update a named texture from JavaScript (for script channel).
85
+ */
86
+ updateTexture(name: string, width: number, height: number, data: Uint8Array | Float32Array): void;
87
+ /**
88
+ * Read pixels from a buffer pass (reads previous frame's data).
89
+ */
90
+ readPixels(passName: PassName, x: number, y: number, w: number, h: number): Uint8Array;
91
+ /** Whether this project uses audio channels. */
92
+ get needsAudio(): boolean;
93
+ /** Whether this project uses webcam channels. */
94
+ get needsWebcam(): boolean;
95
+ /** Get video sources that need initialization. */
96
+ get videoSources(): string[];
30
97
  get width(): number;
31
98
  get height(): number;
32
99
  get stats(): EngineStats;
@@ -40,22 +107,65 @@ export declare class ShadertoyEngine {
40
107
  source: string;
41
108
  isFromCommon: boolean;
42
109
  originalLine: number | null;
110
+ lineMapping: LineMapping;
43
111
  }>;
44
112
  /**
45
113
  * Check if there were any compilation errors.
46
114
  */
47
115
  hasErrors(): boolean;
116
+ /**
117
+ * Get the uniform store for direct access to uniform state.
118
+ */
119
+ getUniformStore(): UniformStore;
120
+ /**
121
+ * Get the current value of a custom uniform.
122
+ */
123
+ getUniformValue(name: string): UniformValue | undefined;
124
+ /**
125
+ * Get all custom uniform values.
126
+ */
127
+ getUniformValues(): UniformValues;
128
+ /**
129
+ * Set the value of a custom uniform.
130
+ * For scalar uniforms, the value will be applied on the next render frame.
131
+ * For array uniforms (UBOs), the data is packed to std140 and uploaded on next bind.
132
+ */
133
+ setUniformValue(name: string, value: UniformValue): void;
134
+ /**
135
+ * Set multiple custom uniform values at once.
136
+ */
137
+ setUniformValues(values: Partial<UniformValues>): void;
48
138
  /**
49
139
  * Get the framebuffer for the Image pass (for presenting to screen).
50
140
  */
51
141
  getImageFramebuffer(): WebGLFramebuffer | null;
142
+ /**
143
+ * Bind the Image pass output as the READ_FRAMEBUFFER for blitting to screen.
144
+ *
145
+ * After the ping-pong swap, the rendered output is in previousTexture,
146
+ * but the framebuffer is attached to currentTexture. This method temporarily
147
+ * attaches previousTexture so blitFramebuffer reads the correct data.
148
+ */
149
+ bindImageForRead(): boolean;
150
+ /**
151
+ * Restore the Image pass framebuffer to its normal state (attached to currentTexture).
152
+ * Call after blitting to screen.
153
+ */
154
+ unbindImageForRead(): void;
52
155
  /**
53
156
  * Run one full frame of all passes.
54
157
  *
55
158
  * @param timeSeconds - global time in seconds (monotone, from App)
56
159
  * @param mouse - iMouse as [x, y, clickX, clickY]
160
+ * @param touch - optional touch state for touch uniforms
57
161
  */
58
- step(timeSeconds: number, mouse: [number, number, number, number]): void;
162
+ step(timeSeconds: number, mouse: [number, number, number, number], mousePressed: boolean, touch?: {
163
+ count: number;
164
+ touches: [[number, number, number, number], [number, number, number, number], [number, number, number, number]];
165
+ pinch: number;
166
+ pinchDelta: number;
167
+ pinchCenter: [number, number];
168
+ }): void;
59
169
  /**
60
170
  * Resize all internal render targets to new width/height.
61
171
  * Does not reset time or frame count.
@@ -109,6 +219,11 @@ export declare class ShadertoyEngine {
109
219
  */
110
220
  dispose(): void;
111
221
  private initExtensions;
222
+ /**
223
+ * Cache uniform locations for a compiled program.
224
+ * Returns a PassUniformLocations object with all standard and custom uniform locations.
225
+ */
226
+ private cacheUniformLocations;
112
227
  /**
113
228
  * Initialize external textures based on project.textures.
114
229
  *
@@ -121,11 +236,6 @@ export declare class ShadertoyEngine {
121
236
  * Compile shaders, create VAOs/FBOs/textures, and build RuntimePass array.
122
237
  */
123
238
  private initRuntimePasses;
124
- /**
125
- * Calculate line number mappings for error reporting.
126
- * Returns info about where common.glsl code lives in the compiled shader.
127
- */
128
- private getLineMapping;
129
239
  /**
130
240
  * Build complete fragment shader source with Shadertoy boilerplate.
131
241
  *
@@ -146,15 +256,29 @@ export declare class ShadertoyEngine {
146
256
  private preprocessCubemapTextures;
147
257
  private executePass;
148
258
  private bindBuiltinUniforms;
259
+ /**
260
+ * Bind custom uniform values to the current program.
261
+ */
262
+ private bindCustomUniforms;
149
263
  private bindChannelTextures;
264
+ /**
265
+ * Bind named samplers (standard mode).
266
+ * Each named sampler gets its own texture unit.
267
+ */
268
+ private bindNamedSamplers;
150
269
  /**
151
270
  * Resolve a ChannelSource to an actual WebGLTexture to bind.
152
271
  */
153
272
  private resolveChannelTexture;
273
+ /**
274
+ * Resolve a ChannelSource to its resolution [width, height].
275
+ * Returns [0, 0] for unused channels.
276
+ */
277
+ private resolveChannelResolution;
154
278
  /**
155
279
  * Swap current and previous textures for a pass (ping-pong).
156
280
  * Also reattach framebuffer to new current texture.
157
281
  */
158
282
  private swapPassTextures;
159
283
  }
160
- //# sourceMappingURL=ShadertoyEngine.d.ts.map
284
+ //# sourceMappingURL=ShaderEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShaderEngine.d.ts","sourceRoot":"","sources":["../../src/engine/ShaderEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,aAAa,EAEb,QAAQ,EACR,YAAY,EACZ,aAAa,EAGd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,EACL,aAAa,EAOb,WAAW,EAEZ,MAAM,SAAS,CAAC;AAyGjB,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAgBD,qBAAa,YAAY;IACvB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,EAAE,EAAE,sBAAsB,CAAC;IAEpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,gBAAgB,CAAuC;IAE/D,OAAO,CAAC,aAAa,CAA6B;IAGlD,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,aAAa,CAAkC;IAGvD,OAAO,CAAC,kBAAkB,CAOlB;IAGR,OAAO,CAAC,SAAS,CAAgB;IAGjC,OAAO,CAAC,KAAK,CAAkB;IAG/B,OAAO,CAAC,aAAa,CAA0B;IAG/C,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,WAAW,CAAkB;IAGrC,OAAO,CAAC,cAAc,CAA6B;IAGnD,OAAO,CAAC,eAAe,CAAgD;gBAE3D,IAAI,EAAE,aAAa;IAqC/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAoDhB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoDzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBhC;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAa1B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BjC;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3C;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAc3B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI;IA2BjG;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU;IAsBtF,gDAAgD;IAChD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,iDAAiD;IACjD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,kDAAkD;IAClD,IAAI,YAAY,IAAI,MAAM,EAAE,CAI3B;IAMD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,KAAK,IAAI,WAAW,CASvB;IAED;;;OAGG;IACH,oBAAoB,IAAI,KAAK,CAAC;QAC5B,QAAQ,EAAE,QAAQ,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,OAAO,CAAC;QACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,WAAW,EAAE,WAAW,CAAC;KAC1B,CAAC;IAIF;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIvD;;OAEG;IACH,gBAAgB,IAAI,aAAa;IAIjC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAkFxD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAQtD;;OAEG;IACH,mBAAmB,IAAI,gBAAgB,GAAG,IAAI;IAK9C;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO;IAgB3B;;;OAGG;IACH,kBAAkB,IAAI,IAAI;IAgB1B;;;;;;OAMG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE;QAChG,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAChH,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,GAAG,IAAI;IA0ER;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAsB3C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAkCb;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAatD;;;OAGG;IACH,qBAAqB,IAAI,IAAI;IAa7B;;;;;;;OAOG;IACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAiD1F;;;;;;OAMG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,QAAQ,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;IA0CpH;;OAEG;IACH,OAAO,IAAI,IAAI;IA4Cf,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAyE7B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IA8D3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmFzB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IA0I3B;;;;;;;;;OASG;IACH,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,WAAW;IAmDnB,OAAO,CAAC,mBAAmB;IA+E3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwD1B,OAAO,CAAC,mBAAmB;IA0B3B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2D7B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAqChC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAmBzB"}