ashton 0.0.1alpha → 0.0.2alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/LICENSE +21 -21
  2. data/README.md +95 -68
  3. data/Rakefile +41 -23
  4. data/examples/bloom_example.rb +59 -0
  5. data/examples/lighting_example.rb +127 -0
  6. data/examples/media/SmallStar.png +0 -0
  7. data/examples/media/Starfighter.png +0 -0
  8. data/examples/media/simple.png +0 -0
  9. data/examples/noise_example.rb +94 -0
  10. data/examples/outline_example.rb +86 -0
  11. data/examples/particle_emitter_example.rb +114 -0
  12. data/examples/pixelate_example.rb +51 -49
  13. data/examples/pixelated_texture_example.rb +69 -0
  14. data/examples/radial_blur_example.rb +60 -62
  15. data/examples/shader_image_example.rb +74 -41
  16. data/examples/{shockwave2_example.rb → shockwave_example.rb} +74 -75
  17. data/examples/stencil_shader_example.rb +104 -0
  18. data/examples/{framebuffer_example.rb → texture_render_example.rb} +53 -49
  19. data/examples/{tv_screen_and_noise_example.rb → tv_screen_and_static_example.rb} +59 -59
  20. data/ext/ashton/GLee.c +18170 -0
  21. data/ext/ashton/GLee.h +17647 -0
  22. data/ext/ashton/ashton.c +42 -0
  23. data/ext/ashton/ashton.h +31 -0
  24. data/ext/ashton/color.c +45 -0
  25. data/ext/ashton/color.h +25 -0
  26. data/ext/ashton/common.h +41 -0
  27. data/ext/ashton/extconf.rb +42 -0
  28. data/ext/ashton/fast_math.c +30 -0
  29. data/ext/ashton/fast_math.h +30 -0
  30. data/ext/ashton/font.c +8 -0
  31. data/ext/ashton/font.h +16 -0
  32. data/ext/ashton/gosu.c +18 -0
  33. data/ext/ashton/gosu.h +19 -0
  34. data/ext/ashton/image.c +8 -0
  35. data/ext/ashton/image.h +16 -0
  36. data/ext/ashton/particle_emitter.c +788 -0
  37. data/ext/ashton/particle_emitter.h +171 -0
  38. data/ext/ashton/pixel_cache.c +237 -0
  39. data/ext/ashton/pixel_cache.h +58 -0
  40. data/ext/ashton/shader.c +9 -0
  41. data/ext/ashton/shader.h +16 -0
  42. data/ext/ashton/texture.c +442 -0
  43. data/ext/ashton/texture.h +63 -0
  44. data/ext/ashton/window.c +8 -0
  45. data/ext/ashton/window.h +16 -0
  46. data/lib/ashton.rb +38 -26
  47. data/lib/ashton/1.9/ashton.so +0 -0
  48. data/lib/ashton/gosu_ext/color.rb +24 -11
  49. data/lib/ashton/gosu_ext/font.rb +58 -0
  50. data/lib/ashton/gosu_ext/gosu_module.rb +16 -0
  51. data/lib/ashton/gosu_ext/image.rb +95 -31
  52. data/lib/ashton/gosu_ext/window.rb +78 -35
  53. data/lib/ashton/image_stub.rb +32 -36
  54. data/lib/ashton/lighting/light_source.rb +146 -0
  55. data/lib/ashton/lighting/manager.rb +98 -0
  56. data/lib/ashton/mixins/version_checking.rb +23 -0
  57. data/lib/ashton/particle_emitter.rb +87 -0
  58. data/lib/ashton/pixel_cache.rb +24 -0
  59. data/lib/ashton/shader.rb +353 -35
  60. data/lib/ashton/shaders/bloom.frag +41 -0
  61. data/lib/ashton/shaders/color_inversion.frag +11 -0
  62. data/lib/ashton/{post_process → shaders}/contrast.frag +16 -16
  63. data/lib/ashton/{shader → shaders}/default.frag +22 -19
  64. data/lib/ashton/{shader → shaders}/default.vert +13 -13
  65. data/lib/ashton/shaders/fade.frag +14 -0
  66. data/lib/ashton/shaders/grayscale.frag +15 -0
  67. data/lib/ashton/shaders/include/classicnoise2d.glsl +113 -0
  68. data/lib/ashton/shaders/include/classicnoise3d.glsl +177 -0
  69. data/lib/ashton/shaders/include/classicnoise4d.glsl +302 -0
  70. data/lib/ashton/{include/simplex.glsl → shaders/include/noise2d.glsl} +70 -63
  71. data/lib/ashton/shaders/include/noise3d.glsl +102 -0
  72. data/lib/ashton/shaders/include/noise4d.glsl +128 -0
  73. data/lib/ashton/shaders/include/rand.glsl +5 -0
  74. data/lib/ashton/shaders/lighting/distort.frag +57 -0
  75. data/lib/ashton/shaders/lighting/draw_shadows.frag +60 -0
  76. data/lib/ashton/shaders/lighting/shadow_blur.frag +60 -0
  77. data/lib/ashton/shaders/mezzotint.frag +22 -0
  78. data/lib/ashton/shaders/multitexture2.vert +19 -0
  79. data/lib/ashton/shaders/outline.frag +45 -0
  80. data/lib/ashton/{post_process → shaders}/pixelate.frag +48 -48
  81. data/lib/ashton/shaders/radial_blur.frag +63 -0
  82. data/lib/ashton/shaders/sepia.frag +26 -0
  83. data/lib/ashton/{post_process/shockwave2.frag → shaders/shockwave.frag} +38 -35
  84. data/lib/ashton/shaders/signed_distance_field.frag +80 -0
  85. data/lib/ashton/{post_process/noise.frag → shaders/static.frag} +25 -27
  86. data/lib/ashton/shaders/stencil.frag +27 -0
  87. data/lib/ashton/shaders/tv_screen.frag +23 -0
  88. data/lib/ashton/signed_distance_field.rb +151 -0
  89. data/lib/ashton/texture.rb +186 -0
  90. data/lib/ashton/version.rb +2 -2
  91. data/lib/ashton/window_buffer.rb +16 -0
  92. data/spec/ashton/ashton_spec.rb +22 -0
  93. data/spec/ashton/gosu_ext/color_spec.rb +34 -0
  94. data/spec/ashton/gosu_ext/font_spec.rb +57 -0
  95. data/spec/ashton/gosu_ext/gosu_spec.rb +11 -0
  96. data/spec/ashton/gosu_ext/image_spec.rb +66 -0
  97. data/spec/ashton/gosu_ext/window_spec.rb +71 -0
  98. data/spec/ashton/image_stub_spec.rb +46 -0
  99. data/spec/ashton/particle_emitter_spec.rb +123 -0
  100. data/spec/ashton/pixel_cache_spec.rb +153 -0
  101. data/spec/ashton/shader_spec.rb +152 -0
  102. data/spec/ashton/signed_distance_field_spec.rb +163 -0
  103. data/spec/ashton/texture_spec.rb +347 -0
  104. data/spec/helper.rb +12 -0
  105. metadata +159 -28
  106. data/examples/output/README.txt +0 -1
  107. data/lib/ashton/base_shader.rb +0 -172
  108. data/lib/ashton/framebuffer.rb +0 -183
  109. data/lib/ashton/post_process.rb +0 -83
  110. data/lib/ashton/post_process/default.vert +0 -9
  111. data/lib/ashton/post_process/fade.frag +0 -11
  112. data/lib/ashton/post_process/mezzotint.frag +0 -24
  113. data/lib/ashton/post_process/radial_blur.frag +0 -31
  114. data/lib/ashton/post_process/sepia.frag +0 -19
  115. data/lib/ashton/post_process/shockwave.frag +0 -40
  116. data/lib/ashton/post_process/tv_screen.frag +0 -32
@@ -0,0 +1,11 @@
1
+ #version 110
2
+
3
+ uniform sampler2D in_Texture;
4
+
5
+ varying vec2 var_TexCoord;
6
+
7
+ void main()
8
+ {
9
+ vec4 color = texture2D(in_Texture, var_TexCoord);
10
+ gl_FragColor = vec4(vec3(1.0) - color.rgb, color.a);
11
+ }
@@ -1,16 +1,16 @@
1
- #version 110
2
-
3
- uniform sampler2D in_Texture;
4
- uniform float in_contrast;
5
-
6
- varying vec2 var_TexCoord;
7
-
8
- void main()
9
- {
10
- vec4 color = texture2D(in_Texture, var_TexCoord);
11
-
12
- color = (color - 0.5) * contrast + 0.5;
13
-
14
- gl_FragColor.rgb = color.rgb;
15
- gl_FragColor.a = 1.0;
16
- }
1
+ #version 110
2
+
3
+ uniform sampler2D in_Texture;
4
+ uniform float in_Contrast;
5
+
6
+ varying vec2 var_TexCoord;
7
+
8
+ void main()
9
+ {
10
+ vec4 color = texture2D(in_Texture, var_TexCoord);
11
+
12
+ color = (color - 0.5) * in_Contrast + 0.5;
13
+
14
+ gl_FragColor.rgb = color.rgb;
15
+ gl_FragColor.a = 1.0;
16
+ }
@@ -1,19 +1,22 @@
1
- #version 110
2
-
3
- uniform sampler2D in_Texture;
4
- uniform bool in_TextureEnabled;
5
-
6
- varying vec4 var_Color;
7
- varying vec2 var_TexCoord;
8
-
9
- void main()
10
- {
11
- if(in_TextureEnabled)
12
- {
13
- gl_FragColor = texture2D(in_Texture, var_TexCoord) * var_Color;
14
- }
15
- else
16
- {
17
- gl_FragColor = var_Color;
18
- }
19
- }
1
+ #version 110
2
+
3
+ uniform sampler2D in_Texture;
4
+ uniform bool in_TextureEnabled;
5
+
6
+ uniform int in_WindowWidth;
7
+ uniform int in_WindowHeight;
8
+
9
+ varying vec4 var_Color;
10
+ varying vec2 var_TexCoord;
11
+
12
+ void main()
13
+ {
14
+ if(in_TextureEnabled)
15
+ {
16
+ gl_FragColor = texture2D(in_Texture, var_TexCoord) * var_Color;
17
+ }
18
+ else
19
+ {
20
+ gl_FragColor = var_Color;
21
+ }
22
+ }
@@ -1,14 +1,14 @@
1
- #version 110
2
-
3
- attribute vec4 in_Color;
4
-
5
- varying vec4 var_Color;
6
- varying vec2 var_TexCoord;
7
-
8
- void main()
9
- {
10
-
11
- gl_Position = ftransform();
12
- var_Color = in_Color;
13
- var_TexCoord = gl_MultiTexCoord0.xy;
1
+ #version 110
2
+
3
+ attribute vec4 in_Color;
4
+
5
+ varying vec4 var_Color;
6
+ varying vec2 var_TexCoord;
7
+
8
+ void main()
9
+ {
10
+
11
+ gl_Position = ftransform();
12
+ var_Color = in_Color;
13
+ var_TexCoord = gl_MultiTexCoord0.xy;
14
14
  }
@@ -0,0 +1,14 @@
1
+ #version 110
2
+
3
+ // This is sort of a pointless shader, since the same effect can be
4
+ // had drawing in :multiply mode.
5
+
6
+ uniform sampler2D in_Texture;
7
+
8
+ uniform float in_Fade; // 1.0 => no effect, 0.0 => becomes invisible.
9
+
10
+ varying vec2 var_TexCoord;
11
+
12
+ void main() {
13
+ gl_FragColor = texture2D(in_Texture, var_TexCoord) * in_Fade;
14
+ }
@@ -0,0 +1,15 @@
1
+ #version 110
2
+
3
+ uniform sampler2D in_Texture;
4
+
5
+ varying vec2 var_TexCoord;
6
+ varying vec4 var_Color;
7
+
8
+ const vec3 Ratio = vec3(0.299, 0.587, 0.114);
9
+
10
+ void main()
11
+ {
12
+ vec4 color = texture2D(in_Texture, var_TexCoord);
13
+ float gray = dot(color.rgb * var_Color.rgb, Ratio);
14
+ gl_FragColor = vec4(vec3(gray), color.a * var_Color.a);
15
+ }
@@ -0,0 +1,113 @@
1
+ //
2
+ // GLSL textureless classic 2D noise "cnoise",
3
+ // with an RSL-style periodic variant "pnoise".
4
+ // Author: Stefan Gustavson (stefan.gustavson@liu.se)
5
+ // Version: 2011-08-22
6
+ //
7
+ // Many thanks to Ian McEwan of Ashima Arts for the
8
+ // ideas for permutation and gradient selection.
9
+ //
10
+ // Copyright (c) 2011 Stefan Gustavson. All rights reserved.
11
+ // Distributed under the MIT license. See LICENSE file.
12
+ // https://github.com/ashima/webgl-noise
13
+ //
14
+
15
+ vec4 mod289(vec4 x)
16
+ {
17
+ return x - floor(x * (1.0 / 289.0)) * 289.0;
18
+ }
19
+
20
+ vec4 permute(vec4 x)
21
+ {
22
+ return mod289(((x*34.0)+1.0)*x);
23
+ }
24
+
25
+ vec4 taylorInvSqrt(vec4 r)
26
+ {
27
+ return 1.79284291400159 - 0.85373472095314 * r;
28
+ }
29
+
30
+ vec2 fade(vec2 t) {
31
+ return t*t*t*(t*(t*6.0-15.0)+10.0);
32
+ }
33
+
34
+ // Classic Perlin noise
35
+ float cnoise(vec2 P)
36
+ {
37
+ vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
38
+ vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
39
+ Pi = mod289(Pi); // To avoid truncation effects in permutation
40
+ vec4 ix = Pi.xzxz;
41
+ vec4 iy = Pi.yyww;
42
+ vec4 fx = Pf.xzxz;
43
+ vec4 fy = Pf.yyww;
44
+
45
+ vec4 i = permute(permute(ix) + iy);
46
+
47
+ vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
48
+ vec4 gy = abs(gx) - 0.5 ;
49
+ vec4 tx = floor(gx + 0.5);
50
+ gx = gx - tx;
51
+
52
+ vec2 g00 = vec2(gx.x,gy.x);
53
+ vec2 g10 = vec2(gx.y,gy.y);
54
+ vec2 g01 = vec2(gx.z,gy.z);
55
+ vec2 g11 = vec2(gx.w,gy.w);
56
+
57
+ vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
58
+ g00 *= norm.x;
59
+ g01 *= norm.y;
60
+ g10 *= norm.z;
61
+ g11 *= norm.w;
62
+
63
+ float n00 = dot(g00, vec2(fx.x, fy.x));
64
+ float n10 = dot(g10, vec2(fx.y, fy.y));
65
+ float n01 = dot(g01, vec2(fx.z, fy.z));
66
+ float n11 = dot(g11, vec2(fx.w, fy.w));
67
+
68
+ vec2 fade_xy = fade(Pf.xy);
69
+ vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
70
+ float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
71
+ return 2.3 * n_xy;
72
+ }
73
+
74
+ // Classic Perlin noise, periodic variant
75
+ float pnoise(vec2 P, vec2 rep)
76
+ {
77
+ vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
78
+ vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
79
+ Pi = mod(Pi, rep.xyxy); // To create noise with explicit period
80
+ Pi = mod289(Pi); // To avoid truncation effects in permutation
81
+ vec4 ix = Pi.xzxz;
82
+ vec4 iy = Pi.yyww;
83
+ vec4 fx = Pf.xzxz;
84
+ vec4 fy = Pf.yyww;
85
+
86
+ vec4 i = permute(permute(ix) + iy);
87
+
88
+ vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
89
+ vec4 gy = abs(gx) - 0.5 ;
90
+ vec4 tx = floor(gx + 0.5);
91
+ gx = gx - tx;
92
+
93
+ vec2 g00 = vec2(gx.x,gy.x);
94
+ vec2 g10 = vec2(gx.y,gy.y);
95
+ vec2 g01 = vec2(gx.z,gy.z);
96
+ vec2 g11 = vec2(gx.w,gy.w);
97
+
98
+ vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
99
+ g00 *= norm.x;
100
+ g01 *= norm.y;
101
+ g10 *= norm.z;
102
+ g11 *= norm.w;
103
+
104
+ float n00 = dot(g00, vec2(fx.x, fy.x));
105
+ float n10 = dot(g10, vec2(fx.y, fy.y));
106
+ float n01 = dot(g01, vec2(fx.z, fy.z));
107
+ float n11 = dot(g11, vec2(fx.w, fy.w));
108
+
109
+ vec2 fade_xy = fade(Pf.xy);
110
+ vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
111
+ float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
112
+ return 2.3 * n_xy;
113
+ }
@@ -0,0 +1,177 @@
1
+ //
2
+ // GLSL textureless classic 3D noise "cnoise",
3
+ // with an RSL-style periodic variant "pnoise".
4
+ // Author: Stefan Gustavson (stefan.gustavson@liu.se)
5
+ // Version: 2011-10-11
6
+ //
7
+ // Many thanks to Ian McEwan of Ashima Arts for the
8
+ // ideas for permutation and gradient selection.
9
+ //
10
+ // Copyright (c) 2011 Stefan Gustavson. All rights reserved.
11
+ // Distributed under the MIT license. See LICENSE file.
12
+ // https://github.com/ashima/webgl-noise
13
+ //
14
+
15
+ vec3 mod289(vec3 x)
16
+ {
17
+ return x - floor(x * (1.0 / 289.0)) * 289.0;
18
+ }
19
+
20
+ vec4 mod289(vec4 x)
21
+ {
22
+ return x - floor(x * (1.0 / 289.0)) * 289.0;
23
+ }
24
+
25
+ vec4 permute(vec4 x)
26
+ {
27
+ return mod289(((x*34.0)+1.0)*x);
28
+ }
29
+
30
+ vec4 taylorInvSqrt(vec4 r)
31
+ {
32
+ return 1.79284291400159 - 0.85373472095314 * r;
33
+ }
34
+
35
+ vec3 fade(vec3 t) {
36
+ return t*t*t*(t*(t*6.0-15.0)+10.0);
37
+ }
38
+
39
+ // Classic Perlin noise
40
+ float cnoise(vec3 P)
41
+ {
42
+ vec3 Pi0 = floor(P); // Integer part for indexing
43
+ vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1
44
+ Pi0 = mod289(Pi0);
45
+ Pi1 = mod289(Pi1);
46
+ vec3 Pf0 = fract(P); // Fractional part for interpolation
47
+ vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0
48
+ vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
49
+ vec4 iy = vec4(Pi0.yy, Pi1.yy);
50
+ vec4 iz0 = Pi0.zzzz;
51
+ vec4 iz1 = Pi1.zzzz;
52
+
53
+ vec4 ixy = permute(permute(ix) + iy);
54
+ vec4 ixy0 = permute(ixy + iz0);
55
+ vec4 ixy1 = permute(ixy + iz1);
56
+
57
+ vec4 gx0 = ixy0 * (1.0 / 7.0);
58
+ vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;
59
+ gx0 = fract(gx0);
60
+ vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);
61
+ vec4 sz0 = step(gz0, vec4(0.0));
62
+ gx0 -= sz0 * (step(0.0, gx0) - 0.5);
63
+ gy0 -= sz0 * (step(0.0, gy0) - 0.5);
64
+
65
+ vec4 gx1 = ixy1 * (1.0 / 7.0);
66
+ vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;
67
+ gx1 = fract(gx1);
68
+ vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);
69
+ vec4 sz1 = step(gz1, vec4(0.0));
70
+ gx1 -= sz1 * (step(0.0, gx1) - 0.5);
71
+ gy1 -= sz1 * (step(0.0, gy1) - 0.5);
72
+
73
+ vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);
74
+ vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);
75
+ vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);
76
+ vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);
77
+ vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);
78
+ vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);
79
+ vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);
80
+ vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);
81
+
82
+ vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
83
+ g000 *= norm0.x;
84
+ g010 *= norm0.y;
85
+ g100 *= norm0.z;
86
+ g110 *= norm0.w;
87
+ vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
88
+ g001 *= norm1.x;
89
+ g011 *= norm1.y;
90
+ g101 *= norm1.z;
91
+ g111 *= norm1.w;
92
+
93
+ float n000 = dot(g000, Pf0);
94
+ float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));
95
+ float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));
96
+ float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));
97
+ float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));
98
+ float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));
99
+ float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));
100
+ float n111 = dot(g111, Pf1);
101
+
102
+ vec3 fade_xyz = fade(Pf0);
103
+ vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);
104
+ vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);
105
+ float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
106
+ return 2.2 * n_xyz;
107
+ }
108
+
109
+ // Classic Perlin noise, periodic variant
110
+ float pnoise(vec3 P, vec3 rep)
111
+ {
112
+ vec3 Pi0 = mod(floor(P), rep); // Integer part, modulo period
113
+ vec3 Pi1 = mod(Pi0 + vec3(1.0), rep); // Integer part + 1, mod period
114
+ Pi0 = mod289(Pi0);
115
+ Pi1 = mod289(Pi1);
116
+ vec3 Pf0 = fract(P); // Fractional part for interpolation
117
+ vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0
118
+ vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
119
+ vec4 iy = vec4(Pi0.yy, Pi1.yy);
120
+ vec4 iz0 = Pi0.zzzz;
121
+ vec4 iz1 = Pi1.zzzz;
122
+
123
+ vec4 ixy = permute(permute(ix) + iy);
124
+ vec4 ixy0 = permute(ixy + iz0);
125
+ vec4 ixy1 = permute(ixy + iz1);
126
+
127
+ vec4 gx0 = ixy0 * (1.0 / 7.0);
128
+ vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;
129
+ gx0 = fract(gx0);
130
+ vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);
131
+ vec4 sz0 = step(gz0, vec4(0.0));
132
+ gx0 -= sz0 * (step(0.0, gx0) - 0.5);
133
+ gy0 -= sz0 * (step(0.0, gy0) - 0.5);
134
+
135
+ vec4 gx1 = ixy1 * (1.0 / 7.0);
136
+ vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;
137
+ gx1 = fract(gx1);
138
+ vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);
139
+ vec4 sz1 = step(gz1, vec4(0.0));
140
+ gx1 -= sz1 * (step(0.0, gx1) - 0.5);
141
+ gy1 -= sz1 * (step(0.0, gy1) - 0.5);
142
+
143
+ vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);
144
+ vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);
145
+ vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);
146
+ vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);
147
+ vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);
148
+ vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);
149
+ vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);
150
+ vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);
151
+
152
+ vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
153
+ g000 *= norm0.x;
154
+ g010 *= norm0.y;
155
+ g100 *= norm0.z;
156
+ g110 *= norm0.w;
157
+ vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
158
+ g001 *= norm1.x;
159
+ g011 *= norm1.y;
160
+ g101 *= norm1.z;
161
+ g111 *= norm1.w;
162
+
163
+ float n000 = dot(g000, Pf0);
164
+ float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));
165
+ float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));
166
+ float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));
167
+ float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));
168
+ float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));
169
+ float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));
170
+ float n111 = dot(g111, Pf1);
171
+
172
+ vec3 fade_xyz = fade(Pf0);
173
+ vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);
174
+ vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);
175
+ float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
176
+ return 2.2 * n_xyz;
177
+ }
@@ -0,0 +1,302 @@
1
+ //
2
+ // GLSL textureless classic 4D noise "cnoise",
3
+ // with an RSL-style periodic variant "pnoise".
4
+ // Author: Stefan Gustavson (stefan.gustavson@liu.se)
5
+ // Version: 2011-08-22
6
+ //
7
+ // Many thanks to Ian McEwan of Ashima Arts for the
8
+ // ideas for permutation and gradient selection.
9
+ //
10
+ // Copyright (c) 2011 Stefan Gustavson. All rights reserved.
11
+ // Distributed under the MIT license. See LICENSE file.
12
+ // https://github.com/ashima/webgl-noise
13
+ //
14
+
15
+ vec4 mod289(vec4 x)
16
+ {
17
+ return x - floor(x * (1.0 / 289.0)) * 289.0;
18
+ }
19
+
20
+ vec4 permute(vec4 x)
21
+ {
22
+ return mod289(((x*34.0)+1.0)*x);
23
+ }
24
+
25
+ vec4 taylorInvSqrt(vec4 r)
26
+ {
27
+ return 1.79284291400159 - 0.85373472095314 * r;
28
+ }
29
+
30
+ vec4 fade(vec4 t) {
31
+ return t*t*t*(t*(t*6.0-15.0)+10.0);
32
+ }
33
+
34
+ // Classic Perlin noise
35
+ float cnoise(vec4 P)
36
+ {
37
+ vec4 Pi0 = floor(P); // Integer part for indexing
38
+ vec4 Pi1 = Pi0 + 1.0; // Integer part + 1
39
+ Pi0 = mod289(Pi0);
40
+ Pi1 = mod289(Pi1);
41
+ vec4 Pf0 = fract(P); // Fractional part for interpolation
42
+ vec4 Pf1 = Pf0 - 1.0; // Fractional part - 1.0
43
+ vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
44
+ vec4 iy = vec4(Pi0.yy, Pi1.yy);
45
+ vec4 iz0 = vec4(Pi0.zzzz);
46
+ vec4 iz1 = vec4(Pi1.zzzz);
47
+ vec4 iw0 = vec4(Pi0.wwww);
48
+ vec4 iw1 = vec4(Pi1.wwww);
49
+
50
+ vec4 ixy = permute(permute(ix) + iy);
51
+ vec4 ixy0 = permute(ixy + iz0);
52
+ vec4 ixy1 = permute(ixy + iz1);
53
+ vec4 ixy00 = permute(ixy0 + iw0);
54
+ vec4 ixy01 = permute(ixy0 + iw1);
55
+ vec4 ixy10 = permute(ixy1 + iw0);
56
+ vec4 ixy11 = permute(ixy1 + iw1);
57
+
58
+ vec4 gx00 = ixy00 * (1.0 / 7.0);
59
+ vec4 gy00 = floor(gx00) * (1.0 / 7.0);
60
+ vec4 gz00 = floor(gy00) * (1.0 / 6.0);
61
+ gx00 = fract(gx00) - 0.5;
62
+ gy00 = fract(gy00) - 0.5;
63
+ gz00 = fract(gz00) - 0.5;
64
+ vec4 gw00 = vec4(0.75) - abs(gx00) - abs(gy00) - abs(gz00);
65
+ vec4 sw00 = step(gw00, vec4(0.0));
66
+ gx00 -= sw00 * (step(0.0, gx00) - 0.5);
67
+ gy00 -= sw00 * (step(0.0, gy00) - 0.5);
68
+
69
+ vec4 gx01 = ixy01 * (1.0 / 7.0);
70
+ vec4 gy01 = floor(gx01) * (1.0 / 7.0);
71
+ vec4 gz01 = floor(gy01) * (1.0 / 6.0);
72
+ gx01 = fract(gx01) - 0.5;
73
+ gy01 = fract(gy01) - 0.5;
74
+ gz01 = fract(gz01) - 0.5;
75
+ vec4 gw01 = vec4(0.75) - abs(gx01) - abs(gy01) - abs(gz01);
76
+ vec4 sw01 = step(gw01, vec4(0.0));
77
+ gx01 -= sw01 * (step(0.0, gx01) - 0.5);
78
+ gy01 -= sw01 * (step(0.0, gy01) - 0.5);
79
+
80
+ vec4 gx10 = ixy10 * (1.0 / 7.0);
81
+ vec4 gy10 = floor(gx10) * (1.0 / 7.0);
82
+ vec4 gz10 = floor(gy10) * (1.0 / 6.0);
83
+ gx10 = fract(gx10) - 0.5;
84
+ gy10 = fract(gy10) - 0.5;
85
+ gz10 = fract(gz10) - 0.5;
86
+ vec4 gw10 = vec4(0.75) - abs(gx10) - abs(gy10) - abs(gz10);
87
+ vec4 sw10 = step(gw10, vec4(0.0));
88
+ gx10 -= sw10 * (step(0.0, gx10) - 0.5);
89
+ gy10 -= sw10 * (step(0.0, gy10) - 0.5);
90
+
91
+ vec4 gx11 = ixy11 * (1.0 / 7.0);
92
+ vec4 gy11 = floor(gx11) * (1.0 / 7.0);
93
+ vec4 gz11 = floor(gy11) * (1.0 / 6.0);
94
+ gx11 = fract(gx11) - 0.5;
95
+ gy11 = fract(gy11) - 0.5;
96
+ gz11 = fract(gz11) - 0.5;
97
+ vec4 gw11 = vec4(0.75) - abs(gx11) - abs(gy11) - abs(gz11);
98
+ vec4 sw11 = step(gw11, vec4(0.0));
99
+ gx11 -= sw11 * (step(0.0, gx11) - 0.5);
100
+ gy11 -= sw11 * (step(0.0, gy11) - 0.5);
101
+
102
+ vec4 g0000 = vec4(gx00.x,gy00.x,gz00.x,gw00.x);
103
+ vec4 g1000 = vec4(gx00.y,gy00.y,gz00.y,gw00.y);
104
+ vec4 g0100 = vec4(gx00.z,gy00.z,gz00.z,gw00.z);
105
+ vec4 g1100 = vec4(gx00.w,gy00.w,gz00.w,gw00.w);
106
+ vec4 g0010 = vec4(gx10.x,gy10.x,gz10.x,gw10.x);
107
+ vec4 g1010 = vec4(gx10.y,gy10.y,gz10.y,gw10.y);
108
+ vec4 g0110 = vec4(gx10.z,gy10.z,gz10.z,gw10.z);
109
+ vec4 g1110 = vec4(gx10.w,gy10.w,gz10.w,gw10.w);
110
+ vec4 g0001 = vec4(gx01.x,gy01.x,gz01.x,gw01.x);
111
+ vec4 g1001 = vec4(gx01.y,gy01.y,gz01.y,gw01.y);
112
+ vec4 g0101 = vec4(gx01.z,gy01.z,gz01.z,gw01.z);
113
+ vec4 g1101 = vec4(gx01.w,gy01.w,gz01.w,gw01.w);
114
+ vec4 g0011 = vec4(gx11.x,gy11.x,gz11.x,gw11.x);
115
+ vec4 g1011 = vec4(gx11.y,gy11.y,gz11.y,gw11.y);
116
+ vec4 g0111 = vec4(gx11.z,gy11.z,gz11.z,gw11.z);
117
+ vec4 g1111 = vec4(gx11.w,gy11.w,gz11.w,gw11.w);
118
+
119
+ vec4 norm00 = taylorInvSqrt(vec4(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100)));
120
+ g0000 *= norm00.x;
121
+ g0100 *= norm00.y;
122
+ g1000 *= norm00.z;
123
+ g1100 *= norm00.w;
124
+
125
+ vec4 norm01 = taylorInvSqrt(vec4(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101)));
126
+ g0001 *= norm01.x;
127
+ g0101 *= norm01.y;
128
+ g1001 *= norm01.z;
129
+ g1101 *= norm01.w;
130
+
131
+ vec4 norm10 = taylorInvSqrt(vec4(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110)));
132
+ g0010 *= norm10.x;
133
+ g0110 *= norm10.y;
134
+ g1010 *= norm10.z;
135
+ g1110 *= norm10.w;
136
+
137
+ vec4 norm11 = taylorInvSqrt(vec4(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111)));
138
+ g0011 *= norm11.x;
139
+ g0111 *= norm11.y;
140
+ g1011 *= norm11.z;
141
+ g1111 *= norm11.w;
142
+
143
+ float n0000 = dot(g0000, Pf0);
144
+ float n1000 = dot(g1000, vec4(Pf1.x, Pf0.yzw));
145
+ float n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.zw));
146
+ float n1100 = dot(g1100, vec4(Pf1.xy, Pf0.zw));
147
+ float n0010 = dot(g0010, vec4(Pf0.xy, Pf1.z, Pf0.w));
148
+ float n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w));
149
+ float n0110 = dot(g0110, vec4(Pf0.x, Pf1.yz, Pf0.w));
150
+ float n1110 = dot(g1110, vec4(Pf1.xyz, Pf0.w));
151
+ float n0001 = dot(g0001, vec4(Pf0.xyz, Pf1.w));
152
+ float n1001 = dot(g1001, vec4(Pf1.x, Pf0.yz, Pf1.w));
153
+ float n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w));
154
+ float n1101 = dot(g1101, vec4(Pf1.xy, Pf0.z, Pf1.w));
155
+ float n0011 = dot(g0011, vec4(Pf0.xy, Pf1.zw));
156
+ float n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.zw));
157
+ float n0111 = dot(g0111, vec4(Pf0.x, Pf1.yzw));
158
+ float n1111 = dot(g1111, Pf1);
159
+
160
+ vec4 fade_xyzw = fade(Pf0);
161
+ vec4 n_0w = mix(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w);
162
+ vec4 n_1w = mix(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w);
163
+ vec4 n_zw = mix(n_0w, n_1w, fade_xyzw.z);
164
+ vec2 n_yzw = mix(n_zw.xy, n_zw.zw, fade_xyzw.y);
165
+ float n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);
166
+ return 2.2 * n_xyzw;
167
+ }
168
+
169
+ // Classic Perlin noise, periodic version
170
+ float pnoise(vec4 P, vec4 rep)
171
+ {
172
+ vec4 Pi0 = mod(floor(P), rep); // Integer part modulo rep
173
+ vec4 Pi1 = mod(Pi0 + 1.0, rep); // Integer part + 1 mod rep
174
+ Pi0 = mod289(Pi0);
175
+ Pi1 = mod289(Pi1);
176
+ vec4 Pf0 = fract(P); // Fractional part for interpolation
177
+ vec4 Pf1 = Pf0 - 1.0; // Fractional part - 1.0
178
+ vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
179
+ vec4 iy = vec4(Pi0.yy, Pi1.yy);
180
+ vec4 iz0 = vec4(Pi0.zzzz);
181
+ vec4 iz1 = vec4(Pi1.zzzz);
182
+ vec4 iw0 = vec4(Pi0.wwww);
183
+ vec4 iw1 = vec4(Pi1.wwww);
184
+
185
+ vec4 ixy = permute(permute(ix) + iy);
186
+ vec4 ixy0 = permute(ixy + iz0);
187
+ vec4 ixy1 = permute(ixy + iz1);
188
+ vec4 ixy00 = permute(ixy0 + iw0);
189
+ vec4 ixy01 = permute(ixy0 + iw1);
190
+ vec4 ixy10 = permute(ixy1 + iw0);
191
+ vec4 ixy11 = permute(ixy1 + iw1);
192
+
193
+ vec4 gx00 = ixy00 * (1.0 / 7.0);
194
+ vec4 gy00 = floor(gx00) * (1.0 / 7.0);
195
+ vec4 gz00 = floor(gy00) * (1.0 / 6.0);
196
+ gx00 = fract(gx00) - 0.5;
197
+ gy00 = fract(gy00) - 0.5;
198
+ gz00 = fract(gz00) - 0.5;
199
+ vec4 gw00 = vec4(0.75) - abs(gx00) - abs(gy00) - abs(gz00);
200
+ vec4 sw00 = step(gw00, vec4(0.0));
201
+ gx00 -= sw00 * (step(0.0, gx00) - 0.5);
202
+ gy00 -= sw00 * (step(0.0, gy00) - 0.5);
203
+
204
+ vec4 gx01 = ixy01 * (1.0 / 7.0);
205
+ vec4 gy01 = floor(gx01) * (1.0 / 7.0);
206
+ vec4 gz01 = floor(gy01) * (1.0 / 6.0);
207
+ gx01 = fract(gx01) - 0.5;
208
+ gy01 = fract(gy01) - 0.5;
209
+ gz01 = fract(gz01) - 0.5;
210
+ vec4 gw01 = vec4(0.75) - abs(gx01) - abs(gy01) - abs(gz01);
211
+ vec4 sw01 = step(gw01, vec4(0.0));
212
+ gx01 -= sw01 * (step(0.0, gx01) - 0.5);
213
+ gy01 -= sw01 * (step(0.0, gy01) - 0.5);
214
+
215
+ vec4 gx10 = ixy10 * (1.0 / 7.0);
216
+ vec4 gy10 = floor(gx10) * (1.0 / 7.0);
217
+ vec4 gz10 = floor(gy10) * (1.0 / 6.0);
218
+ gx10 = fract(gx10) - 0.5;
219
+ gy10 = fract(gy10) - 0.5;
220
+ gz10 = fract(gz10) - 0.5;
221
+ vec4 gw10 = vec4(0.75) - abs(gx10) - abs(gy10) - abs(gz10);
222
+ vec4 sw10 = step(gw10, vec4(0.0));
223
+ gx10 -= sw10 * (step(0.0, gx10) - 0.5);
224
+ gy10 -= sw10 * (step(0.0, gy10) - 0.5);
225
+
226
+ vec4 gx11 = ixy11 * (1.0 / 7.0);
227
+ vec4 gy11 = floor(gx11) * (1.0 / 7.0);
228
+ vec4 gz11 = floor(gy11) * (1.0 / 6.0);
229
+ gx11 = fract(gx11) - 0.5;
230
+ gy11 = fract(gy11) - 0.5;
231
+ gz11 = fract(gz11) - 0.5;
232
+ vec4 gw11 = vec4(0.75) - abs(gx11) - abs(gy11) - abs(gz11);
233
+ vec4 sw11 = step(gw11, vec4(0.0));
234
+ gx11 -= sw11 * (step(0.0, gx11) - 0.5);
235
+ gy11 -= sw11 * (step(0.0, gy11) - 0.5);
236
+
237
+ vec4 g0000 = vec4(gx00.x,gy00.x,gz00.x,gw00.x);
238
+ vec4 g1000 = vec4(gx00.y,gy00.y,gz00.y,gw00.y);
239
+ vec4 g0100 = vec4(gx00.z,gy00.z,gz00.z,gw00.z);
240
+ vec4 g1100 = vec4(gx00.w,gy00.w,gz00.w,gw00.w);
241
+ vec4 g0010 = vec4(gx10.x,gy10.x,gz10.x,gw10.x);
242
+ vec4 g1010 = vec4(gx10.y,gy10.y,gz10.y,gw10.y);
243
+ vec4 g0110 = vec4(gx10.z,gy10.z,gz10.z,gw10.z);
244
+ vec4 g1110 = vec4(gx10.w,gy10.w,gz10.w,gw10.w);
245
+ vec4 g0001 = vec4(gx01.x,gy01.x,gz01.x,gw01.x);
246
+ vec4 g1001 = vec4(gx01.y,gy01.y,gz01.y,gw01.y);
247
+ vec4 g0101 = vec4(gx01.z,gy01.z,gz01.z,gw01.z);
248
+ vec4 g1101 = vec4(gx01.w,gy01.w,gz01.w,gw01.w);
249
+ vec4 g0011 = vec4(gx11.x,gy11.x,gz11.x,gw11.x);
250
+ vec4 g1011 = vec4(gx11.y,gy11.y,gz11.y,gw11.y);
251
+ vec4 g0111 = vec4(gx11.z,gy11.z,gz11.z,gw11.z);
252
+ vec4 g1111 = vec4(gx11.w,gy11.w,gz11.w,gw11.w);
253
+
254
+ vec4 norm00 = taylorInvSqrt(vec4(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100)));
255
+ g0000 *= norm00.x;
256
+ g0100 *= norm00.y;
257
+ g1000 *= norm00.z;
258
+ g1100 *= norm00.w;
259
+
260
+ vec4 norm01 = taylorInvSqrt(vec4(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101)));
261
+ g0001 *= norm01.x;
262
+ g0101 *= norm01.y;
263
+ g1001 *= norm01.z;
264
+ g1101 *= norm01.w;
265
+
266
+ vec4 norm10 = taylorInvSqrt(vec4(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110)));
267
+ g0010 *= norm10.x;
268
+ g0110 *= norm10.y;
269
+ g1010 *= norm10.z;
270
+ g1110 *= norm10.w;
271
+
272
+ vec4 norm11 = taylorInvSqrt(vec4(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111)));
273
+ g0011 *= norm11.x;
274
+ g0111 *= norm11.y;
275
+ g1011 *= norm11.z;
276
+ g1111 *= norm11.w;
277
+
278
+ float n0000 = dot(g0000, Pf0);
279
+ float n1000 = dot(g1000, vec4(Pf1.x, Pf0.yzw));
280
+ float n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.zw));
281
+ float n1100 = dot(g1100, vec4(Pf1.xy, Pf0.zw));
282
+ float n0010 = dot(g0010, vec4(Pf0.xy, Pf1.z, Pf0.w));
283
+ float n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w));
284
+ float n0110 = dot(g0110, vec4(Pf0.x, Pf1.yz, Pf0.w));
285
+ float n1110 = dot(g1110, vec4(Pf1.xyz, Pf0.w));
286
+ float n0001 = dot(g0001, vec4(Pf0.xyz, Pf1.w));
287
+ float n1001 = dot(g1001, vec4(Pf1.x, Pf0.yz, Pf1.w));
288
+ float n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w));
289
+ float n1101 = dot(g1101, vec4(Pf1.xy, Pf0.z, Pf1.w));
290
+ float n0011 = dot(g0011, vec4(Pf0.xy, Pf1.zw));
291
+ float n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.zw));
292
+ float n0111 = dot(g0111, vec4(Pf0.x, Pf1.yzw));
293
+ float n1111 = dot(g1111, Pf1);
294
+
295
+ vec4 fade_xyzw = fade(Pf0);
296
+ vec4 n_0w = mix(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w);
297
+ vec4 n_1w = mix(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w);
298
+ vec4 n_zw = mix(n_0w, n_1w, fade_xyzw.z);
299
+ vec2 n_yzw = mix(n_zw.xy, n_zw.zw, fade_xyzw.y);
300
+ float n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);
301
+ return 2.2 * n_xyzw;
302
+ }