danabr75-ashton 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +0 -0
- data/LICENSE +21 -0
- data/README.md +95 -0
- data/Rakefile +42 -0
- data/examples/bloom_example.rb +59 -0
- data/examples/lighting_example.rb +127 -0
- data/examples/media/Earth.png +0 -0
- data/examples/media/LargeStar.png +0 -0
- data/examples/media/SmallStar.png +0 -0
- data/examples/media/Star.png +0 -0
- data/examples/media/Starfighter.bmp +0 -0
- data/examples/media/Starfighter.png +0 -0
- data/examples/media/simple.png +0 -0
- data/examples/noise_example.rb +94 -0
- data/examples/outline_example.rb +86 -0
- data/examples/particle_emitter_example.rb +114 -0
- data/examples/pixelate_example.rb +52 -0
- data/examples/pixelated_texture_example.rb +69 -0
- data/examples/radial_blur_example.rb +61 -0
- data/examples/shader_image_example.rb +75 -0
- data/examples/shockwave_example.rb +75 -0
- data/examples/stencil_shader_example.rb +104 -0
- data/examples/texture_render_example.rb +54 -0
- data/examples/tv_screen_and_static_example.rb +60 -0
- data/ext/ashton/GLee.c +18170 -0
- data/ext/ashton/GLee.h +17648 -0
- data/ext/ashton/ashton.c +42 -0
- data/ext/ashton/ashton.h +31 -0
- data/ext/ashton/color.c +45 -0
- data/ext/ashton/color.h +25 -0
- data/ext/ashton/common.h +41 -0
- data/ext/ashton/extconf.rb +45 -0
- data/ext/ashton/fast_math.c +30 -0
- data/ext/ashton/fast_math.h +30 -0
- data/ext/ashton/font.c +8 -0
- data/ext/ashton/font.h +16 -0
- data/ext/ashton/gosu.c +18 -0
- data/ext/ashton/gosu.h +19 -0
- data/ext/ashton/image.c +8 -0
- data/ext/ashton/image.h +16 -0
- data/ext/ashton/particle_emitter.c +788 -0
- data/ext/ashton/particle_emitter.h +171 -0
- data/ext/ashton/pixel_cache.c +237 -0
- data/ext/ashton/pixel_cache.h +58 -0
- data/ext/ashton/shader.c +9 -0
- data/ext/ashton/shader.h +16 -0
- data/ext/ashton/texture.c +442 -0
- data/ext/ashton/texture.h +63 -0
- data/ext/ashton/vendor/gl/include/GL/GL.H +1526 -0
- data/ext/ashton/window.c +8 -0
- data/ext/ashton/window.h +16 -0
- data/lib/ashton.rb +38 -0
- data/lib/ashton/gosu_ext/color.rb +25 -0
- data/lib/ashton/gosu_ext/font.rb +58 -0
- data/lib/ashton/gosu_ext/gosu_module.rb +16 -0
- data/lib/ashton/gosu_ext/image.rb +96 -0
- data/lib/ashton/gosu_ext/window.rb +79 -0
- data/lib/ashton/image_stub.rb +33 -0
- data/lib/ashton/lighting/light_source.rb +146 -0
- data/lib/ashton/lighting/manager.rb +98 -0
- data/lib/ashton/mixins/version_checking.rb +23 -0
- data/lib/ashton/particle_emitter.rb +87 -0
- data/lib/ashton/pixel_cache.rb +24 -0
- data/lib/ashton/shader.rb +386 -0
- data/lib/ashton/shaders/bloom.frag +41 -0
- data/lib/ashton/shaders/color_inversion.frag +11 -0
- data/lib/ashton/shaders/contrast.frag +16 -0
- data/lib/ashton/shaders/default.frag +22 -0
- data/lib/ashton/shaders/default.vert +14 -0
- data/lib/ashton/shaders/fade.frag +14 -0
- data/lib/ashton/shaders/grayscale.frag +15 -0
- data/lib/ashton/shaders/include/classicnoise2d.glsl +113 -0
- data/lib/ashton/shaders/include/classicnoise3d.glsl +177 -0
- data/lib/ashton/shaders/include/classicnoise4d.glsl +302 -0
- data/lib/ashton/shaders/include/noise2d.glsl +70 -0
- data/lib/ashton/shaders/include/noise3d.glsl +102 -0
- data/lib/ashton/shaders/include/noise4d.glsl +128 -0
- data/lib/ashton/shaders/include/rand.glsl +5 -0
- data/lib/ashton/shaders/lighting/distort.frag +57 -0
- data/lib/ashton/shaders/lighting/draw_shadows.frag +60 -0
- data/lib/ashton/shaders/lighting/shadow_blur.frag +60 -0
- data/lib/ashton/shaders/mezzotint.frag +22 -0
- data/lib/ashton/shaders/multitexture2.vert +19 -0
- data/lib/ashton/shaders/outline.frag +45 -0
- data/lib/ashton/shaders/pixelate.frag +48 -0
- data/lib/ashton/shaders/radial_blur.frag +63 -0
- data/lib/ashton/shaders/sepia.frag +26 -0
- data/lib/ashton/shaders/shockwave.frag +38 -0
- data/lib/ashton/shaders/signed_distance_field.frag +80 -0
- data/lib/ashton/shaders/static.frag +25 -0
- data/lib/ashton/shaders/stencil.frag +27 -0
- data/lib/ashton/shaders/tv_screen.frag +23 -0
- data/lib/ashton/signed_distance_field.rb +151 -0
- data/lib/ashton/texture.rb +186 -0
- data/lib/ashton/version.rb +3 -0
- data/lib/ashton/window_buffer.rb +16 -0
- data/spec/ashton/ashton_spec.rb +22 -0
- data/spec/ashton/gosu_ext/color_spec.rb +34 -0
- data/spec/ashton/gosu_ext/font_spec.rb +57 -0
- data/spec/ashton/gosu_ext/gosu_spec.rb +11 -0
- data/spec/ashton/gosu_ext/image_spec.rb +66 -0
- data/spec/ashton/gosu_ext/window_spec.rb +71 -0
- data/spec/ashton/image_stub_spec.rb +46 -0
- data/spec/ashton/particle_emitter_spec.rb +123 -0
- data/spec/ashton/pixel_cache_spec.rb +153 -0
- data/spec/ashton/shader_spec.rb +152 -0
- data/spec/ashton/signed_distance_field_spec.rb +163 -0
- data/spec/ashton/texture_spec.rb +347 -0
- data/spec/helper.rb +12 -0
- metadata +309 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
#version 110
|
2
|
+
|
3
|
+
// Bloom filter
|
4
|
+
// http://myheroics.wordpress.com/2008/09/04/glsl-bloom-shader/
|
5
|
+
//
|
6
|
+
// Spooner: Added uniforms for setting bloom intensity.
|
7
|
+
|
8
|
+
uniform sampler2D in_Texture; // Original in_Texture.
|
9
|
+
varying vec2 var_TexCoord; // Pixel to process on this pass
|
10
|
+
|
11
|
+
uniform float in_GlareSize; // 0.004 is good
|
12
|
+
uniform float in_Power; // 0.25 is good
|
13
|
+
|
14
|
+
void main()
|
15
|
+
{
|
16
|
+
vec4 sum = vec4(0);
|
17
|
+
int i, j;
|
18
|
+
|
19
|
+
for(i = -4; i < 4; i++)
|
20
|
+
{
|
21
|
+
for (j = -3; j < 3; j++)
|
22
|
+
{
|
23
|
+
sum += texture2D(in_Texture, var_TexCoord + vec2(j, i) * in_GlareSize) * in_Power;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
vec4 base_color = texture2D(in_Texture, var_TexCoord);
|
28
|
+
|
29
|
+
if (base_color.r < 0.3)
|
30
|
+
{
|
31
|
+
gl_FragColor = sum * sum * 0.012 + base_color;
|
32
|
+
}
|
33
|
+
else if(base_color.r < 0.5)
|
34
|
+
{
|
35
|
+
gl_FragColor = sum * sum * 0.009 + base_color;
|
36
|
+
}
|
37
|
+
else
|
38
|
+
{
|
39
|
+
gl_FragColor = sum * sum * 0.0075 + base_color;
|
40
|
+
}
|
41
|
+
}
|
@@ -0,0 +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) * in_Contrast + 0.5;
|
13
|
+
|
14
|
+
gl_FragColor.rgb = color.rgb;
|
15
|
+
gl_FragColor.a = 1.0;
|
16
|
+
}
|
@@ -0,0 +1,22 @@
|
|
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
|
+
}
|
@@ -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
|
+
}
|