├── .gitignore
├── .npmignore
├── 1.html
├── 11.html
├── 13.html
├── 14.html
├── 15.html
├── 16.html
├── 17.html
├── 19.html
├── 2.html
├── 20.html
├── 21.html
├── 22.html
├── 23.html
├── 26.html
├── 27.html
├── 28.html
├── 29.html
├── 3.html
├── 30.html
├── 5.html
├── 6.html
├── 7.html
├── 8.html
├── 9.html
├── LICENSE.md
├── README.md
├── assets
├── 0.jpg
├── 1.jpg
├── 14-lut.png
├── 15-lut.png
├── 2.jpg
├── 3.jpg
├── KelsonSans.fnt
├── KelsonSans.png
├── apartment
│ ├── Apartment_Diffuse.hdr
│ ├── Apartment_Reflection.hdr
│ ├── Apartment_Spherical_HiRes.jpg
│ ├── Camels_Icon.jpg
│ └── apartment.ibl
├── audio.svg
├── bluejean.mp3
├── bluejean_short.mp3
├── burlap-normals.jpg
├── complete_hrtfs.json
├── cracks.jpg
├── dust.jpg
├── entypo-svg-paths.json
├── feather.svg
├── glass.jpg
├── grunge.jpg
├── grunge2.jpg
├── highroad.mp3
├── iphone.svg
├── metal-normals.jpg
├── metal2-normals.png
├── noise.png
├── paper.png
├── paper1-diffuse.jpg
├── play.svg
├── soul.mp3
├── soul_short.mp3
├── thumb-palettes.json
├── thumbs
│ ├── mattdesl-codevember-1.jpg
│ ├── mattdesl-codevember-10.jpg
│ ├── mattdesl-codevember-11.jpg
│ ├── mattdesl-codevember-12.jpg
│ ├── mattdesl-codevember-13.jpg
│ ├── mattdesl-codevember-14.jpg
│ ├── mattdesl-codevember-15.jpg
│ ├── mattdesl-codevember-16.jpg
│ ├── mattdesl-codevember-17.jpg
│ ├── mattdesl-codevember-18.jpg
│ ├── mattdesl-codevember-19.jpg
│ ├── mattdesl-codevember-2.jpg
│ ├── mattdesl-codevember-20.jpg
│ ├── mattdesl-codevember-21.jpg
│ ├── mattdesl-codevember-22.jpg
│ ├── mattdesl-codevember-23.jpg
│ ├── mattdesl-codevember-24.jpg
│ ├── mattdesl-codevember-25.jpg
│ ├── mattdesl-codevember-26.jpg
│ ├── mattdesl-codevember-27.jpg
│ ├── mattdesl-codevember-28.jpg
│ ├── mattdesl-codevember-29.jpg
│ ├── mattdesl-codevember-3.jpg
│ ├── mattdesl-codevember-30.jpg
│ ├── mattdesl-codevember-4.jpg
│ ├── mattdesl-codevember-5.jpg
│ ├── mattdesl-codevember-6.jpg
│ ├── mattdesl-codevember-7.jpg
│ ├── mattdesl-codevember-8.jpg
│ └── mattdesl-codevember-9.jpg
└── vu.png
├── build.js
├── config.js
├── dev.js
├── ideas
└── redux.md
├── index.html
├── package.json
├── src
├── 1.js
├── 11.js
├── 13.js
├── 14.js
├── 15.js
├── 16.js
├── 17.js
├── 19.js
├── 2.js
├── 20.js
├── 21.js
├── 22.js
├── 23.js
├── 26.js
├── 27.js
├── 28.js
├── 29.js
├── 3.js
├── 30.js
├── 5.js
├── 6.js
├── 7.js
├── 8.js
├── 9.js
├── audio-util.js
├── desktop-only.js
├── fatal-error.js
├── geom-test.js
├── gl
│ ├── 30-scene.js
│ ├── DeviceOrientationControls.js
│ ├── FontUtils.js
│ ├── ShapeUtils.js
│ ├── TextGeometry.js
│ ├── ThreeLine25D.js
│ ├── gl-line-3d.js
│ ├── helvetiker.typeface.js
│ ├── motion.js
│ ├── optimer_regular.typeface.js
│ ├── texel-coord-solid-angle.js
│ ├── three-face-centroid.js
│ ├── three-hdr-texture.js
│ ├── three-skybox.js
│ ├── three-streetview-app.js
│ ├── three-vignette-background.js
│ ├── unindex-geometry.js
│ ├── xyz-pixels-to-rgb.js
│ └── xyz-pixels-to-rgbm.js
├── grid
│ ├── calendar-grid.js
│ ├── content.js
│ ├── grid-item.hbs
│ ├── image-urls.js
│ ├── index.js
│ ├── main.css
│ ├── palette.js
│ └── sort-files.js
├── is-low-end.js
├── is-mobile.js
├── old-10.js
├── shaders
│ ├── 14-post.frag
│ ├── 14-post.js
│ ├── 14-post.vert
│ ├── 14.frag
│ ├── 14.vert
│ ├── 15-post.frag
│ ├── 15-post.js
│ ├── 15.frag
│ ├── 15.vert
│ ├── 17.frag
│ ├── 17.vert
│ ├── 21-line.frag
│ ├── 21-line.vert
│ ├── 23.frag
│ ├── 23.vert
│ ├── 27.frag
│ ├── 27.vert
│ ├── 28.frag
│ ├── 28.vert
│ ├── 29.frag
│ ├── 29.vert
│ ├── 3.frag
│ ├── 3.vert
│ ├── 5.frag
│ ├── 5.vert
│ ├── cube-to-uv.glsl
│ ├── envmap-equirect.glsl
│ ├── prefilter-cube.glsl
│ ├── rgbm-decode.glsl
│ ├── rgbm-encode.glsl
│ ├── rotation-zyx.glsl
│ ├── sdf.js
│ ├── sky.frag
│ ├── sky.js
│ ├── src-over.glsl
│ ├── texture-query-lod.glsl
│ ├── tonemap-filmic.glsl
│ ├── tonemap-reinhard.glsl
│ └── tonemap-uncharted2.glsl
├── simplicial-with-uv.js
├── three-orbit-app.js
└── util
│ ├── acorn-types.js
│ ├── audio-demo-2d.js
│ ├── boids-3d.js
│ ├── punch-card.js
│ └── raven.txt
└── static
├── 1.js
├── 10.js
├── 11.js
├── 13.js
├── 14.js
├── 15.js
├── 16.js
├── 17.js
├── 19.js
├── 2.js
├── 20.js
├── 21.js
├── 22.js
├── 23.js
├── 26.js
├── 27.js
├── 28.js
├── 29.js
├── 3.js
├── 30.js
├── 5.js
├── 6.js
├── 7.js
├── 8.js
├── 9.js
├── grid.js
└── loader.css
/.gitignore:
--------------------------------------------------------------------------------
1 | bower_components
2 | node_modules
3 | *.log
4 | .DS_Store
5 | bundle.js
6 | assets/mesh
7 | ideas/*.md
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | bower_components
2 | node_modules
3 | *.log
4 | .DS_Store
5 | bundle.js
6 | test
7 | test.js
8 | demo/
9 | .npmignore
10 | LICENSE.md
--------------------------------------------------------------------------------
/1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 1 - @mattdesl
7 |
15 |
16 |
67 |
68 |
69 |
70 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/11.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 11 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/13.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 13 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/14.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 14 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/15.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 15 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/16.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 16 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/17.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 17 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/19.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 19 - @mattdesl
7 |
45 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 2 - @mattdesl
7 |
15 |
16 |
38 |
39 |
40 |
41 |
42 |
codevember/2
43 |
drag for action
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/20.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 20 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/21.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 21 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/22.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 22 - @mattdesl
7 |
8 |
47 |
55 |
56 |
57 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/23.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 23 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/26.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 26 - @mattdesl
7 |
8 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/27.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 27 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/28.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 28 - @mattdesl
7 |
8 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/29.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 29 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/3.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 3 - @mattdesl
7 |
15 |
39 |
40 |
41 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/30.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 30 - @mattdesl
7 |
15 |
16 |
17 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/5.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 5 - @mattdesl
7 |
15 |
16 |
30 |
31 |
32 | click to change displacement
33 | mouse / touch to move image
34 |
35 |
36 |
--------------------------------------------------------------------------------
/6.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 6 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/7.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 7 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/8.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 8 - @mattdesl
7 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/9.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember - 9 - @mattdesl
7 |
15 |
16 |
37 |
38 |
39 | click anywhere
40 |
41 |
42 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 | Copyright (c) 2015 Matt DesLauriers
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in all
12 | copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
20 | OR OTHER DEALINGS IN THE SOFTWARE.
21 |
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # codevember
2 |
3 | [](http://github.com/badges/stability-badges)
4 |
5 | Desktop recommended for all demos. Some are mobile-friendly.
6 |
7 | See here for the full grid and basic descriptions:
8 |
9 | http://mattdesl.github.io/codevember/
10 |
11 | 
12 |
13 | ## Running
14 |
15 | Clone this repo, then:
16 |
17 | ```sh
18 | npm install
19 |
20 | # start day 1 demo
21 | npm start 1
22 |
23 | # start day 5 and launch browser
24 | npm start -- 1 --open
25 | ```
26 |
27 | You can `npm run start -- 5 --open` to launch day 5 and open the browser to [http://localhost:9966/](http://localhost:9966/).
28 |
29 | To build all demos:
30 |
31 | ```sh
32 | npm run build
33 | ```
34 |
35 | To build one demo:
36 |
37 | ```sh
38 | node build.js 2
39 | ```
40 |
41 | To run main grid:
42 |
43 | ```sh
44 | npm start
45 | ```
46 |
47 | ## License
48 |
49 | MIT, see [LICENSE.md](http://github.com/mattdesl/codevember/blob/master/LICENSE.md) for details.
50 |
--------------------------------------------------------------------------------
/assets/0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/0.jpg
--------------------------------------------------------------------------------
/assets/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/1.jpg
--------------------------------------------------------------------------------
/assets/14-lut.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/14-lut.png
--------------------------------------------------------------------------------
/assets/15-lut.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/15-lut.png
--------------------------------------------------------------------------------
/assets/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/2.jpg
--------------------------------------------------------------------------------
/assets/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/3.jpg
--------------------------------------------------------------------------------
/assets/KelsonSans.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/KelsonSans.png
--------------------------------------------------------------------------------
/assets/apartment/Apartment_Diffuse.hdr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/apartment/Apartment_Diffuse.hdr
--------------------------------------------------------------------------------
/assets/apartment/Apartment_Reflection.hdr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/apartment/Apartment_Reflection.hdr
--------------------------------------------------------------------------------
/assets/apartment/Apartment_Spherical_HiRes.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/apartment/Apartment_Spherical_HiRes.jpg
--------------------------------------------------------------------------------
/assets/apartment/Camels_Icon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/apartment/Camels_Icon.jpg
--------------------------------------------------------------------------------
/assets/apartment/apartment.ibl:
--------------------------------------------------------------------------------
1 | [Header]
2 | ; some general information for preview purpose
3 | ; Icons must be 128 by 128 pixels
4 | ICOfile = "Camels_Icon.jpg"
5 | Name = "Apartment"
6 | Author = "Blochi"
7 | Location = "Hollywood"
8 | Comment = "Inside Scene, works best for objects on table."
9 | GEOlat = 34.102992275554215
10 | GEOlong = -118.34119141101837
11 | Link = "http://www.hdrlabs.com/sibl/archive.html"
12 | Date = "2003:03:02"
13 | Time = "10:56:00"
14 | Height = 0.2
15 | North = 0.5
16 |
17 | [Background]
18 | ; The Bgfile.. normally a hires LDRimage
19 | BGfile = "Apartment_Spherical_HiRes.jpg"
20 | BGmap = 1
21 | BGu = 0
22 | BGv = 0
23 | BGheight = 1024
24 |
25 | [Enviroment]
26 | ; The Enviromentfile LowRes HDRI with Diffuse Blur
27 | EVfile = "Apartment_Diffuse.hdr"
28 | EVmap = 1
29 | EVu = 0
30 | EVv = 0
31 | EVheight = 128
32 | EVmulti = 1
33 | EVgamma = 1
34 |
35 | [Reflection]
36 | ; The ReflectionMap is a crisp MedRes HDRI
37 | REFfile = "Apartment_Reflection.hdr"
38 | REFmap = 1
39 | REFu = 0
40 | REFv = 0
41 | REFheight = 256
42 | REFmulti = 1
43 | REFgamma = 1
44 |
45 | [Sun]
46 | ; Additional keylight ..ha!
47 | SUNcolor = 240,250,255
48 | SUNmulti = 1.1
49 | SUNu = 0.625
50 | SUNv = 0.3906
51 |
52 |
--------------------------------------------------------------------------------
/assets/audio.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
57 |
--------------------------------------------------------------------------------
/assets/bluejean.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/bluejean.mp3
--------------------------------------------------------------------------------
/assets/bluejean_short.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/bluejean_short.mp3
--------------------------------------------------------------------------------
/assets/burlap-normals.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/burlap-normals.jpg
--------------------------------------------------------------------------------
/assets/cracks.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/cracks.jpg
--------------------------------------------------------------------------------
/assets/dust.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/dust.jpg
--------------------------------------------------------------------------------
/assets/feather.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
--------------------------------------------------------------------------------
/assets/glass.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/glass.jpg
--------------------------------------------------------------------------------
/assets/grunge.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/grunge.jpg
--------------------------------------------------------------------------------
/assets/grunge2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/grunge2.jpg
--------------------------------------------------------------------------------
/assets/highroad.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/highroad.mp3
--------------------------------------------------------------------------------
/assets/iphone.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
73 |
--------------------------------------------------------------------------------
/assets/metal-normals.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/metal-normals.jpg
--------------------------------------------------------------------------------
/assets/metal2-normals.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/metal2-normals.png
--------------------------------------------------------------------------------
/assets/noise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/noise.png
--------------------------------------------------------------------------------
/assets/paper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/paper.png
--------------------------------------------------------------------------------
/assets/paper1-diffuse.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/paper1-diffuse.jpg
--------------------------------------------------------------------------------
/assets/play.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
--------------------------------------------------------------------------------
/assets/soul.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/soul.mp3
--------------------------------------------------------------------------------
/assets/soul_short.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/soul_short.mp3
--------------------------------------------------------------------------------
/assets/thumb-palettes.json:
--------------------------------------------------------------------------------
1 | [[[227,105,113],[249,234,235],[230,118,160]],[[225,224,224],[89,33,36],[122,69,72]],[[246,248,250],[79,115,160],[175,77,174]],[[61,62,72],[246,245,246],[140,164,178]],[[247,247,247],[63,51,51],[137,94,81]],[[4,4,4],[219,219,219],[124,124,124]],[[52,171,235],[209,237,248],[127,203,240]],[[219,124,44],[246,229,208],[227,167,117]],[[240,240,240],[91,91,91],[124,124,124]],[[63,65,74],[246,247,247],[129,175,175]],[[69,57,50],[202,168,136],[146,159,146]],[[49,51,58],[215,209,206],[124,168,183]],[[226,224,215],[64,184,133],[211,127,64]],[[41,28,35],[134,64,172],[87,45,103]],[[40,39,41],[163,149,140],[129,121,124]],[[251,251,251],[28,28,28],[192,51,50]],[[60,12,60],[141,65,112],[120,73,108]],[[242,242,242],[29,29,29],[124,124,124]],[[42,56,59],[191,195,192],[118,138,170]],[[230,228,226],[47,45,44],[116,108,108]],[[226,224,227],[208,113,204],[107,164,222]],[[250,250,249],[203,177,114],[79,79,70]],[[240,240,240],[62,62,62],[124,124,124]],[[251,251,251],[4,4,4],[124,124,124]],[[58,61,73],[218,213,218],[84,188,197]],[[171,170,172],[76,70,60],[97,87,76]],[[215,97,36],[248,241,234],[129,40,17]],[[212,215,217],[78,74,57],[129,127,89]],[[92,118,135],[209,216,219],[169,189,203]],[[239,240,241],[21,21,21],[116,116,116]]]
2 |
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-1.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-10.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-11.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-12.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-13.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-14.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-15.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-16.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-17.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-18.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-18.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-19.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-19.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-2.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-20.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-20.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-21.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-21.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-22.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-22.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-23.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-23.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-24.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-24.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-25.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-25.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-26.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-26.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-27.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-27.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-28.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-28.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-29.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-29.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-3.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-30.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-30.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-4.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-5.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-6.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-7.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-8.jpg
--------------------------------------------------------------------------------
/assets/thumbs/mattdesl-codevember-9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/thumbs/mattdesl-codevember-9.jpg
--------------------------------------------------------------------------------
/assets/vu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mattdesl/codevember/b6ab14ec3cb827b9a95bd44107a09d4169d3ddd5/assets/vu.png
--------------------------------------------------------------------------------
/build.js:
--------------------------------------------------------------------------------
1 | global.Promise = require('pinkie-promise')
2 | const argv = require('minimist')(process.argv.slice(2))
3 | const browserify = require('browserify')
4 | const fs = require('fs')
5 | const path = require('path')
6 | const UglifyJS = require('uglify-js')
7 |
8 | var files = fs.readdirSync(path.resolve(__dirname, 'src'))
9 | files = files.filter(function (f) {
10 | return /^\d+\.js$/.test(f)
11 | })
12 |
13 | const transformConfig = require('./config')
14 |
15 | var entry = argv._[0]
16 | if (typeof entry === 'number') {
17 | entry = String(entry)
18 | } else if (!entry) {
19 | entry = 'grid'
20 | }
21 |
22 | var isGrid = entry === 'grid'
23 |
24 | if (entry && isGrid) {
25 | files = [ path.join('grid', 'index.js') ]
26 | } else if (entry) {
27 | files = files.filter(function (f) {
28 | return path.basename(f, '.js') === entry
29 | })
30 | }
31 |
32 | Promise.all(files.map(runBuild)).catch(function (err) {
33 | console.error(err)
34 | }).then(function () {
35 | console.log("Finished")
36 | })
37 |
38 | function runBuild (f) {
39 | return new Promise(function (resolve, reject) {
40 | console.log('Bundling', f)
41 | var b = browserify('src/' + f, {
42 | debug: false,
43 | noparse: [ 'three' ]
44 | })
45 | b.transform(require('babelify').configure({ presets: 'es2015' }))
46 | b.plugin(require('bundle-collapser/plugin'))
47 | var base = isGrid ? 'grid' : path.basename(f, '.js')
48 | if (isGrid) f = 'grid.js'
49 | var transforms = (transformConfig[base] || [])
50 | transforms.forEach(function (t) {
51 | b.transform(t)
52 | })
53 | b.bundle(function (err, src) {
54 | if (err) return reject(err)
55 | console.log('Compressing', f)
56 | var result = UglifyJS.minify(src.toString(), { fromString: true })
57 | console.log('Writing', f)
58 | fs.writeFile('static/' + f, result.code, function (err) {
59 | if (err) return reject(err)
60 | resolve()
61 | })
62 | })
63 | })
64 | }
65 |
--------------------------------------------------------------------------------
/config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | '3': ['glslify'],
3 | '5': ['glslify'],
4 | '11': ['glslify'],
5 | '14': ['glslify'],
6 | '15': ['glslify'],
7 | '17': ['glslify'],
8 | '19': ['brfs'],
9 | '21': ['glslify'],
10 | '23': ['brfs', 'glslify'],
11 | '26': ['glslify'],
12 | '27': ['glslify'],
13 | '28': ['glslify'],
14 | '29': ['glslify'],
15 | '30': ['glslify'],
16 | 'grid': ['hbsfy', 'brfs']
17 | }
18 |
--------------------------------------------------------------------------------
/dev.js:
--------------------------------------------------------------------------------
1 | const budo = require('budo')
2 | const argv = require('minimist')(process.argv.slice(2))
3 | const path = require('path')
4 | const babelify = require('babelify')
5 | const open = require('opn')
6 | const fs = require('fs')
7 | const simpleHtml = require('simple-html-index')
8 |
9 | var entry = argv._[0]
10 | if (!entry) {
11 | entry = 'grid'
12 | }
13 |
14 | const transforms = require('./config')
15 |
16 | const entryFilename = entry === 'grid'
17 | ? path.join(entry, 'index.js')
18 | : (entry + '.js')
19 |
20 | const entryFile = path.resolve(__dirname, 'src', entryFilename)
21 | budo(entryFile, {
22 | serve: 'static/' + entry + '.js',
23 | live: true,
24 | verbose: true,
25 | dir: __dirname,
26 | stream: process.stdout,
27 | forceDefaultIndex: true,
28 | defaultIndex: function (opt) {
29 | var html = entry === 'grid' ? 'index.html' : entry + '.html'
30 | if (!fs.existsSync(html)) return simpleHtml(opt)
31 | return fs.createReadStream(html)
32 | },
33 | browserify: {
34 | debug: false,
35 | transform: [
36 | babelify.configure({ presets: ['es2015'] }),
37 | [ 'installify', { save: true } ]
38 | ].concat(transforms[entry] || [])
39 | }
40 | }).on('connect', function (ev) {
41 | if (argv.open) open(ev.uri)
42 | })
43 |
--------------------------------------------------------------------------------
/ideas/redux.md:
--------------------------------------------------------------------------------
1 | explore how redux could be used in WebGL/Canvas apps
2 |
3 | e.g. A painting app
4 |
5 | Triggers for Undo/Redo:
6 | - brush stroke
7 | -
8 |
9 | Actions w/o Undo/Redo:
10 | - hand/zoom tool
11 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | codevember
7 |
8 |
9 |
17 |
18 |
19 |
20 |
21 |
22 |
one creative demo per day for the month of November, 2015
23 |
(desktop recommended)
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/1.js:
--------------------------------------------------------------------------------
1 | const canvas = document.querySelector('canvas')
2 | const ctx = canvas.getContext('2d')
3 |
4 | const app = require('canvas-loop')(ctx.canvas, {
5 | scale: Math.min(2, window.devicePixelRatio),
6 | parent: () => [ window.innerWidth, window.innerHeight ]
7 | }).start()
8 |
9 | const loadSvg = require('load-svg')
10 | const extractSvg = require('extract-svg-path').parse
11 |
12 | const svgMesh = require('svg-mesh-3d')
13 | const drawTriangles = require('draw-triangles-2d')
14 | const createPoint = require('verlet-point')
15 | const createConstraint = require('verlet-constraint')
16 | const reindex = require('mesh-reindex')
17 | const unindex = require('unindex-mesh')
18 | const random = require('random-float')
19 | const array = require('new-array')
20 |
21 | const lowEnd = require('./is-low-end')()
22 |
23 | const randomVector = (scale = 1) => {
24 | return array(3).map(() => random(-scale, scale))
25 | }
26 |
27 | const world = require('verlet-system')({
28 | gravity: [0, 0],
29 | min: [null, 0],
30 | max: [null, 0]
31 | })
32 |
33 | loadSvg('assets/feather.svg', (err, svg) => {
34 | if (err) return alert(err.message)
35 | start(extractSvg(svg))
36 | })
37 |
38 | function start (icon) {
39 | let mesh = svgMesh(icon, {
40 | randomization: lowEnd ? 100 : 500,
41 | simplify: 0.01,
42 | scale: 10
43 | })
44 |
45 | mesh = reindex(unindex(mesh.positions, mesh.cells))
46 |
47 | mesh.positions = mesh.positions.map(x => {
48 | const size = 125
49 | return [
50 | x[0] * size + window.innerWidth / 2,
51 | -x[1] * size + window.innerHeight / 2 ]
52 | })
53 |
54 | world.points = mesh.positions.map(pos => {
55 | return createPoint({ position: pos })
56 | })
57 |
58 | const constraints = mesh.cells.map(cell => {
59 | const points = cell.map(i => world.points[i])
60 |
61 | // adjust mass
62 | points.forEach(pt => {
63 | pt.mass = random(0.65, 1.0)
64 | })
65 |
66 | const opt = { stiffness: 1 }
67 | const tri = [
68 | createConstraint([ points[0], points[1]], opt),
69 | createConstraint([ points[1], points[2]], opt),
70 | createConstraint([ points[2], points[0]], opt)
71 | ]
72 | return tri
73 | }).reduce((a, b) => a.concat(b), [])
74 |
75 | const onClick = (ev) => {
76 | ev.preventDefault()
77 | world.gravity = [0, 600]
78 | world.points.forEach(point => {
79 | point.addForce(randomVector(5))
80 | })
81 | }
82 |
83 | canvas.addEventListener('click', onClick)
84 | canvas.addEventListener('touchstart', onClick)
85 |
86 | app.on('tick', (dt) => {
87 | dt = Math.min(dt, 30)
88 |
89 | const [width, height] = app.shape
90 | ctx.save()
91 | ctx.scale(app.scale, app.scale)
92 | ctx.clearRect(0, 0, width, height)
93 |
94 | const grad = ctx.createLinearGradient(-width * 0.5, 0, width * 1.5, 0)
95 | grad.addColorStop(0, '#e356c0')
96 | grad.addColorStop(1, '#e77b23')
97 | ctx.fillStyle = grad
98 | ctx.fillRect(0, 0, width, height)
99 |
100 | ctx.beginPath()
101 | world.max[1] = height
102 | constraints.forEach(c => c.solve())
103 | world.integrate(world.points, dt / 1000)
104 |
105 | const positions = world.points.map(x => x.position)
106 | drawTriangles(ctx, positions, mesh.cells)
107 | ctx.fillStyle = '#fff'
108 | ctx.fill()
109 | ctx.restore()
110 | })
111 | }
112 |
--------------------------------------------------------------------------------
/src/14.js:
--------------------------------------------------------------------------------
1 | global.THREE = require('three')
2 | import createView from './three-orbit-app'
3 | import createErrorPage from './fatal-error'
4 | import isMobile from './is-mobile'
5 | import injectDefines from 'glsl-inject-defines'
6 |
7 | const error = createErrorPage()
8 | const mobile = isMobile()
9 | const glslify = require('glslify')
10 | const EffectComposer = require('three-effectcomposer')(THREE)
11 | const fxaa = require('three-shader-fxaa')(THREE)
12 | const PostShader = require('./shaders/14-post')
13 |
14 | const app = createView({
15 | distance: 7,
16 | scale: mobile ? 1 : undefined,
17 | position: [0, 0, 4],
18 | antialias: false,
19 | alpha: false
20 | })
21 |
22 | app.renderer.setClearColor(mobile ? 0x252525 : 0x121212, 1)
23 |
24 | const geometries = [
25 | new THREE.TorusKnotGeometry(1, 0.85, 4, 5, 5, 24),
26 | new THREE.TorusKnotGeometry(1, 0.5, 64, 32, 6, 24),
27 | new THREE.TorusKnotGeometry(1, 0.85, 24, 5, 16, 24),
28 | new THREE.TorusKnotGeometry(1, 0.5, 64, 32, 14, 24),
29 | new THREE.TorusKnotGeometry(1, 0.4, 64, 20, 4, 24),
30 | new THREE.TorusKnotGeometry(1, 0.2, 50, 14, 3, 24)
31 | ]
32 |
33 | let ptr = mobile ? 1 : 0
34 | const fragShader = glslify(__dirname + '/shaders/14.frag')
35 | const defines = {}
36 | if (!mobile) defines.DESKTOP = true
37 |
38 | const mat = new THREE.RawShaderMaterial({
39 | color: 0xffffff,
40 | transparent: true,
41 | side: THREE.DoubleSide,
42 | uniforms: {
43 | color: { type: 'c', value: new THREE.Color() },
44 | opacity: { type: 'f', value: 1 },
45 | mode: { type: 'i', value: 0 },
46 | iGlobalTime: { type: 'f', value: 0 }
47 | },
48 | fragmentShader: injectDefines(fragShader, defines),
49 | vertexShader: glslify(__dirname + '/shaders/14.vert')
50 | })
51 |
52 | const meshes = geometries.map(x => new THREE.Mesh(x, mat))
53 | meshes.forEach((mesh, i) => {
54 | mesh.visible = i === ptr
55 | app.scene.add(mesh)
56 | })
57 |
58 | app.canvas.addEventListener('click', onClick)
59 | app.canvas.addEventListener('touchstart', onClick)
60 |
61 | function onClick (ev) {
62 | ev.preventDefault()
63 | meshes[ptr].visible = false
64 | ptr = (ptr + 1) % meshes.length
65 | meshes[ptr].visible = true
66 | mat.uniforms.mode.value = Math.round(Math.random())
67 | }
68 |
69 | let effects = []
70 | let time = 0
71 |
72 | if (!mobile) {
73 | setupPost()
74 | }
75 |
76 | app.on('tick', (dt) => {
77 | time += dt / 1000
78 | mat.uniforms.iGlobalTime.value = time
79 |
80 | effects.forEach(effect => {
81 | if (effect.uniforms.resolution) effect.uniforms.resolution.value.set(app.shape[0], app.shape[1])
82 | if (effect.uniforms.iGlobalTime) effect.uniforms.iGlobalTime.value = time
83 | })
84 | })
85 |
86 | function setupPost () {
87 | app.stop()
88 |
89 | const composer = new EffectComposer(app.renderer)
90 | app.composer = composer
91 |
92 | composer.addPass(new EffectComposer.RenderPass(app.scene, app.camera))
93 |
94 | const fxaaPass = new EffectComposer.ShaderPass(fxaa())
95 | effects.push(fxaaPass)
96 | composer.addPass(fxaaPass)
97 |
98 | const post = new EffectComposer.ShaderPass(PostShader)
99 | effects.push(post)
100 | post.renderToScreen = true
101 | composer.addPass(post)
102 |
103 | THREE.ImageUtils.loadTexture('assets/14-lut.png', undefined, (tex) => {
104 | tex.minFilter = tex.magFilter = THREE.LinearFilter
105 | effects.forEach(effect => {
106 | if (effect.uniforms.tLookup) {
107 | effect.uniforms.tLookup.value = tex
108 | }
109 | })
110 | app.start()
111 | }, error)
112 |
113 | }
114 |
--------------------------------------------------------------------------------
/src/15.js:
--------------------------------------------------------------------------------
1 | global.THREE = require('three')
2 | import createView from './three-orbit-app'
3 | import desktopOnly from './desktop-only'
4 | import isMobile from './is-mobile'
5 | import unindex from 'unindex-mesh'
6 | import reindex from 'mesh-reindex'
7 | import quantize from 'quantize-vertices'
8 | import rescale from 'rescale-vertices'
9 | import getBounds from 'vertices-bounding-box'
10 | import randomSphere from 'gl-vec3/random'
11 | import parallel from 'run-parallel'
12 | import meshData from 'snowden/lo'
13 |
14 | const createComplex = require('three-simplicial-complex')(THREE)
15 | const error = require('./fatal-error')()
16 | const glslify = require('glslify')
17 | const EffectComposer = require('three-effectcomposer')(THREE)
18 | const PostShader = require('./shaders/15-post')
19 |
20 | if (isMobile()) {
21 | desktopOnly()
22 | // const element = error(`
23 | // This demo may not perform well on mobile. Click
24 | // to continue.
25 | //
`)
26 | // const cont = document.querySelector('.continue')
27 | // console.log(element)
28 |
29 | // // cont.addEventListener('click', (ev) => {
30 | // // // element.parentNode.removeChild(element)
31 | // // // load()
32 | // // })
33 | } else {
34 | load()
35 | }
36 |
37 | function load () {
38 | parallel([
39 | next => loadTexture('assets/15-lut.png', next),
40 | next => loadTexture('assets/dust.jpg', next)
41 | ], (err, [ lut, dust ]) => {
42 | if (err) {
43 | return error(err)
44 | }
45 | start3D(meshData, lut, dust)
46 | })
47 | }
48 |
49 | function start3D (meshData, lookup, dust) {
50 | let effects = []
51 | let time = 0
52 |
53 | const app = createView({
54 | distance: 7,
55 | antialias: false,
56 | scale: 1,
57 | distanceBounds: [1, 9],
58 | position: [0, 0, 4]
59 | })
60 |
61 | app.renderer.setClearColor('#181818', 1)
62 |
63 | let complex = reindex(unindex(meshData.positions, meshData.cells))
64 | const bbox = getBounds(complex.positions)
65 | complex.positions = quantize(complex.positions, 5)
66 | complex.positions = rescale(complex.positions, bbox)
67 | const geom = createComplex(complex)
68 |
69 | const attribs = []
70 | complex.cells.forEach(() => {
71 | const dir = new THREE.Vector3().fromArray(randomSphere([]))
72 | attribs.push(dir, dir, dir)
73 | })
74 |
75 | const mat = new THREE.RawShaderMaterial({
76 | transparent: true,
77 | side: THREE.DoubleSide,
78 | attributes: {
79 | direction: { type: 'v3', value: attribs }
80 | },
81 | uniforms: {
82 | mouse: { type: 'v3', value: new THREE.Vector3() },
83 | color: { type: 'c', value: new THREE.Color() },
84 | opacity: { type: 'f', value: 0.01 },
85 | mode: { type: 'i', value: 0 },
86 | iGlobalTime: { type: 'f', value: 0 }
87 | },
88 | depthTest: false,
89 | depthWrite: false,
90 | wireframe: true,
91 | blending: THREE.AdditiveBlending,
92 | fragmentShader: glslify(__dirname + '/shaders/15.frag'),
93 | vertexShader: glslify(__dirname + '/shaders/15.vert')
94 | })
95 |
96 | const mesh = new THREE.Mesh(geom, mat)
97 | app.scene.add(mesh)
98 | mesh.position.y = 0.25
99 | mesh.scale.multiplyScalar(0.35)
100 |
101 | setupPost()
102 | app.on('tick', (dt) => {
103 | time += dt / 1000
104 | mat.uniforms.iGlobalTime.value = time
105 | effects.forEach(effect => {
106 | if (effect.uniforms.resolution) effect.uniforms.resolution.value.set(app.shape[0], app.shape[1])
107 | if (effect.uniforms.iGlobalTime) effect.uniforms.iGlobalTime.value = time
108 | if (effect.uniforms.theta) effect.uniforms.theta.value = app.controls.theta
109 | })
110 | })
111 |
112 | function setupPost () {
113 | const composer = new EffectComposer(app.renderer)
114 | app.composer = composer
115 |
116 | composer.addPass(new EffectComposer.RenderPass(app.scene, app.camera))
117 |
118 | const post = new EffectComposer.ShaderPass(PostShader)
119 | effects.push(post)
120 | post.renderToScreen = true
121 | composer.addPass(post)
122 |
123 | effects.forEach(effect => {
124 | if (effect.uniforms.tLookup) effect.uniforms.tLookup.value = lookup
125 | if (effect.uniforms.tDust) effect.uniforms.tDust.value = dust
126 | if (effect.uniforms.dustResolution) {
127 | effect.uniforms.dustResolution.value.set(dust.image.width, dust.image.height)
128 | }
129 | })
130 | }
131 | }
132 |
133 | function loadTexture (path, cb) {
134 | cb = cb || noop
135 | THREE.ImageUtils.loadTexture(path, undefined, (tex) => {
136 | tex.minFilter = tex.magFilter = THREE.LinearFilter
137 | cb(null, tex)
138 | }, () => {
139 | cb(new Error('could not load ' + path))
140 | })
141 | }
142 |
--------------------------------------------------------------------------------
/src/16.js:
--------------------------------------------------------------------------------
1 | import audioDemo from './util/audio-demo-2d'
2 | import { getAnalyserAverages } from './audio-util'
3 | import bezierCurve from 'bezier-curve'
4 |
5 | const curve = [
6 | [-0.9, 0],
7 | [-0.5, -0.5],
8 | [0.5, -0.5],
9 | [0.9, 0]
10 | ]
11 | const controls = curve.slice(1).reduce((a, b) => a.concat(b), [])
12 |
13 | const tracks = [
14 | 'https://soundcloud.com/roman-mars/99-invisible-161-show-of-force',
15 | 'https://soundcloud.com/roman-mars/184-rajneeshpuram',
16 | 'https://soundcloud.com/roman-mars/99-invisible-110-structural-integrity',
17 | 'https://soundcloud.com/roman-mars/99-invisible-167-voices-in-the-wire',
18 | 'https://soundcloud.com/roman-mars/99-invisible-162-mystery-house'
19 | ]
20 |
21 | const track = tracks[Math.floor(Math.random() * tracks.length)]
22 | const demo = audioDemo(track)
23 |
24 | demo.on('render', (context, analyser) => {
25 | const [ width, height ] = demo.shape
26 |
27 | // male speech - 85-180 Hz
28 | const avg = getAnalyserAverages(analyser, 85, 180)
29 | context.translate(width / 2, height / 2)
30 |
31 | const radius = Math.min(200, Math.min(width, height) / 2)
32 | context.scale(radius, radius)
33 |
34 | const point = bezierCurve(avg, curve)
35 | context.beginPath()
36 | context.lineWidth = 3 / radius
37 | context.lineCap = 'round'
38 | context.strokeStyle = '#ca211d'
39 | context.moveTo(0, 0.35)
40 | context.lineTo(...point)
41 | context.stroke()
42 |
43 | context.lineWidth = 5 / radius
44 | context.beginPath()
45 | context.moveTo(...curve[0])
46 | context.bezierCurveTo(...controls)
47 | context.strokeStyle = '#000'
48 | context.stroke()
49 | })
50 |
--------------------------------------------------------------------------------
/src/17.js:
--------------------------------------------------------------------------------
1 | global.THREE = require('three')
2 |
3 | import createWorld from 'verlet-system/3d'
4 | import createConstraint from 'verlet-constraint/3d'
5 | import createPoint from 'verlet-point/3d'
6 | import createApp from './three-orbit-app'
7 | import randomSphere from 'gl-vec3/random'
8 | import subtract from 'gl-vec3/subtract'
9 | import normalize from 'gl-vec3/normalize'
10 | import scale3 from 'gl-vec3/scale'
11 | import lerp from 'gl-vec3/lerp'
12 | import newArray from 'new-array'
13 | import flattenVertices from 'flatten-vertex-data'
14 | import random from 'random-float'
15 |
16 | const glslify = require('glslify')
17 | const flattenArray = (a, b) => a.concat(b)
18 |
19 | const app = createApp({
20 | antialias: true,
21 | scale: window.devicePixelRatio
22 | })
23 | app.renderer.setClearColor('#3d0e3b', 1)
24 |
25 | const radius = 0.75
26 | const segments = 20
27 | const capacity = 100
28 | const origin = [ 0, 0, 0 ]
29 |
30 | const world = createWorld()
31 | const groups = newArray(capacity).map(() => {
32 | let start = origin
33 | let end = randomSphere([], radius)
34 | return newArray(segments).map((x, i) => {
35 | const curStep = i % 2 === 0 ? i : (i + 1)
36 | const t = curStep / (segments - 1)
37 | const pt = createPoint({
38 | position: lerp([], start, end, t),
39 | mass: random(0.8, 1.0)
40 | })
41 | return pt
42 | })
43 | })
44 |
45 | const points = groups.reduce(flattenArray, [])
46 |
47 | const constraints = groups.map(group => {
48 | const opt = { stiffness: 1 }
49 | const cGroup = []
50 | for (let i = group.length - 2; i >= 0; i--) {
51 | const c = createConstraint([ group[i], group[i + 1] ], opt)
52 | cGroup.push(c)
53 | }
54 | return cGroup
55 | }).reduce(flattenArray, [])
56 |
57 | const geometry = new THREE.BufferGeometry()
58 | const vertices = new Float32Array(capacity * segments * 3)
59 | const attrib = new THREE.BufferAttribute(vertices, 3)
60 | geometry.addAttribute('position', attrib)
61 | updatePoints()
62 |
63 | const material = new THREE.RawShaderMaterial({
64 | vertexShader: glslify(__dirname + '/shaders/17.vert'),
65 | fragmentShader: glslify(__dirname + '/shaders/17.frag'),
66 | uniforms: {
67 | color: { type: 'c', value: new THREE.Color('#5be72b') },
68 | opacity: { type: 'f', value: 0.95 },
69 | radius: { type: 'f', value: radius }
70 | },
71 | wireframe: true,
72 | wireframeLinewidth: 1.25,
73 | depthTest: false,
74 | depthWrite: false,
75 | blending: THREE.AdditiveBlending,
76 | transparent: true
77 | })
78 |
79 | // Three r69 doesn't set this...
80 | app.renderer.getContext().lineWidth(material.wireframeLinewidth)
81 |
82 | const mesh = new THREE.Mesh(geometry, material)
83 | app.scene.add(mesh)
84 |
85 | window.addEventListener('click', forcePush)
86 | window.addEventListener('touchend', forcePush)
87 | forcePush()
88 |
89 | app.on('tick', dt => {
90 | dt = Math.min(dt, 30) / 1000
91 | constraints.forEach(c => c.solve())
92 |
93 | // pin center
94 | groups.forEach(group => {
95 | group[0].place(origin)
96 | })
97 |
98 | world.integrate(points, dt)
99 | updatePoints()
100 |
101 | mesh.rotation.y += dt * 0.25
102 | })
103 |
104 | function updatePoints () {
105 | const positions = points.map(x => [
106 | x.position[0],
107 | x.position[1],
108 | x.position[2]
109 | ])
110 | flattenVertices(positions, vertices)
111 | attrib.needsUpdate = true
112 | }
113 |
114 | function forcePush () {
115 | groups.forEach(group => {
116 | const p1 = group[group.length - 1]
117 | const p2pos = randomSphere([], Math.random() * radius)
118 | const force = subtract([], p2pos, p1.position)
119 | normalize(force, force)
120 | for (let i = group.length - 2; i >= 0; i--) {
121 | group[i].addForce(scale3([], force, 0.009))
122 | }
123 | })
124 | }
125 |
--------------------------------------------------------------------------------
/src/19.js:
--------------------------------------------------------------------------------
1 | /*
2 | The code for this demo visualizes itself.
3 |
4 | Change it to see the AST update
5 | the visualization.
6 | */
7 |
8 | // Include some dependencies
9 | const CodeMirror = require('codemirror/lib/codemirror')
10 | const fs = require('fs')
11 | const insert = require('insert-css')
12 | const acorn = require('acorn')
13 | const walk = require('acorn/dist/walk')
14 | const createLoop = require('canvas-loop')
15 | const colorHash = new (require('color-hash'))()
16 | const astTypes = require('./util/acorn-types')
17 |
18 | // Include CodeMirror JavaScript handling
19 | require('codemirror/mode/javascript/javascript')
20 |
21 | // CSS styles
22 | insert(fs.readFileSync(require.resolve('codemirror/lib/codemirror.css'), 'utf8'))
23 | insert(fs.readFileSync(require.resolve('codemirror/theme/material.css'), 'utf8'))
24 |
25 | // The source code for this file
26 | const src = fs.readFileSync(__filename, 'utf8')
27 |
28 | // CodeMirror setup function
29 | const textArea = document.querySelector('#text')
30 | function createEditor (callback) {
31 | const editor = CodeMirror(textArea, {
32 | lineNumbers: true,
33 | styleActiveLine: true,
34 | matchBrackets: true,
35 | viewportMargin: Infinity,
36 | theme: 'material',
37 | value: src,
38 | mode: 'javascript'
39 | })
40 |
41 | resize()
42 | window.addEventListener('resize', resize)
43 |
44 | function resize () {
45 | editor.setSize(window.innerWidth, window.innerHeight)
46 | }
47 |
48 | const changed = () => {
49 | callback(editor.getValue())
50 | }
51 | editor.on('change', changed)
52 | process.nextTick(changed)
53 | return editor
54 | }
55 |
56 | // Parse the AST on text edit
57 | let previousError = null
58 | const editor = createEditor(text => {
59 | try {
60 | const ast = acorn.parse(text, {
61 | ecmaVersion: 6,
62 | sourceType: 'module',
63 | allowReserved: true,
64 | allowReturnOutsideFunction: true,
65 | allowHashBang: true
66 | })
67 |
68 | clearPreviousError()
69 | update(ast, text)
70 | } catch (err) {
71 | if (err instanceof SyntaxError && err.loc) {
72 | clearPreviousError()
73 | previousError = err.loc.line - 1
74 | console.error(err)
75 | editor.addLineClass(previousError, 'background', 'line-error')
76 | } else {
77 | throw err
78 | }
79 | }
80 | })
81 |
82 | // Our full-screen