├── demos ├── .vscode │ └── settings.json ├── common │ ├── math-common.glsl │ └── blobby.glsl ├── horizon.jpg ├── outfoxing.mp3 ├── cubemap │ ├── yokohama_d.jpg │ ├── yokohama_e.jpg │ ├── yokohama_n.jpg │ ├── yokohama_s.jpg │ ├── yokohama_u.jpg │ ├── yokohama_w.jpg │ └── readme.txt ├── raymarcher_88.glsl ├── glslify.glsl ├── uv-warp.glsl ├── multipass.glsl ├── duck.glsl ├── blending.glsl ├── swirl_spin.glsl ├── bouncing.glsl ├── frame.glsl ├── plasma1.glsl ├── mouse.glsl ├── volume_points_0.glsl ├── blobby.glsl ├── feedback.glsl ├── buffer_a.glsl ├── audio.glsl ├── digital.glsl ├── volume_points_1.glsl ├── volume_points_common.glsl ├── cubemap.glsl ├── keyboard.glsl ├── fly_controls.glsl └── metaballs.glsl ├── .gitignore ├── images ├── example.png ├── example2.png └── example3.png ├── resources ├── play.png ├── pause.png ├── record.png ├── reload.png ├── screen.png ├── thumb.png ├── stop_rec.png └── stats.min.js ├── .vscode ├── .browse.VC.db ├── .browse.VC.db-wal ├── extensions.json ├── tasks.json ├── settings.json └── launch.json ├── src ├── extensions │ ├── webview_extension.ts │ ├── textures │ │ ├── texture_extension_extension.ts │ │ └── textures_init_extension.ts │ ├── audio │ │ ├── audio_pause_extension.ts │ │ ├── audio_resume_extension.ts │ │ ├── no_audio_extension.ts │ │ ├── audio_update_extension.ts │ │ └── audio_init_extension.ts │ ├── pause_whole_render_extension.ts │ ├── user_interface │ │ ├── reload_button_extension.ts │ │ ├── record_button_extension.ts │ │ ├── screenshot_button_extension.ts │ │ ├── pause_button_extension.ts │ │ ├── record_video_codec_extension.ts │ │ ├── record_max_duration_extension.ts │ │ ├── record_target_framerate_extension.ts │ │ ├── record_video_bit_rate_extension.ts │ │ ├── record_offline_format_extension.ts │ │ ├── record_offline_quality_extension.ts │ │ ├── record_video_container_extension.ts │ │ ├── screenshot_button_style_extension.ts │ │ ├── error_display │ │ │ ├── glslify_errors_extension.ts │ │ │ ├── default_errors_extension.ts │ │ │ └── diagnostics_errors_extension.ts │ │ ├── reload_button_style_extension.ts │ │ ├── record_button_style_extension.ts │ │ └── pause_button_style_extension.ts │ ├── initial_time_extension.ts │ ├── initial_paused_extension.ts │ ├── forced_aspect_extension.ts │ ├── advance_time_extension.ts │ ├── buffers │ │ ├── includes_test_compile_extension.ts │ │ ├── includes_init_extension.ts │ │ ├── includes_extension.ts │ │ ├── shaders_extension.ts │ │ └── buffers_init_extension.ts │ ├── initial_fly_control_position_extension.ts │ ├── initial_fly_control_rotation_extension.ts │ ├── forced_screenshot_resolution_extension.ts │ ├── initial_normalized_mouse_extension.ts │ ├── initial_mouse_extension.ts │ ├── advance_time_if_not_paused_extension.ts │ ├── packages │ │ ├── three_extension.ts │ │ ├── jquery_extension.ts │ │ ├── dat_gui_extension.ts │ │ ├── ccapture_extension.ts │ │ ├── stats_extension.ts │ │ └── three_flycontrols.ts │ ├── keyboard │ │ ├── keyboard_update_extension.ts │ │ ├── keyboard_init_extension.ts │ │ ├── keyboard_callbacks_extension.ts │ │ └── keyboard_shader_extension.ts │ ├── uniforms │ │ ├── uniforms_preamble_extension.ts │ │ ├── uniforms_update_extension.ts │ │ └── uniforms_init_extension.ts │ └── preamble_extension.ts ├── utility.ts ├── webviewcontent.ts ├── typenames.ts ├── webviewcontentassembler.ts ├── shaderstream.ts ├── extension.ts ├── context.ts ├── shaderlexer.ts └── shadertoymanager.ts ├── .vscodeignore ├── test ├── run_tests.ts └── index.ts ├── tsconfig.json ├── .eslintrc.json ├── webpack.config.js ├── .github └── workflows │ ├── Publish.yml │ └── BuildAndTest.yml ├── LICENSE.md ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md └── package.json /demos/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /demos/common/math-common.glsl: -------------------------------------------------------------------------------- 1 | const float PI = 3.14159; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | *.browse.VC.db* 4 | .vscode-test 5 | dist 6 | *.vsix 7 | -------------------------------------------------------------------------------- /demos/horizon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/horizon.jpg -------------------------------------------------------------------------------- /images/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/images/example.png -------------------------------------------------------------------------------- /resources/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/resources/play.png -------------------------------------------------------------------------------- /demos/outfoxing.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/outfoxing.mp3 -------------------------------------------------------------------------------- /images/example2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/images/example2.png -------------------------------------------------------------------------------- /images/example3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/images/example3.png -------------------------------------------------------------------------------- /resources/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/resources/pause.png -------------------------------------------------------------------------------- /resources/record.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/resources/record.png -------------------------------------------------------------------------------- /resources/reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/resources/reload.png -------------------------------------------------------------------------------- /resources/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/resources/screen.png -------------------------------------------------------------------------------- /resources/thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/resources/thumb.png -------------------------------------------------------------------------------- /.vscode/.browse.VC.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/.vscode/.browse.VC.db -------------------------------------------------------------------------------- /resources/stop_rec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/resources/stop_rec.png -------------------------------------------------------------------------------- /.vscode/.browse.VC.db-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/.vscode/.browse.VC.db-wal -------------------------------------------------------------------------------- /demos/cubemap/yokohama_d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/cubemap/yokohama_d.jpg -------------------------------------------------------------------------------- /demos/cubemap/yokohama_e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/cubemap/yokohama_e.jpg -------------------------------------------------------------------------------- /demos/cubemap/yokohama_n.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/cubemap/yokohama_n.jpg -------------------------------------------------------------------------------- /demos/cubemap/yokohama_s.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/cubemap/yokohama_s.jpg -------------------------------------------------------------------------------- /demos/cubemap/yokohama_u.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/cubemap/yokohama_u.jpg -------------------------------------------------------------------------------- /demos/cubemap/yokohama_w.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevensona/shader-toy/HEAD/demos/cubemap/yokohama_w.jpg -------------------------------------------------------------------------------- /src/extensions/webview_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | export interface WebviewExtension { 4 | generateContent(): string; 5 | } 6 | -------------------------------------------------------------------------------- /src/extensions/textures/texture_extension_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | export interface TextureExtensionExtension { 4 | generateTextureContent(): string; 5 | } 6 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | typings 3 | out 4 | test 5 | src 6 | node_modules 7 | images 8 | **/*.map 9 | .gitignore 10 | tsconfig.json 11 | tslint.json 12 | webpack.config.js 13 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "ms-vscode.vscode-typescript-tslint-plugin" 6 | ] 7 | } -------------------------------------------------------------------------------- /demos/common/blobby.glsl: -------------------------------------------------------------------------------- 1 | #include "math-common.glsl" 2 | 3 | #ifndef saturate 4 | #define saturate(x) (clamp(x, 0., 1.)) 5 | #endif 6 | 7 | vec2 rotate(vec2 p, float t) 8 | { 9 | return mat2(cos(t), -sin(t), sin(t), cos(t)) * p; 10 | } -------------------------------------------------------------------------------- /demos/cubemap/readme.txt: -------------------------------------------------------------------------------- 1 | Author 2 | ====== 3 | 4 | This is the work of Emil Persson, aka Humus. 5 | http://www.humus.name 6 | 7 | 8 | 9 | License 10 | ======= 11 | 12 | This work is licensed under a Creative Commons Attribution 3.0 Unported License. 13 | http://creativecommons.org/licenses/by/3.0/ 14 | -------------------------------------------------------------------------------- /src/extensions/audio/audio_pause_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from '../webview_extension'; 4 | 5 | export class AudioPauseExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return 'audioContext.suspend();'; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/extensions/audio/audio_resume_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from '../webview_extension'; 4 | 5 | export class AudioResumeExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return 'audioContext.resume();'; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/extensions/pause_whole_render_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from './webview_extension'; 4 | 5 | export class PauseWholeRenderExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return 'if (paused) return;'; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/extensions/user_interface/reload_button_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from '../webview_extension'; 4 | 5 | export class ReloadButtonExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return ''; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/extensions/audio/no_audio_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from '../webview_extension'; 4 | 5 | export class NoAudioExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return `\ 8 | const audioContext = { 9 | sampleRate: 0 10 | };`; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/extensions/user_interface/record_button_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from '../webview_extension'; 4 | 5 | export class RecordButtonExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return ''; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/extensions/user_interface/screenshot_button_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from '../webview_extension'; 4 | 5 | export class ScreenshotButtonExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return ''; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/utility.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | export function removeDuplicates(array: T[]): T[] { 4 | const map = new Map(); 5 | const newArray: T[] = []; 6 | for (const value of array) { 7 | if (map.get(value) === undefined) { 8 | newArray.push(value); 9 | map.set(value); 10 | } 11 | } 12 | return newArray; 13 | } 14 | -------------------------------------------------------------------------------- /src/extensions/user_interface/pause_button_extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import { WebviewExtension } from '../webview_extension'; 4 | 5 | export class PauseButtonExtension implements WebviewExtension { 6 | public generateContent(): string { 7 | return `\ 8 |