├── .gitignore
├── README.md
├── css
├── demo.css
└── normalize.css
├── favicon.ico
├── img
├── gradient_map1.png
├── gradient_map2.png
├── gradient_map3.png
├── img1.jpg
├── img2.jpg
├── img3.jpg
├── img4.jpg
├── mouse.svg
└── related
│ ├── AnimatedHeaderBackgrounds.png
│ └── PrismEffectSlider.jpg
├── index.html
├── index2.html
├── index3.html
├── index4.html
├── index5.html
├── index6.html
├── index7.html
├── index8.html
├── index9.html
├── js
├── demo1.js
├── demo2.js
├── demo3.js
├── demo4.js
├── demo5.js
├── demo6.js
├── demo7.js
├── demo8.js
├── demo9.js
└── regl.min.js
└── psd
└── gradient_map.psd
/.gitignore:
--------------------------------------------------------------------------------
1 | *.DS_Store
2 |
3 | # Windows thumbnail cache files
4 | Thumbs.db
5 | ehthumbs.db
6 | ehthumbs_vista.db
7 |
8 | # Folder config file
9 | Desktop.ini
10 |
11 | # Recycle Bin used on file shares
12 | $RECYCLE.BIN/
13 |
14 | # Windows Installer files
15 | *.cab
16 | *.msi
17 | *.msm
18 | *.msp
19 |
20 | # Windows shortcuts
21 | *.lnk
22 |
23 | # Dropbox settings and caches
24 | .dropbox
25 | .dropbox.attr
26 | .dropbox.cache
27 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WebGL Scroll Spiral
2 |
3 | Some decorative background scroll effects for websites using WebGL and regl. By Xoihazard.
4 |
5 | 
6 |
7 | [Article on Codrops](https://tympanus.net/codrops/?p=30761)
8 |
9 | [Demo](https://tympanus.net/Development/ScrollSpiral/)
10 |
11 | ## Credits
12 |
13 | - [Official regl website](http://regl.party)
14 | - Images copyright by [RuleByArt](https://creativemarket.com/RuleByArt?u=codrops). Purchase on Creative Market: [Flight](https://creativemarket.com/RuleByArt/468537-Flight?u=codrops) and [Surface Shapes](https://creativemarket.com/RuleByArt/32279-Surface-Shapes?u=codrops)
15 |
16 | ## License
17 | This resource can be used freely if integrated or build upon in personal or commercial projects such as websites, web apps and web templates intended for sale. It is not allowed to take the resource "as-is" and sell it, redistribute, re-publish it, or sell "pluginized" versions of it. Free plugins built using this resource should have a visible mention and link to the original work. Always consider the licenses of all included libraries, scripts and images used.
18 |
19 | ## Misc
20 |
21 | Follow Codrops: [Twitter](http://www.twitter.com/codrops), [Facebook](http://www.facebook.com/codrops), [Google+](https://plus.google.com/101095823814290637419), [GitHub](https://github.com/codrops), [Pinterest](http://www.pinterest.com/codrops/), [Instagram](https://www.instagram.com/codropsss/)
22 |
23 | [© Codrops 2017](http://www.codrops.com)
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/css/demo.css:
--------------------------------------------------------------------------------
1 | *,
2 | *::after,
3 | *::before {
4 | box-sizing: border-box;
5 | }
6 |
7 | body {
8 | font-family: 'Roboto Mono', monospace;
9 | color: #fff;
10 | background: #000;
11 | }
12 |
13 | a {
14 | text-decoration: none;
15 | color: #fff;
16 | outline: none;
17 | }
18 |
19 | a:hover,
20 | a:focus {
21 | color: #fff;
22 | }
23 |
24 | .hidden {
25 | position: absolute;
26 | overflow: hidden;
27 | width: 0;
28 | height: 0;
29 | pointer-events: none;
30 | }
31 |
32 | /* Overlay */
33 | main::before {
34 | content: '';
35 | position: fixed;
36 | z-index: -1;
37 | top: 0;
38 | left: 0;
39 | width: 100%;
40 | height: 100%;
41 | pointer-events: none;
42 | background: rgba(0,0,0,0.4);
43 | }
44 |
45 | /* Icons */
46 |
47 | .icon {
48 | display: block;
49 | width: 1.5em;
50 | height: 1.5em;
51 | margin: 0 auto;
52 | fill: currentColor;
53 | }
54 |
55 | /* Page Loader */
56 |
57 | .js .loading::before {
58 | content: '';
59 | position: fixed;
60 | z-index: 1000;
61 | top: 0;
62 | left: 0;
63 | width: 100%;
64 | height: 100%;
65 | background: #000;
66 | }
67 |
68 | .js .loading::after {
69 | content: '';
70 | position: fixed;
71 | z-index: 1001;
72 | top: 50%;
73 | left: 50%;
74 | width: 50px;
75 | height: 50px;
76 | margin: -25px 0 0 -25px;
77 | pointer-events: none;
78 | border-radius: 50%;
79 | background: #3b3b3b;
80 | animation: loaderAnim 0.8s ease-out infinite alternate forwards;
81 | }
82 |
83 | @keyframes loaderAnim {
84 | to {
85 | transform: scale3d(0.5,0.5,1);
86 | }
87 | }
88 |
89 | .content {
90 | display: flex;
91 | flex-wrap: wrap;
92 | min-height: 100vh;
93 | }
94 |
95 | .content--main {
96 | min-height: 500vh;
97 | }
98 |
99 | .content--main::before,
100 | .content--main::after {
101 | position: fixed;
102 | left: 50%;
103 | }
104 |
105 | .content--main::before {
106 | content: '';
107 | bottom: 3em;
108 | height: 1.5em;
109 | width: 1px;
110 | background: #fff;
111 | }
112 |
113 | .content--main::after {
114 | content: 'Scroll';
115 | position: fixed;
116 | bottom: 0;
117 | width: 6em;
118 | text-align: center;
119 | margin: 0 0 1.5em -3em;
120 | font-size: 0.75em;
121 | text-transform: uppercase;
122 | letter-spacing: 2px;
123 | text-indent: 2px;
124 | }
125 |
126 | .content--header {
127 | position: relative;
128 | z-index: 11;
129 | align-items: flex-start;
130 | width: 100%;
131 | padding: 1.5em;
132 | }
133 |
134 | .content__top {
135 | display: flex;
136 | flex-direction: row;
137 | flex-wrap: wrap;
138 | align-items: center;
139 | width: 100%;
140 | }
141 |
142 | .main-title {
143 | font-size: 1em;
144 | font-weight: normal;
145 | margin: 0;
146 | padding: 0;
147 | }
148 |
149 | .main-tagline {
150 | font-size: 0.865em;
151 | margin: 0 1em;
152 | opacity: 0.8;
153 | }
154 |
155 | .main-tagline::before,
156 | .main-tagline::after {
157 | content: ' // ';
158 | }
159 |
160 | .github {
161 | font-size: 0.865em;
162 | }
163 |
164 | /* Top Navigation Style */
165 |
166 | .codrops-links {
167 | position: relative;
168 | display: flex;
169 | justify-content: center;
170 | margin: 0 0 0 auto;
171 | text-align: center;
172 | white-space: nowrap;
173 | }
174 |
175 | .codrops-icon {
176 | display: inline-block;
177 | margin: 0.25em;
178 | padding: 0.5em;
179 | }
180 |
181 | /* Demo links */
182 |
183 | .demos {
184 | position: fixed;
185 | top: 6em;
186 | left: 0;
187 | display: flex;
188 | flex-direction: column;
189 | align-items: flex-start;
190 | padding: 0 1.25em;
191 | }
192 |
193 | .demo {
194 | font-size: 0.865em;
195 | position: relative;
196 | margin: 0 1em 0.5em 0;
197 | padding: 0 0 0.25em 0.25em;
198 | white-space: nowrap;
199 | }
200 |
201 | .demo:hover,
202 | .demo--current {
203 | text-decoration: underline;
204 | }
205 |
206 | /* Related demos */
207 |
208 | .content--related {
209 | position: relative;
210 | z-index: 10;
211 | justify-content: center;
212 | padding: 3em 1.5em;
213 | text-align: center;
214 | background: #000;
215 | align-content: center;
216 | }
217 |
218 | .content--related a,
219 | .github {
220 | text-decoration: underline;
221 | }
222 |
223 | .content--related a:hover,
224 | .content--related a:focus,
225 | .github:hover,
226 | .github:focus {
227 | text-decoration: none;
228 | }
229 |
230 | .content__text {
231 | font-size: 0.865em;
232 | font-weight: normal;
233 | width: 100%;
234 | margin: 0 0 1em 0;
235 | }
236 |
237 | .content__text:first-child {
238 | margin: 0 0 5em 0;
239 | }
240 |
241 | .media-item {
242 | display: inline-block;
243 | padding: 1em;
244 | vertical-align: top;
245 | transition: color 0.3s;
246 | }
247 |
248 | .media-item__img {
249 | max-width: 100%;
250 | opacity: 0.6;
251 | transition: opacity 0.3s;
252 | }
253 |
254 | .media-item:hover .media-item__img,
255 | .media-item:focus .media-item__img {
256 | opacity: 1;
257 | }
258 |
259 | .media-item__title {
260 | font-size: 0.865em;
261 | font-weight: normal;
262 | max-width: 200px;
263 | margin: 0;
264 | padding: 0.5em;
265 | }
266 |
267 | #webgl {
268 | position: fixed;
269 | z-index: -1;
270 | top: 0;
271 | left: 0;
272 | display: block;
273 | width: 100vw;
274 | height: 100vh;
275 | }
276 |
277 | /* Colors for demos */
278 |
279 | /* Demo 2 */
280 | .demo-2 {
281 | background: #5ae6ae;
282 | }
283 | .demo-2 main::before {
284 | background: rgba(60, 145, 110, 0.3);
285 | }
286 | .demo-2 .content--related {
287 | background: #5ae6ae;
288 | }
289 |
290 | /* Demo 3 */
291 | .demo-3 {
292 | background: #d8d9cd;
293 | }
294 | .demo-3 main::before {
295 | background: rgba(169, 175, 66, 0.3);
296 | }
297 | .demo-3 .content--related {
298 | background: #d8d9cd;
299 | }
300 |
301 | /* Demo 4 */
302 | .demo-4 {
303 | background: #babed1;
304 | }
305 | .demo-4 main::before {
306 | background: rgba(175, 179, 194, 0.3);
307 | }
308 | .demo-4 .content--related {
309 | background: #babed1;
310 | }
311 |
312 | /* Demo 5 */
313 | .demo-5 {
314 | background: #000;
315 | }
316 | .demo-5 main::before {
317 | background: rgba(0,0,0,0.4);
318 | }
319 | .demo-5 .content--related {
320 | background: #000;
321 | }
322 |
323 | /* Demo 6 */
324 | .demo-6 {
325 | background: #e8dac5;
326 | }
327 | .demo-6 main::before {
328 | background: rgba(0, 0, 0, 0.3);
329 | }
330 | .demo-6 .content--related {
331 | background: #e8dac5;
332 | }
333 |
334 | /* Demo 7 */
335 | .demo-7 {
336 | background: #000;
337 | }
338 | .demo-7 main::before {
339 | background: rgba(0, 0, 0, 0.6);
340 | }
341 | .demo-7 .content--related {
342 | background: #000;
343 | }
344 |
345 | /* Demo 8 */
346 | .demo-8 {
347 | background: #232121;
348 | }
349 | .demo-8 main::before {
350 | background: rgba(84, 115, 243, 0.3);
351 | }
352 | .demo-8 .content--related {
353 | background: #232121;
354 | }
355 |
356 | /* Demo 9 */
357 | .demo-9 {
358 | background: #232121;
359 | }
360 | .demo-9 main::before {
361 | background: rgba(0, 0, 0, 0.3);
362 | }
363 | .demo-9 .content--related {
364 | background: #2a2acf;
365 | }
366 |
367 | @media screen and (max-width: 40em) {
368 | .content--header {
369 | padding: 1em 0.5em 0;
370 | }
371 | .content__top {
372 | display: block;
373 | text-align: center;
374 | }
375 | .main-tagline {
376 | margin: 0;
377 | }
378 | .demos {
379 | position: relative;
380 | width: 100%;
381 | margin: 0;
382 | padding: 0.5em;
383 | transform: none;
384 | top: auto;
385 | display: block;
386 | }
387 | }
388 |
--------------------------------------------------------------------------------
/css/normalize.css:
--------------------------------------------------------------------------------
1 | article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}audio,canvas,video{display:inline-block;}audio:not([controls]){display:none;height:0;}[hidden]{display:none;}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}a:focus{outline:thin dotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em 0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"\201C" "\201D" "\2018" "\2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:0;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;}button,input{line-height:normal;}button,select{text-transform:none;}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}button[disabled],html input[disabled]{cursor:default;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}textarea{overflow:auto;vertical-align:top;}table{border-collapse:collapse;border-spacing:0;}
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/favicon.ico
--------------------------------------------------------------------------------
/img/gradient_map1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/gradient_map1.png
--------------------------------------------------------------------------------
/img/gradient_map2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/gradient_map2.png
--------------------------------------------------------------------------------
/img/gradient_map3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/gradient_map3.png
--------------------------------------------------------------------------------
/img/img1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/img1.jpg
--------------------------------------------------------------------------------
/img/img2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/img2.jpg
--------------------------------------------------------------------------------
/img/img3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/img3.jpg
--------------------------------------------------------------------------------
/img/img4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/img4.jpg
--------------------------------------------------------------------------------
/img/mouse.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/img/related/AnimatedHeaderBackgrounds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/related/AnimatedHeaderBackgrounds.png
--------------------------------------------------------------------------------
/img/related/PrismEffectSlider.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codrops/ScrollSpiral/3889131fea11ce6b818a1f7e2299cf100f56180d/img/related/PrismEffectSlider.jpg
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 1 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
154 |
155 |
156 |
157 |
--------------------------------------------------------------------------------
/index2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 2 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/index3.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 2 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/index4.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 2 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/index5.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 2 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/index6.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 3 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
170 |
171 |
172 |
173 |
--------------------------------------------------------------------------------
/index7.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 3 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
170 |
171 |
172 |
173 |
--------------------------------------------------------------------------------
/index8.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 3 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
54 |
55 |
56 |
68 |
69 |
70 |
173 |
174 |
175 |
176 |
--------------------------------------------------------------------------------
/index9.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | WebGL Scroll Spiral | Demo 1 | Codrops
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
52 |
53 |
65 |
66 |
67 |
154 |
155 |
156 |
157 |
--------------------------------------------------------------------------------
/js/demo1.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Create a REGL draw command
18 | var draw = regl({
19 | frag: document.querySelector('#fragmentShader').textContent,
20 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
21 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
22 | count: 3,
23 | uniforms: {
24 | globaltime: regl.prop('globaltime'),
25 | resolution: regl.prop('resolution'),
26 | aspect: regl.prop('aspect'),
27 | scroll: regl.prop('scroll'),
28 | velocity: regl.prop('velocity')
29 | }
30 | });
31 |
32 | // Hook a callback to execute each frame
33 | regl.frame(function(ctx) {
34 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
35 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
36 | canvas.width = 512 * aspect;
37 | canvas.height = 512;
38 |
39 | // Scroll amount (0.0 to 1.0)
40 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
41 |
42 | // Scroll velocity
43 | // Inertia example:
44 | // velocity = velocity * 0.99 + (scroll - lastScroll);
45 | // lastScroll = scroll;
46 |
47 | // Clear the draw buffer
48 | regl.clear({ color: [0, 0, 0, 0] });
49 |
50 | // Execute a REGL draw command
51 | draw({
52 | globaltime: ctx.time,
53 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
54 | aspect: aspect,
55 | scroll: scroll,
56 | velocity: velocity
57 | });
58 | });
59 |
60 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
61 |
62 | }();
63 |
--------------------------------------------------------------------------------
/js/demo2.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // Initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Loading a texture
18 | var img = new Image();
19 | img.src = 'img/img1.jpg';
20 | img.onload = function() {
21 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
22 |
23 | // Create a REGL draw command
24 | var draw = regl({
25 | frag: document.querySelector('#fragmentShader').textContent,
26 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
27 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
28 | count: 3,
29 | uniforms: {
30 | globaltime: regl.prop('globaltime'),
31 | resolution: regl.prop('resolution'),
32 | aspect: regl.prop('aspect'),
33 | scroll: regl.prop('scroll'),
34 | velocity: regl.prop('velocity'),
35 | texture: regl.texture(img)
36 | }
37 | });
38 |
39 | // Hook a callback to execute each frame
40 | regl.frame(function(ctx) {
41 |
42 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
43 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
44 | canvas.width = 1024 * aspect;
45 | canvas.height = 1024;
46 |
47 | // Scroll amount (0.0 to 1.0)
48 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
49 |
50 | // Scroll Velocity
51 | // Inertia example:
52 | // velocity = velocity * 0.99 + (scroll - lastScroll);
53 | // lastScroll = scroll;
54 |
55 | // Clear the draw buffer
56 | regl.clear({ color: [0, 0, 0, 0] });
57 |
58 | // Execute a REGL draw command
59 | draw({
60 | globaltime: ctx.time,
61 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
62 | aspect: aspect,
63 | scroll: scroll,
64 | velocity: velocity
65 | });
66 | });
67 | };
68 |
69 | }();
70 |
--------------------------------------------------------------------------------
/js/demo3.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // Initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Loading a texture
18 | var img = new Image();
19 | img.src = 'img/img2.jpg';
20 | img.onload = function() {
21 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
22 |
23 | // Create a REGL draw command
24 | var draw = regl({
25 | frag: document.querySelector('#fragmentShader').textContent,
26 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
27 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
28 | count: 3,
29 | uniforms: {
30 | globaltime: regl.prop('globaltime'),
31 | resolution: regl.prop('resolution'),
32 | aspect: regl.prop('aspect'),
33 | scroll: regl.prop('scroll'),
34 | velocity: regl.prop('velocity'),
35 | texture: regl.texture(img)
36 | }
37 | });
38 |
39 | // Hook a callback to execute each frame
40 | regl.frame(function(ctx) {
41 |
42 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
43 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
44 | canvas.width = 1024 * aspect;
45 | canvas.height = 1024;
46 |
47 | // Scroll amount (0.0 to 1.0)
48 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
49 |
50 | // Scroll Velocity
51 | // Inertia example:
52 | // velocity = velocity * 0.99 + (scroll - lastScroll);
53 | // lastScroll = scroll;
54 |
55 | // Clear the draw buffer
56 | regl.clear({ color: [0, 0, 0, 0] });
57 |
58 | // Execute a REGL draw command
59 | draw({
60 | globaltime: ctx.time,
61 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
62 | aspect: aspect,
63 | scroll: scroll,
64 | velocity: velocity
65 | });
66 | });
67 | };
68 |
69 | }();
70 |
--------------------------------------------------------------------------------
/js/demo4.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // Initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Loading a texture
18 | var img = new Image();
19 | img.src = 'img/img3.jpg';
20 | img.onload = function() {
21 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
22 |
23 | // Create a REGL draw command
24 | var draw = regl({
25 | frag: document.querySelector('#fragmentShader').textContent,
26 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
27 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
28 | count: 3,
29 | uniforms: {
30 | globaltime: regl.prop('globaltime'),
31 | resolution: regl.prop('resolution'),
32 | aspect: regl.prop('aspect'),
33 | scroll: regl.prop('scroll'),
34 | velocity: regl.prop('velocity'),
35 | texture: regl.texture(img)
36 | }
37 | });
38 |
39 | // Hook a callback to execute each frame
40 | regl.frame(function(ctx) {
41 |
42 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
43 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
44 | canvas.width = 1024 * aspect;
45 | canvas.height = 1024;
46 |
47 | // Scroll amount (0.0 to 1.0)
48 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
49 |
50 | // Scroll Velocity
51 | // Inertia example:
52 | // velocity = velocity * 0.99 + (scroll - lastScroll);
53 | // lastScroll = scroll;
54 |
55 | // Clear the draw buffer
56 | regl.clear({ color: [0, 0, 0, 0] });
57 |
58 | // Execute a REGL draw command
59 | draw({
60 | globaltime: ctx.time,
61 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
62 | aspect: aspect,
63 | scroll: scroll,
64 | velocity: velocity
65 | });
66 | });
67 | };
68 | }();
69 |
--------------------------------------------------------------------------------
/js/demo5.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // Initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Loading a texture
18 | var img = new Image();
19 | img.src = 'img/img4.jpg';
20 | img.onload = function() {
21 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
22 |
23 | // Create a REGL draw command
24 | var draw = regl({
25 | frag: document.querySelector('#fragmentShader').textContent,
26 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
27 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
28 | count: 3,
29 | uniforms: {
30 | globaltime: regl.prop('globaltime'),
31 | resolution: regl.prop('resolution'),
32 | aspect: regl.prop('aspect'),
33 | scroll: regl.prop('scroll'),
34 | velocity: regl.prop('velocity'),
35 | texture: regl.texture(img)
36 | }
37 | });
38 |
39 | // Hook a callback to execute each frame
40 | regl.frame(function(ctx) {
41 |
42 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
43 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
44 | canvas.width = 1024 * aspect;
45 | canvas.height = 1024;
46 |
47 | // Scroll amount (0.0 to 1.0)
48 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
49 |
50 | // Scroll Velocity
51 | // Inertia example:
52 | // velocity = velocity * 0.99 + (scroll - lastScroll);
53 | // lastScroll = scroll;
54 |
55 | // Clear the draw buffer
56 | regl.clear({ color: [0, 0, 0, 0] });
57 |
58 | // Execute a REGL draw command
59 | draw({
60 | globaltime: ctx.time,
61 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
62 | aspect: aspect,
63 | scroll: scroll,
64 | velocity: velocity
65 | });
66 | });
67 | };
68 |
69 | }();
70 |
--------------------------------------------------------------------------------
/js/demo6.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Loading a texture
18 | var img = new Image();
19 | img.src = 'img/gradient_map1.png';
20 | img.onload = function() {
21 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
22 |
23 | // Create a REGL draw command
24 | var draw = regl({
25 | frag: document.querySelector('#fragmentShader').textContent,
26 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
27 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
28 | count: 3,
29 | uniforms: {
30 | globaltime: regl.prop('globaltime'),
31 | resolution: regl.prop('resolution'),
32 | aspect: regl.prop('aspect'),
33 | scroll: regl.prop('scroll'),
34 | velocity: regl.prop('velocity'),
35 | gradient: regl.texture(img)
36 | }
37 | });
38 |
39 | // Hook a callback to execute each frame
40 | regl.frame(function(ctx) {
41 |
42 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
43 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
44 | canvas.width = 768 * aspect;
45 | canvas.height = 768;
46 |
47 | // Scroll amount (0.0 to 1.0)
48 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
49 |
50 | // Scroll Velocity
51 | // Inertia example:
52 | // velocity = velocity * 0.99 + (scroll - lastScroll);
53 | // lastScroll = scroll;
54 |
55 | // Clear the draw buffer
56 | regl.clear({ color: [0, 0, 0, 0] });
57 |
58 | // Execute a REGL draw command
59 | draw({
60 | globaltime: ctx.time,
61 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
62 | aspect: aspect,
63 | scroll: scroll,
64 | velocity: velocity
65 | });
66 | });
67 |
68 | };
69 |
70 | }();
71 |
--------------------------------------------------------------------------------
/js/demo7.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Loading a texture
18 | var img = new Image();
19 | img.src = 'img/gradient_map2.png';
20 | img.onload = function() {
21 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
22 |
23 | // Create a REGL draw command
24 | var draw = regl({
25 | frag: document.querySelector('#fragmentShader').textContent,
26 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
27 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
28 | count: 3,
29 | uniforms: {
30 | globaltime: regl.prop('globaltime'),
31 | resolution: regl.prop('resolution'),
32 | aspect: regl.prop('aspect'),
33 | scroll: regl.prop('scroll'),
34 | velocity: regl.prop('velocity'),
35 | gradient: regl.texture(img)
36 | }
37 | });
38 |
39 | // Hook a callback to execute each frame
40 | regl.frame(function(ctx) {
41 |
42 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
43 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
44 | canvas.width = 768 * aspect;
45 | canvas.height = 768;
46 |
47 | // Scroll amount (0.0 to 1.0)
48 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
49 |
50 | // Scroll Velocity
51 | // Inertia example:
52 | // velocity = velocity * 0.99 + (scroll - lastScroll);
53 | // lastScroll = scroll;
54 |
55 | // Clear the draw buffer
56 | regl.clear({ color: [0, 0, 0, 0] });
57 |
58 | // Execute a REGL draw command
59 | draw({
60 | globaltime: ctx.time,
61 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
62 | aspect: aspect,
63 | scroll: scroll,
64 | velocity: velocity
65 | });
66 | });
67 |
68 | };
69 |
70 | }();
71 |
--------------------------------------------------------------------------------
/js/demo8.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Loading a texture
18 | var img = new Image();
19 | img.src = 'img/gradient_map3.png';
20 | img.onload = function() {
21 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
22 |
23 | // Create a REGL draw command
24 | var draw = regl({
25 | frag: document.querySelector('#fragmentShader').textContent,
26 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
27 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
28 | count: 3,
29 | uniforms: {
30 | globaltime: regl.prop('globaltime'),
31 | resolution: regl.prop('resolution'),
32 | aspect: regl.prop('aspect'),
33 | scroll: regl.prop('scroll'),
34 | velocity: regl.prop('velocity'),
35 | gradient: regl.texture(img)
36 | }
37 | });
38 |
39 | // Hook a callback to execute each frame
40 | regl.frame(function(ctx) {
41 |
42 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
43 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
44 | canvas.width = 768 * aspect;
45 | canvas.height = 768;
46 |
47 | // Scroll amount (0.0 to 1.0)
48 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
49 |
50 | // Scroll Velocity
51 | // Inertia example:
52 | // velocity = velocity * 0.99 + (scroll - lastScroll);
53 | // lastScroll = scroll;
54 |
55 | // Clear the draw buffer
56 | regl.clear({ color: [0, 0, 0, 0] });
57 |
58 | // Execute a REGL draw command
59 | draw({
60 | globaltime: ctx.time,
61 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
62 | aspect: aspect,
63 | scroll: scroll,
64 | velocity: velocity
65 | });
66 | });
67 |
68 | };
69 |
70 | }();
71 |
--------------------------------------------------------------------------------
/js/demo9.js:
--------------------------------------------------------------------------------
1 | !function() {
2 | 'use strict';
3 |
4 | var canvas = document.querySelector('#webgl');
5 |
6 | // Scroll variables
7 | var scroll = 0.0, velocity = 0.0, lastScroll = 0.0;
8 |
9 | // initialize REGL from a canvas element
10 | var regl = createREGL({
11 | canvas: canvas,
12 | onDone: function(error, regl) {
13 | if (error) { alert(error); }
14 | }
15 | });
16 |
17 | // Create a REGL draw command
18 | var draw = regl({
19 | frag: document.querySelector('#fragmentShader').textContent,
20 | vert: 'attribute vec2 position; void main() { gl_Position = vec4(3.0 * position, 0.0, 1.0); }',
21 | attributes: { position: [-1, 0, 0, -1, 1, 1] },
22 | count: 3,
23 | uniforms: {
24 | globaltime: regl.prop('globaltime'),
25 | resolution: regl.prop('resolution'),
26 | aspect: regl.prop('aspect'),
27 | scroll: regl.prop('scroll'),
28 | velocity: regl.prop('velocity')
29 | }
30 | });
31 |
32 | // Hook a callback to execute each frame
33 | regl.frame(function(ctx) {
34 | // Resize a canvas element with the aspect ratio (100vw, 100vh)
35 | var aspect = canvas.scrollWidth / canvas.scrollHeight;
36 | canvas.width = 512 * aspect;
37 | canvas.height = 512;
38 |
39 | // Scroll amount (0.0 to 1.0)
40 | scroll = window.pageYOffset / (document.documentElement.scrollHeight - window.innerHeight);
41 |
42 | // Scroll Velocity
43 | // Inertia example:
44 | // velocity = velocity * 0.99 + (scroll - lastScroll);
45 | // lastScroll = scroll;
46 |
47 | // Clear the draw buffer
48 | regl.clear({ color: [0, 0, 0, 0] });
49 |
50 | // Execute a REGL draw command
51 | draw({
52 | globaltime: ctx.time,
53 | resolution: [ctx.viewportWidth, ctx.viewportHeight],
54 | aspect: aspect,
55 | scroll: scroll,
56 | velocity: velocity
57 | });
58 | });
59 |
60 | setTimeout(function() { document.body.classList.remove('loading');}, 1000);
61 |
62 | }();
63 |
--------------------------------------------------------------------------------
/js/regl.min.js:
--------------------------------------------------------------------------------
1 | (function(da,ea){"object"===typeof exports&&"undefined"!==typeof module?module.exports=ea():"function"===typeof define&&define.amd?define(ea):da.createREGL=ea()})(this,function(){function da(a,b){this.id=vb++;this.type=a;this.data=b}function ea(a){if(0===a.length)return[];var b=a.charAt(0),c=a.charAt(a.length-1);if(1>>=b;c=(255>>=c;
8 | b|=c;c=(15>>=c;b|=c;c=(3>>c>>1}function fa(a){a:{for(var b=16;268435456>=b;b*=16)if(a<=b){a=b;break a}a=0}b=$a[Za(a)>>2];return 0>2].push(a)}function bb(a,b,c,d,f,k){for(var p=0;pg&&(g=d.buffer.byteLength,5123===t?g>>=1:5125===t&&(g>>=2));d.vertCount=
17 | g;g=e;0>e&&(g=4,e=d.buffer.dimension,1===e&&(g=0),2===e&&(g=1),3===e&&(g=4));d.primType=g}function p(a){d.elementsCount--;delete h[a.id];a.buffer.destroy();a.buffer=null}var h={},g=0,r={uint8:5121,uint16:5123};b.oes_element_index_uint&&(r.uint32=5125);f.prototype.bind=function(){this.buffer.bind()};var v=[];return{create:function(a,b){function g(a){if(a)if("number"===typeof a)e(a),n.primType=4,n.vertCount=a|0,n.type=5121;else{var b=null,c=35044,d=-1,f=-1,l=0,p=0;if(Array.isArray(a)||O(a)||ja(a))b=
18 | a;else if("data"in a&&(b=a.data),"usage"in a&&(c=hb[a.usage]),"primitive"in a&&(d=Ra[a.primitive]),"count"in a&&(f=a.count|0),"type"in a&&(p=r[a.type]),"length"in a)l=a.length|0;else if(l=f,5123===p||5122===p)l*=2;else if(5125===p||5124===p)l*=4;k(n,b,c,d,f,l,p)}else e(),n.primType=4,n.vertCount=0,n.type=5121;return g}var e=c.create(null,34963,!0),n=new f(e._buffer);d.elementsCount++;g(a);g._reglType="elements";g._elements=n;g.subdata=function(a,b){e.subdata(a,b);return g};g.destroy=function(){p(n)};
19 | return g},createStream:function(a){var b=v.pop();b||(b=new f(c.create(null,34963,!0,!1)._buffer));k(b,a,35040,-1,-1,0,0);return b},destroyStream:function(a){v.push(a)},getElements:function(a){return"function"===typeof a&&a._elements instanceof f?a._elements:null},clear:function(){H(h).forEach(p)}}}function ib(a){for(var b=x.allocType(5123,a.length),c=0;c>>
20 | 31<<15,k=(d<<1>>>24)-127,d=d>>13&1023;b[c]=-24>k?f:-14>k?f+(d+1024>>-14-k):15>=f,c.height>>=f,u(c,d[f]),a.mipmask|=1<b;++b)a.images[b]=null;return a}function gb(a){for(var b=
31 | a.images,c=0;cb){for(var c=0;c=--this.refCount&&z(this)}});p.profile&&(k.getTotalTextureSize=function(){var a=0;Object.keys(V).forEach(function(b){a+=
39 | V[b].stats.size});return a});return{create2D:function(b,c){function d(a,b){var c=f.texInfo;C.call(c);var e=B();"number"===typeof a?"number"===typeof b?w(e,a|0,b|0):w(e,a|0,a|0):a?(M(c,a),t(e,a)):w(e,1,1);c.genMipmaps&&(e.mipmask=(e.width<<1)-1);f.mipmask=e.mipmask;g(f,e);f.internalformat=e.internalformat;d.width=e.width;d.height=e.height;Q(f);Z(e,3553);P(c,3553);Aa();gb(e);p.profile&&(f.stats.size=Ia(f.internalformat,f.type,e.width,e.height,c.genMipmaps,!1));d.format=J[f.internalformat];d.type=W[f.type];
40 | d.mag=la[c.magFilter];d.min=ya[c.minFilter];d.wrapS=ha[c.wrapS];d.wrapT=ha[c.wrapT];return d}var f=new G(3553);V[f.id]=f;k.textureCount++;d(b,c);d.subimage=function(a,b,c,l){b|=0;c|=0;l|=0;var q=e();g(q,f);q.width=0;q.height=0;u(q,a);q.width=q.width||(f.width>>l)-b;q.height=q.height||(f.height>>l)-c;Q(f);m(q,3553,b,c,l);Aa();n(q);return d};d.resize=function(b,c){var e=b|0,g=c|0||e;if(e===f.width&&g===f.height)return d;d.width=f.width=e;d.height=f.height=g;Q(f);for(var q=0;f.mipmask>>q;++q)a.texImage2D(3553,
41 | q,f.format,e>>q,g>>q,0,f.format,f.type,null);Aa();p.profile&&(f.stats.size=Ia(f.internalformat,f.type,e,g,!1,!1));return d};d._reglType="texture2d";d._texture=f;p.profile&&(d.stats=f.stats);d.destroy=function(){f.decRef()};return d},createCube:function(b,c,d,f,l,sa){function z(a,b,c,e,d,f){var F,X=h.texInfo;C.call(X);for(F=0;6>F;++F)q[F]=B();if("number"===typeof a||!a)for(a=a|0||1,F=0;6>F;++F)w(q[F],a,a);else if("object"===typeof a)if(b)t(q[0],a),t(q[1],b),t(q[2],c),t(q[3],e),t(q[4],d),t(q[5],f);
42 | else if(M(X,a),r(h,a),"faces"in a)for(a=a.faces,F=0;6>F;++F)g(q[F],h),t(q[F],a[F]);else for(F=0;6>F;++F)t(q[F],a);g(h,q[0]);h.mipmask=X.genMipmaps?(q[0].width<<1)-1:q[0].mipmask;h.internalformat=q[0].internalformat;z.width=q[0].width;z.height=q[0].height;Q(h);for(F=0;6>F;++F)Z(q[F],34069+F);P(X,34067);Aa();p.profile&&(h.stats.size=Ia(h.internalformat,h.type,z.width,z.height,X.genMipmaps,!0));z.format=J[h.internalformat];z.type=W[h.type];z.mag=la[X.magFilter];z.min=ya[X.minFilter];z.wrapS=ha[X.wrapS];
43 | z.wrapT=ha[X.wrapT];for(F=0;6>F;++F)gb(q[F]);return z}var h=new G(34067);V[h.id]=h;k.cubeCount++;var q=Array(6);z(b,c,d,f,l,sa);z.subimage=function(a,b,c,q,d){c|=0;q|=0;d|=0;var f=e();g(f,h);f.width=0;f.height=0;u(f,b);f.width=f.width||(h.width>>d)-c;f.height=f.height||(h.height>>d)-q;Q(h);m(f,34069+a,c,q,d);Aa();n(f);return z};z.resize=function(b){b|=0;if(b!==h.width){z.width=h.width=b;z.height=h.height=b;Q(h);for(var c=0;6>c;++c)for(var q=0;h.mipmask>>q;++q)a.texImage2D(34069+c,q,h.format,b>>q,
44 | b>>q,0,h.format,h.type,null);Aa();p.profile&&(h.stats.size=Ia(h.internalformat,h.type,z.width,z.height,!1,!0));return z}};z._reglType="textureCube";z._texture=h;p.profile&&(z.stats=h.stats);z.destroy=function(){h.decRef()};return z},clear:function(){for(var b=0;bc;++c)if(0!==(b.mipmask&1<>c,b.height>>c,0,b.internalformat,b.type,null);else for(var e=0;6>e;++e)a.texImage2D(34069+e,c,b.internalformat,b.width>>c,b.height>>c,0,b.internalformat,b.type,null);P(b.texInfo,b.target)})}}}function Jb(a,b,c,d,f,k){function p(a,b,c){this.target=a;this.texture=b;this.renderbuffer=c;var e=a=0;b?(a=b.width,e=b.height):c&&(a=c.width,e=c.height);this.width=a;this.height=e}function h(a){a&&
46 | (a.texture&&a.texture._texture.decRef(),a.renderbuffer&&a.renderbuffer._renderbuffer.decRef())}function g(a,b,c){a&&(a.texture?a.texture._texture.refCount+=1:a.renderbuffer._renderbuffer.refCount+=1)}function r(b,c){c&&(c.texture?a.framebufferTexture2D(36160,b,c.target,c.texture._texture.texture,0):a.framebufferRenderbuffer(36160,b,36161,c.renderbuffer._renderbuffer.renderbuffer))}function v(a){var b=3553,c=null,e=null,g=a;"object"===typeof a&&(g=a.data,"target"in a&&(b=a.target|0));a=g._reglType;
47 | "texture2d"===a?c=g:"textureCube"===a?c=g:"renderbuffer"===a&&(e=g,b=36161);return new p(b,c,e)}function l(a,b,c,e,g){if(c)return a=d.create2D({width:a,height:b,format:e,type:g}),a._texture.refCount=0,new p(3553,a,null);a=f.create({width:a,height:b,format:e});a._renderbuffer.refCount=0;return new p(36161,null,a)}function u(a){return a&&(a.texture||a.renderbuffer)}function m(a,b,c){a&&(a.texture?a.texture.resize(b,c):a.renderbuffer&&a.renderbuffer.resize(b,c))}function e(){this.id=M++;P[this.id]=this;
48 | this.framebuffer=a.createFramebuffer();this.height=this.width=0;this.colorAttachments=[];this.depthStencilAttachment=this.stencilAttachment=this.depthAttachment=null}function n(a){a.colorAttachments.forEach(h);h(a.depthAttachment);h(a.stencilAttachment);h(a.depthStencilAttachment)}function D(b){a.deleteFramebuffer(b.framebuffer);b.framebuffer=null;k.framebufferCount--;delete P[b.id]}function w(b){var e;a.bindFramebuffer(36160,b.framebuffer);var g=b.colorAttachments;for(e=0;ee;++e){for(n=0;na;++a)c[a].resize(e);b.width=b.height=e;return b},_reglType:"framebufferCube",destroy:function(){c.forEach(function(a){a.destroy()})}})},clear:function(){H(P).forEach(D)},restore:function(){H(P).forEach(function(b){b.framebuffer=a.createFramebuffer();w(b)})}})}function pb(){this.w=
58 | this.z=this.y=this.x=this.state=0;this.buffer=null;this.size=0;this.normalized=!1;this.type=5126;this.divisor=this.stride=this.offset=0}function Kb(a,b,c,d,f){a=c.maxAttributes;b=Array(a);for(c=0;ca&&(a=b.stats.uniformsCount)});return a},c.getMaxAttributesCount=function(){var a=0;u.forEach(function(b){b.stats.attributesCount>a&&(a=b.stats.attributesCount)});return a});return{clear:function(){var b=a.deleteShader.bind(a);H(r).forEach(b);r={};H(v).forEach(b);v={};u.forEach(function(b){a.deleteProgram(b.program)});u.length=0;l={};c.shaderCount=0},program:function(a,b,f){var d=l[b];d||(d=l[b]={});var m=d[a];m||(m=new h(b,a),c.shaderCount++,g(m,f),d[a]=
62 | m,u.push(m));return m},restore:function(){r={};v={};for(var a=0;a="+b+"?"+d+".constant["+b+"]:0;"}).join(""),
90 | "}}else{","if(",q,"(",d,".buffer)){",h,"=",g,".createStream(",34962,",",d,".buffer);","}else{",h,"=",g,".getBuffer(",d,".buffer);","}",K,'="type" in ',d,"?",f.glTypes,"[",d,".type]:",h,".dtype;",y.normalized,"=!!",d,".normalized;");e("size");e("offset");e("stride");e("divisor");c("}}");c.exit("if(",y.isStream,"){",g,".destroyStream(",h,");","}");return y})});return g}function O(a){var b=a["static"],c=a.dynamic,e={};Object.keys(b).forEach(function(a){var c=b[a];e[a]=B(function(a,b){return"number"===
91 | typeof c||"boolean"===typeof c?""+c:a.link(c)})});Object.keys(c).forEach(function(a){var b=c[a];e[a]=N(b,function(a,c){return a.invoke(c,b)})});return e}function z(a,b,c,e,d){var f=A(a,d),g=x(a,f,d),l=M(a,d),h=P(a,d),k=C(a,d),m=g.viewport;m&&(h.viewport=m);m=n("scissor.box");(g=g[m])&&(h[m]=g);g=0>1)",u],");")}function b(){c(w,".drawArraysInstancedANGLE(",[p,r,t,u],");")}n?v?a():(c("if(",n,"){"),a(),c("}else{"),b(),c("}")):b()}function g(){function a(){c(l+".drawElements("+[p,t,W,r+"<<(("+W+"-5121)>>1)"]+");")}function b(){c(l+".drawArrays("+[p,r,t]+");")}n?v?a():(c("if(",n,"){"),a(),c("}else{"),b(),c("}")):
105 | b()}var h=a.shared,l=h.gl,k=h.draw,m=e.draw,n=function(){var d=m.elements,f=b;if(d){if(d.contextDep&&e.contextDynamic||d.propDep)f=c;d=d.append(a,f)}else d=f.def(k,".","elements");d&&f("if("+d+")"+l+".bindBuffer(34963,"+d+".buffer.buffer);");return d}(),p=d("primitive"),r=d("offset"),t=function(){var d=m.count,f=b;if(d){if(d.contextDep&&e.contextDynamic||d.propDep)f=c;d=d.append(a,f)}else d=f.def(k,".","count");return d}();if("number"===typeof t){if(0===t)return}else c("if(",t,"){"),c.exit("}");var u,
106 | w;ma&&(u=d("instances"),w=a.instancing);var W=n+".type",v=m.elements&&ta(m.elements);ma&&("number"!==typeof u||0<=u)?"string"===typeof u?(c("if(",u,">0){"),f(),c("}else if(",u,"<0){"),g(),c("}")):f():g()}function ba(a,b,c,e,d){b=t();d=b.proc("body",d);ma&&(b.instancing=d.def(b.shared.extensions,".angle_instanced_arrays"));a(b,d,c,e);return b.compile().body}function R(a,b,c,e){ua(a,b);S(a,b,c,e.attributes,function(){return!0});U(a,b,c,e.uniforms,function(){return!0});H(a,b,b,c)}function W(a,b){var c=
107 | a.proc("draw",1);ua(a,c);sa(a,c,b.context);I(a,c,b.framebuffer);T(a,c,b);L(a,c,b.state);E(a,c,b,!1,!0);var e=b.shader.progVar.append(a,c);c(a.shared.gl,".useProgram(",e,".program);");if(b.shader.program)R(a,c,b,b.shader.program);else{var d=a.global.def("{}"),f=c.def(e,".id"),g=c.def(d,"[",f,"]");c(a.cond(g).then(g,".call(this,a0);")["else"](g,"=",d,"[",f,"]=",a.link(function(c){return ba(R,a,b,c,1)}),"(",e,");",g,".call(this,a0);"))}0=--this.refCount&&p(this)};f.profile&&(d.getTotalRenderbufferSize=function(){var a=0;Object.keys(v).forEach(function(b){a+=v[b].stats.size});return a});return{create:function(b,c){function m(b,c){var d=0,l=0,k=32854;"object"===typeof b&&b?("shape"in b?(l=b.shape,d=l[0]|0,l=l[1]|0):("radius"in b&&(d=l=b.radius|0),"width"in b&&(d=b.width|0),"height"in b&&(l=b.height|0)),"format"in b&&(k=h[b.format])):
132 | "number"===typeof b?(d=b|0,l="number"===typeof c?c|0:d):b||(d=l=1);if(d!==e.width||l!==e.height||k!==e.format)return m.width=e.width=d,m.height=e.height=l,e.format=k,a.bindRenderbuffer(36161,e.renderbuffer),a.renderbufferStorage(36161,k,d,l),f.profile&&(e.stats.size=L[e.format]*e.width*e.height),m.format=g[e.format],m}var e=new k(a.createRenderbuffer());v[e.id]=e;d.renderbufferCount++;m(b,c);m.resize=function(b,c){var d=b|0,g=c|0||d;if(d===e.width&&g===e.height)return m;m.width=e.width=d;m.height=
133 | e.height=g;a.bindRenderbuffer(36161,e.renderbuffer);a.renderbufferStorage(36161,e.format,d,g);f.profile&&(e.stats.size=L[e.format]*e.width*e.height);return m};m._reglType="renderbuffer";m._renderbuffer=e;f.profile&&(m.stats=e.stats);m.destroy=function(){e.decRef()};return m},clear:function(){H(v).forEach(p)},restore:function(){H(v).forEach(function(b){b.renderbuffer=a.createRenderbuffer();a.bindRenderbuffer(36161,b.renderbuffer);a.renderbufferStorage(36161,b.format,b.width,b.height)});a.bindRenderbuffer(36161,
134 | null)}}},ob=[];ob[6408]=4;var Ma=[];Ma[5121]=1;Ma[5126]=4;Ma[36193]=2;var Da=["x","y","z","w"],Pb="blend.func blend.equation stencil.func stencil.opFront stencil.opBack sample.coverage viewport scissor.box polygonOffset.offset".split(" "),Ga={0:0,1:1,zero:0,one:1,"src color":768,"one minus src color":769,"src alpha":770,"one minus src alpha":771,"dst color":774,"one minus dst color":775,"dst alpha":772,"one minus dst alpha":773,"constant color":32769,"one minus constant color":32770,"constant alpha":32771,
135 | "one minus constant alpha":32772,"src alpha saturate":776},Ua={never:512,less:513,"<":513,equal:514,"=":514,"==":514,"===":514,lequal:515,"<=":515,greater:516,">":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519},Oa={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386},rb={cw:2304,ccw:2305},sb=new Y(!1,!1,!1,function(){}),Sb=function(a,b){function c(){this.endQueryIndex=this.startQueryIndex=-1;this.sum=0;this.stats=
136 | null}function d(a,b,d){var e=h.pop()||new c;e.startQueryIndex=a;e.endQueryIndex=b;e.sum=0;e.stats=d;g.push(e)}var f=b.ext_disjoint_timer_query;if(!f)return null;var k=[],p=[],h=[],g=[],r=[],v=[];return{beginQuery:function(a){var b=k.pop()||f.createQueryEXT();f.beginQueryEXT(35007,b);p.push(b);d(p.length-1,p.length,a)},endQuery:function(){f.endQueryEXT(35007)},pushScopeStats:d,update:function(){var a,b;a=p.length;if(0!==a){v.length=Math.max(v.length,a+1);r.length=Math.max(r.length,a+1);r[0]=0;var c=
137 | v[0]=0;for(b=a=0;b=E.length&&d()}var c=tb(E,a);E[c]=b}}}function r(){var a=O.viewport,b=O.scissor_box;a[0]=a[1]=b[0]=b[1]=0;M.viewportWidth=M.framebufferWidth=M.drawingBufferWidth=a[2]=b[2]=m.drawingBufferWidth;M.viewportHeight=M.framebufferHeight=M.drawingBufferHeight=a[3]=b[3]=m.drawingBufferHeight}function v(){M.tick+=1;M.time=u();r();T.procs.poll()}function l(){r();T.procs.refresh();x&&x.update()}function u(){return(ub()-C)/1E3}a=zb(a);if(!a)return null;var m=a.gl,e=m.getContextAttributes();
143 | m.isContextLost();var n=Ab(m,a);if(!n)return null;var D=wb(),w={bufferCount:0,elementsCount:0,framebufferCount:0,shaderCount:0,textureCount:0,cubeCount:0,renderbufferCount:0,maxTextureUnits:0},t=n.extensions,x=Sb(m,t),C=ub(),B=m.drawingBufferWidth,J=m.drawingBufferHeight,M={tick:0,time:0,viewportWidth:B,viewportHeight:J,framebufferWidth:B,framebufferHeight:J,drawingBufferWidth:B,drawingBufferHeight:J,pixelRatio:a.pixelRatio},P=Qb(m,t),G=Bb(m,w,a),Q=Cb(m,t,G,w),B=Kb(m,t,P,G,D),N=Lb(m,D,w,a),z=Fb(m,
144 | t,P,function(){T.procs.poll()},M,w,a),L=Rb(m,t,P,w,a),I=Jb(m,t,P,z,L,w),T=Ob(m,D,t,P,G,Q,z,I,{},B,N,{elements:null,primitive:4,count:-1,offset:0,instances:-1},M,x,a),D=Mb(m,I,T.procs.poll,M,e,t),O=T.next,H=m.canvas,E=[],S=[],U=[],R=[a.onDestroy],ba=null;H&&(H.addEventListener("webglcontextlost",f,!1),H.addEventListener("webglcontextrestored",k,!1));var Y=I.setFBO=p({framebuffer:ia.define.call(null,1,"framebuffer")});l();e=A(p,{clear:function(a){if("framebuffer"in a)if(a.framebuffer&&"framebufferCube"===
145 | a.framebuffer_reglType)for(var b=0;6>b;++b)Y(A({framebuffer:a.framebuffer.faces[b]},a),h);else Y(a,h);else h(null,a)},prop:ia.define.bind(null,1),context:ia.define.bind(null,2),"this":ia.define.bind(null,3),draw:p({}),buffer:function(a){return G.create(a,34962,!1,!1)},elements:function(a){return Q.create(a,!1)},texture:z.create2D,cube:z.createCube,renderbuffer:L.create,framebuffer:I.create,framebufferCube:I.createCube,attributes:e,frame:g,on:function(a,b){var c;switch(a){case "frame":return g(b);
146 | case "lost":c=S;break;case "restore":c=U;break;case "destroy":c=R}c.push(b);return{cancel:function(){for(var a=0;a