@stevejtrettel/shader-sandbox 0.1.2 → 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 +259 -235
  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 +16 -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
@@ -0,0 +1,145 @@
1
+ /**
2
+ * UniformStore - Simple state manager for custom uniforms
3
+ *
4
+ * Encapsulates uniform values and provides clean get/set interface.
5
+ * Used by the engine to manage uniform state.
6
+ */
7
+ import { isArrayUniform, } from '../project/types';
8
+ import { tightFloatCount } from '../engine/std140';
9
+ export class UniformStore {
10
+ constructor(definitions) {
11
+ this.values = {};
12
+ this.definitions = definitions;
13
+ this.initializeDefaults();
14
+ }
15
+ /**
16
+ * Initialize all values to their definition defaults.
17
+ */
18
+ initializeDefaults() {
19
+ for (const [name, def] of Object.entries(this.definitions)) {
20
+ if (isArrayUniform(def)) {
21
+ // Array uniforms initialize to zeroed Float32Array
22
+ this.values[name] = new Float32Array(tightFloatCount(def.type, def.count));
23
+ }
24
+ else {
25
+ this.values[name] = this.cloneValue(def.value);
26
+ }
27
+ }
28
+ }
29
+ /**
30
+ * Clone a value to avoid mutation of arrays.
31
+ */
32
+ cloneValue(value) {
33
+ if (value instanceof Float32Array)
34
+ return value.slice();
35
+ return Array.isArray(value) ? [...value] : value;
36
+ }
37
+ /**
38
+ * Get the definition for a uniform.
39
+ */
40
+ getDefinition(name) {
41
+ return this.definitions[name];
42
+ }
43
+ /**
44
+ * Get all definitions.
45
+ */
46
+ getDefinitions() {
47
+ return this.definitions;
48
+ }
49
+ /**
50
+ * Check if a uniform exists.
51
+ */
52
+ has(name) {
53
+ return name in this.definitions;
54
+ }
55
+ /**
56
+ * Get the current value of a uniform.
57
+ */
58
+ get(name) {
59
+ return this.values[name];
60
+ }
61
+ /**
62
+ * Get all current values (returns a shallow copy).
63
+ */
64
+ getAll() {
65
+ const result = {};
66
+ for (const [name, value] of Object.entries(this.values)) {
67
+ result[name] = this.cloneValue(value);
68
+ }
69
+ return result;
70
+ }
71
+ /**
72
+ * Set the value of a uniform.
73
+ * Returns true if the value was set, false if the uniform doesn't exist.
74
+ */
75
+ set(name, value) {
76
+ if (!this.has(name)) {
77
+ return false;
78
+ }
79
+ this.values[name] = this.cloneValue(value);
80
+ return true;
81
+ }
82
+ /**
83
+ * Set multiple values at once.
84
+ */
85
+ setAll(values) {
86
+ for (const [name, value] of Object.entries(values)) {
87
+ if (value !== undefined) {
88
+ this.set(name, value);
89
+ }
90
+ }
91
+ }
92
+ /**
93
+ * Reset a single uniform to its default value.
94
+ */
95
+ reset(name) {
96
+ const def = this.definitions[name];
97
+ if (!def) {
98
+ return false;
99
+ }
100
+ if (isArrayUniform(def)) {
101
+ this.values[name] = new Float32Array(tightFloatCount(def.type, def.count));
102
+ }
103
+ else {
104
+ this.values[name] = this.cloneValue(def.value);
105
+ }
106
+ return true;
107
+ }
108
+ /**
109
+ * Reset all uniforms to their default values.
110
+ */
111
+ resetAll() {
112
+ this.initializeDefaults();
113
+ }
114
+ /**
115
+ * Get the default value for a uniform.
116
+ */
117
+ getDefault(name) {
118
+ const def = this.definitions[name];
119
+ if (!def)
120
+ return undefined;
121
+ if (isArrayUniform(def))
122
+ return new Float32Array(tightFloatCount(def.type, def.count));
123
+ return this.cloneValue(def.value);
124
+ }
125
+ /**
126
+ * Iterate over all uniforms (name, definition, current value).
127
+ */
128
+ *entries() {
129
+ for (const [name, def] of Object.entries(this.definitions)) {
130
+ yield [name, def, this.values[name]];
131
+ }
132
+ }
133
+ /**
134
+ * Get the number of uniforms.
135
+ */
136
+ get size() {
137
+ return Object.keys(this.definitions).length;
138
+ }
139
+ /**
140
+ * Check if there are any uniforms.
141
+ */
142
+ get isEmpty() {
143
+ return this.size === 0;
144
+ }
145
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Uniforms Panel - Floating overlay for uniform controls
3
+ *
4
+ * A compact panel that floats on the right side of the canvas.
5
+ * Includes a toggle button to show/hide. Starts closed by default.
6
+ */
7
+ import './uniforms-panel.css';
8
+ import { UniformDefinitions, UniformValue, UniformValues } from '../project/types';
9
+ export interface UniformsPanelOptions {
10
+ /** Parent container to attach the panel to */
11
+ container: HTMLElement;
12
+ /** Uniform definitions from project */
13
+ uniforms: UniformDefinitions;
14
+ /** Callback when uniform value changes */
15
+ onChange: (name: string, value: UniformValue) => void;
16
+ /** Initial values (optional) */
17
+ initialValues?: UniformValues;
18
+ /** Start with panel open (default: false) */
19
+ startOpen?: boolean;
20
+ }
21
+ export declare class UniformsPanel {
22
+ private wrapper;
23
+ private panel;
24
+ private toggleButton;
25
+ private controls;
26
+ private isOpen;
27
+ constructor(opts: UniformsPanelOptions);
28
+ /**
29
+ * Update a uniform value from external source.
30
+ */
31
+ setValue(name: string, value: UniformValue): void;
32
+ /**
33
+ * Show the panel.
34
+ */
35
+ show(): void;
36
+ /**
37
+ * Hide the panel.
38
+ */
39
+ hide(): void;
40
+ /**
41
+ * Toggle panel visibility.
42
+ */
43
+ toggle(): void;
44
+ /**
45
+ * Check if panel is visible.
46
+ */
47
+ isVisible(): boolean;
48
+ /**
49
+ * Destroy the panel.
50
+ */
51
+ destroy(): void;
52
+ }
53
+ //# sourceMappingURL=UniformsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UniformsPanel.d.ts","sourceRoot":"","sources":["../../src/uniforms/UniformsPanel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,sBAAsB,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AAGjG,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,SAAS,EAAE,WAAW,CAAC;IACvB,uCAAuC;IACvC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACtD,gCAAgC;IAChC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,MAAM,CAAU;gBAEZ,IAAI,EAAE,oBAAoB;IAgFtC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAIjD;;OAEG;IACH,IAAI,IAAI,IAAI;IAMZ;;OAEG;IACH,IAAI,IAAI,IAAI;IAMZ;;OAEG;IACH,MAAM,IAAI,IAAI;IAQd;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Uniforms Panel - Floating overlay for uniform controls
3
+ *
4
+ * A compact panel that floats on the right side of the canvas.
5
+ * Includes a toggle button to show/hide. Starts closed by default.
6
+ */
7
+ import './uniforms-panel.css';
8
+ import { hasUIControl } from '../project/types';
9
+ import { UniformControls } from './UniformControls';
10
+ export class UniformsPanel {
11
+ constructor(opts) {
12
+ this.controls = null;
13
+ this.isOpen = opts.startOpen ?? false;
14
+ // Create wrapper for both toggle button and panel
15
+ this.wrapper = document.createElement('div');
16
+ this.wrapper.className = 'uniforms-panel-wrapper';
17
+ // Create toggle button (always visible)
18
+ this.toggleButton = document.createElement('button');
19
+ this.toggleButton.className = 'uniforms-toggle-button';
20
+ this.toggleButton.title = 'Toggle Uniforms Panel';
21
+ this.toggleButton.innerHTML = `
22
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
23
+ <line x1="4" y1="21" x2="4" y2="14"></line>
24
+ <line x1="4" y1="10" x2="4" y2="3"></line>
25
+ <line x1="12" y1="21" x2="12" y2="12"></line>
26
+ <line x1="12" y1="8" x2="12" y2="3"></line>
27
+ <line x1="20" y1="21" x2="20" y2="16"></line>
28
+ <line x1="20" y1="12" x2="20" y2="3"></line>
29
+ <line x1="1" y1="14" x2="7" y2="14"></line>
30
+ <line x1="9" y1="8" x2="15" y2="8"></line>
31
+ <line x1="17" y1="16" x2="23" y2="16"></line>
32
+ </svg>
33
+ `;
34
+ this.toggleButton.addEventListener('click', () => this.toggle());
35
+ this.wrapper.appendChild(this.toggleButton);
36
+ // Create panel element
37
+ this.panel = document.createElement('div');
38
+ this.panel.className = 'uniforms-panel';
39
+ // Only create content if there are visible uniforms
40
+ const hasVisible = Object.values(opts.uniforms).some(def => hasUIControl(def));
41
+ if (!hasVisible) {
42
+ this.wrapper.style.display = 'none';
43
+ opts.container.appendChild(this.wrapper);
44
+ return;
45
+ }
46
+ // Header with close button
47
+ const header = document.createElement('div');
48
+ header.className = 'uniforms-panel-header';
49
+ const title = document.createElement('span');
50
+ title.textContent = 'Uniforms';
51
+ header.appendChild(title);
52
+ const closeButton = document.createElement('button');
53
+ closeButton.className = 'uniforms-panel-close';
54
+ closeButton.innerHTML = '&times;';
55
+ closeButton.title = 'Close';
56
+ closeButton.addEventListener('click', () => this.hide());
57
+ header.appendChild(closeButton);
58
+ this.panel.appendChild(header);
59
+ // Content area for controls
60
+ const content = document.createElement('div');
61
+ content.className = 'uniforms-panel-content';
62
+ this.panel.appendChild(content);
63
+ // Create uniform controls
64
+ this.controls = new UniformControls({
65
+ container: content,
66
+ uniforms: opts.uniforms,
67
+ initialValues: opts.initialValues,
68
+ onChange: opts.onChange,
69
+ });
70
+ this.wrapper.appendChild(this.panel);
71
+ // Set initial state
72
+ if (!this.isOpen) {
73
+ this.panel.classList.add('closed');
74
+ }
75
+ // Append to container
76
+ opts.container.appendChild(this.wrapper);
77
+ }
78
+ /**
79
+ * Update a uniform value from external source.
80
+ */
81
+ setValue(name, value) {
82
+ this.controls?.setValue(name, value);
83
+ }
84
+ /**
85
+ * Show the panel.
86
+ */
87
+ show() {
88
+ this.isOpen = true;
89
+ this.toggleButton.classList.add('hidden');
90
+ this.panel.classList.remove('closed');
91
+ }
92
+ /**
93
+ * Hide the panel.
94
+ */
95
+ hide() {
96
+ this.isOpen = false;
97
+ this.panel.classList.add('closed');
98
+ this.toggleButton.classList.remove('hidden');
99
+ }
100
+ /**
101
+ * Toggle panel visibility.
102
+ */
103
+ toggle() {
104
+ if (this.isOpen) {
105
+ this.hide();
106
+ }
107
+ else {
108
+ this.show();
109
+ }
110
+ }
111
+ /**
112
+ * Check if panel is visible.
113
+ */
114
+ isVisible() {
115
+ return this.isOpen;
116
+ }
117
+ /**
118
+ * Destroy the panel.
119
+ */
120
+ destroy() {
121
+ this.controls?.destroy();
122
+ this.wrapper.remove();
123
+ }
124
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Uniform Controls Module
3
+ *
4
+ * UI components and state management for custom uniforms.
5
+ */
6
+ export { UniformControls } from './UniformControls';
7
+ export type { UniformControlsOptions } from './UniformControls';
8
+ export { UniformsPanel } from './UniformsPanel';
9
+ export type { UniformsPanelOptions } from './UniformsPanel';
10
+ export { UniformStore } from './UniformStore';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/uniforms/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Uniform Controls Module
3
+ *
4
+ * UI components and state management for custom uniforms.
5
+ */
6
+ export { UniformControls } from './UniformControls';
7
+ export { UniformsPanel } from './UniformsPanel';
8
+ export { UniformStore } from './UniformStore';
package/package.json CHANGED
@@ -1,7 +1,22 @@
1
1
  {
2
2
  "name": "@stevejtrettel/shader-sandbox",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Local Shadertoy-compatible GLSL shader development environment with live editing",
5
+ "author": "Steve Trettel",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/stevejtrettel/shader-sandbox",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/stevejtrettel/shader-sandbox.git"
11
+ },
12
+ "keywords": [
13
+ "shader",
14
+ "glsl",
15
+ "shadertoy",
16
+ "webgl",
17
+ "graphics",
18
+ "creative-coding"
19
+ ],
5
20
  "type": "module",
6
21
  "main": "./dist-lib/index.js",
7
22
  "types": "./dist-lib/index.d.ts",