@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.
- package/README.md +220 -23
- package/bin/cli.js +106 -14
- package/dist-lib/app/App.d.ts +143 -15
- package/dist-lib/app/App.d.ts.map +1 -1
- package/dist-lib/app/App.js +1343 -108
- package/dist-lib/app/app.css +349 -24
- package/dist-lib/app/types.d.ts +48 -5
- package/dist-lib/app/types.d.ts.map +1 -1
- package/dist-lib/editor/EditorPanel.d.ts +2 -2
- package/dist-lib/editor/EditorPanel.d.ts.map +1 -1
- package/dist-lib/editor/EditorPanel.js +1 -1
- package/dist-lib/editor/editor-panel.css +55 -32
- package/dist-lib/editor/prism-editor.css +16 -16
- package/dist-lib/embed.js +1 -1
- package/dist-lib/engine/{ShadertoyEngine.d.ts → ShaderEngine.d.ts} +134 -10
- package/dist-lib/engine/ShaderEngine.d.ts.map +1 -0
- package/dist-lib/engine/ShaderEngine.js +1523 -0
- package/dist-lib/engine/glHelpers.d.ts +24 -0
- package/dist-lib/engine/glHelpers.d.ts.map +1 -1
- package/dist-lib/engine/glHelpers.js +88 -0
- package/dist-lib/engine/std140.d.ts +47 -0
- package/dist-lib/engine/std140.d.ts.map +1 -0
- package/dist-lib/engine/std140.js +119 -0
- package/dist-lib/engine/types.d.ts +55 -5
- package/dist-lib/engine/types.d.ts.map +1 -1
- package/dist-lib/engine/types.js +1 -1
- package/dist-lib/index.d.ts +4 -3
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +2 -1
- package/dist-lib/layouts/SplitLayout.d.ts +2 -1
- package/dist-lib/layouts/SplitLayout.d.ts.map +1 -1
- package/dist-lib/layouts/SplitLayout.js +3 -0
- package/dist-lib/layouts/TabbedLayout.d.ts.map +1 -1
- package/dist-lib/layouts/UILayout.d.ts +55 -0
- package/dist-lib/layouts/UILayout.d.ts.map +1 -0
- package/dist-lib/layouts/UILayout.js +147 -0
- package/dist-lib/layouts/default.css +2 -2
- package/dist-lib/layouts/index.d.ts +11 -1
- package/dist-lib/layouts/index.d.ts.map +1 -1
- package/dist-lib/layouts/index.js +17 -1
- package/dist-lib/layouts/split.css +33 -31
- package/dist-lib/layouts/tabbed.css +127 -74
- package/dist-lib/layouts/types.d.ts +14 -3
- package/dist-lib/layouts/types.d.ts.map +1 -1
- package/dist-lib/main.js +33 -0
- package/dist-lib/project/configHelpers.d.ts +45 -0
- package/dist-lib/project/configHelpers.d.ts.map +1 -0
- package/dist-lib/project/configHelpers.js +196 -0
- package/dist-lib/project/generatedLoader.d.ts +2 -2
- package/dist-lib/project/generatedLoader.d.ts.map +1 -1
- package/dist-lib/project/generatedLoader.js +23 -5
- package/dist-lib/project/loadProject.d.ts +6 -6
- package/dist-lib/project/loadProject.d.ts.map +1 -1
- package/dist-lib/project/loadProject.js +396 -144
- package/dist-lib/project/loaderHelper.d.ts +4 -4
- package/dist-lib/project/loaderHelper.d.ts.map +1 -1
- package/dist-lib/project/loaderHelper.js +278 -116
- package/dist-lib/project/types.d.ts +292 -13
- package/dist-lib/project/types.d.ts.map +1 -1
- package/dist-lib/project/types.js +13 -1
- package/dist-lib/styles/base.css +5 -1
- package/dist-lib/uniforms/UniformControls.d.ts +60 -0
- package/dist-lib/uniforms/UniformControls.d.ts.map +1 -0
- package/dist-lib/uniforms/UniformControls.js +518 -0
- package/dist-lib/uniforms/UniformStore.d.ts +74 -0
- package/dist-lib/uniforms/UniformStore.d.ts.map +1 -0
- package/dist-lib/uniforms/UniformStore.js +145 -0
- package/dist-lib/uniforms/UniformsPanel.d.ts +53 -0
- package/dist-lib/uniforms/UniformsPanel.d.ts.map +1 -0
- package/dist-lib/uniforms/UniformsPanel.js +124 -0
- package/dist-lib/uniforms/index.d.ts +11 -0
- package/dist-lib/uniforms/index.d.ts.map +1 -0
- package/dist-lib/uniforms/index.js +8 -0
- package/package.json +1 -1
- package/src/app/App.ts +1469 -126
- package/src/app/app.css +349 -24
- package/src/app/types.ts +53 -5
- package/src/editor/EditorPanel.ts +5 -5
- package/src/editor/editor-panel.css +55 -32
- package/src/editor/prism-editor.css +16 -16
- package/src/embed.ts +1 -1
- package/src/engine/ShaderEngine.ts +1934 -0
- package/src/engine/glHelpers.ts +117 -0
- package/src/engine/std140.ts +136 -0
- package/src/engine/types.ts +69 -5
- package/src/index.ts +4 -3
- package/src/layouts/SplitLayout.ts +8 -3
- package/src/layouts/TabbedLayout.ts +3 -3
- package/src/layouts/UILayout.ts +185 -0
- package/src/layouts/default.css +2 -2
- package/src/layouts/index.ts +20 -1
- package/src/layouts/split.css +33 -31
- package/src/layouts/tabbed.css +127 -74
- package/src/layouts/types.ts +19 -3
- package/src/layouts/ui.css +289 -0
- package/src/main.ts +39 -1
- package/src/project/configHelpers.ts +225 -0
- package/src/project/generatedLoader.ts +27 -6
- package/src/project/loadProject.ts +459 -173
- package/src/project/loaderHelper.ts +377 -130
- package/src/project/types.ts +360 -14
- package/src/styles/base.css +5 -1
- package/src/styles/theme.css +292 -0
- package/src/uniforms/UniformControls.ts +660 -0
- package/src/uniforms/UniformStore.ts +166 -0
- package/src/uniforms/UniformsPanel.ts +163 -0
- package/src/uniforms/index.ts +13 -0
- package/src/uniforms/uniform-controls.css +342 -0
- package/src/uniforms/uniforms-panel.css +277 -0
- package/templates/shaders/example-buffer/config.json +1 -0
- package/dist-lib/engine/ShadertoyEngine.d.ts.map +0 -1
- package/dist-lib/engine/ShadertoyEngine.js +0 -704
- 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:
|
|
10
|
-
border-bottom: 1px solid
|
|
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:
|
|
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:
|
|
35
|
+
color: var(--tab-text-hover);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
.editor-tab-button.active {
|
|
39
|
-
color:
|
|
40
|
-
border-bottom-color:
|
|
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:
|
|
44
|
+
color: var(--accent-secondary);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
.editor-tab-button.image-tab.active {
|
|
48
|
-
color:
|
|
49
|
-
border-bottom-color:
|
|
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:
|
|
58
|
-
border: 1px solid
|
|
59
|
-
color:
|
|
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:
|
|
71
|
-
border-color:
|
|
72
|
-
color:
|
|
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:
|
|
92
|
+
background: var(--button-bg-hover);
|
|
77
93
|
}
|
|
78
94
|
|
|
79
95
|
.editor-copy-button.copied {
|
|
80
|
-
background:
|
|
81
|
-
border-color:
|
|
82
|
-
color:
|
|
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:
|
|
110
|
+
background: var(--recompile-bg);
|
|
95
111
|
border: none;
|
|
96
|
-
color:
|
|
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:
|
|
124
|
+
background: var(--recompile-bg-hover);
|
|
109
125
|
}
|
|
110
126
|
|
|
111
127
|
.editor-recompile-button:active {
|
|
112
|
-
background:
|
|
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:
|
|
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:
|
|
137
|
-
color:
|
|
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:
|
|
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:
|
|
184
|
+
box-shadow: var(--shadow-sm);
|
|
162
185
|
}
|
|
163
186
|
|
|
164
187
|
/* Error display */
|
|
165
188
|
.editor-error-display {
|
|
166
|
-
background:
|
|
167
|
-
color:
|
|
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
|
|
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:
|
|
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:
|
|
21
|
-
border-right: 1px solid
|
|
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:
|
|
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:
|
|
69
|
+
background: var(--code-selection);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
.prism-editor-textarea::-moz-selection {
|
|
73
|
-
background:
|
|
73
|
+
background: var(--code-selection);
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
/* Highlighted code overlay */
|
|
77
77
|
.prism-editor-highlight {
|
|
78
|
-
background:
|
|
79
|
-
color:
|
|
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:
|
|
93
|
-
.prism-editor-highlight .token.keyword { color:
|
|
94
|
-
.prism-editor-highlight .token.string { color:
|
|
95
|
-
.prism-editor-highlight .token.number { color:
|
|
96
|
-
.prism-editor-highlight .token.operator { color:
|
|
97
|
-
.prism-editor-highlight .token.function { color:
|
|
98
|
-
.prism-editor-highlight .token.class-name { color:
|
|
99
|
-
.prism-editor-highlight .token.punctuation { color:
|
|
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
|
@@ -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 {
|
|
12
|
+
import { ShaderProject, PassName, UniformValue, UniformValues } from '../project/types';
|
|
13
|
+
import { UniformStore } from '../uniforms/UniformStore';
|
|
13
14
|
import { EngineOptions, EngineStats } from './types';
|
|
14
|
-
|
|
15
|
-
|
|
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]
|
|
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=
|
|
284
|
+
//# sourceMappingURL=ShaderEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderEngine.d.ts","sourceRoot":"","sources":["../../src/engine/ShaderEngine.ts"],"names":[],"mappings":"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"}
|