ashton 0.0.1alpha → 0.0.2alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+ }