Merge branch 'master' into blender2.8
[blender.git] / source / blender / gpu / shaders / gpu_shader_material.glsl
index cecfa0e39f96c9b828b0628544bec0894107514b..265dc8ab28e712e04039087a90a4a34a8c87c2ee 100644 (file)
@@ -2533,8 +2533,7 @@ uint hash(int kx, int ky, int kz)
 
 float bits_to_01(uint bits)
 {
-       float x = float(bits) * (1.0 / float(0xffffffffu));
-       return x;
+       return (float(bits) / 4294967295.0);
 }
 
 float cellnoise(vec3 p)
@@ -3658,17 +3657,29 @@ float noise_perlin(float x, float y, float z)
        float v = noise_fade(fy);
        float w = noise_fade(fz);
 
-       float result;
+       float noise_u[2], noise_v[2];
+
+       noise_u[0] = noise_nerp(u,
+               noise_grad(hash(X, Y, Z), fx, fy, fz),
+               noise_grad(hash(X + 1, Y, Z), fx - 1.0, fy, fz));
+
+       noise_u[1] = noise_nerp(u,
+               noise_grad(hash(X, Y + 1, Z), fx, fy - 1.0, fz),
+               noise_grad(hash(X + 1, Y + 1, Z), fx - 1.0, fy - 1.0, fz));
+
+       noise_v[0] = noise_nerp(v, noise_u[0], noise_u[1]);
+
+       noise_u[0] = noise_nerp(u,
+               noise_grad(hash(X, Y, Z + 1), fx, fy, fz - 1.0),
+               noise_grad(hash(X + 1, Y, Z + 1), fx - 1.0, fy, fz - 1.0));
+
+       noise_u[1] = noise_nerp(u,
+               noise_grad(hash(X, Y + 1, Z + 1), fx, fy - 1.0, fz - 1.0),
+               noise_grad(hash(X + 1, Y + 1, Z + 1), fx - 1.0, fy - 1.0, fz - 1.0));
+
+       noise_v[1] = noise_nerp(v, noise_u[0], noise_u[1]);
 
-       result = noise_nerp(w, noise_nerp(v, noise_nerp(u, noise_grad(hash(X, Y, Z), fx, fy, fz),
-                                                       noise_grad(hash(X + 1, Y, Z), fx - 1.0, fy, fz)),
-                                         noise_nerp(u, noise_grad(hash(X, Y + 1, Z), fx, fy - 1.0, fz),
-                                                    noise_grad(hash(X + 1, Y + 1, Z), fx - 1.0, fy - 1.0, fz))),
-                           noise_nerp(v, noise_nerp(u, noise_grad(hash(X, Y, Z + 1), fx, fy, fz - 1.0),
-                                                    noise_grad(hash(X + 1, Y, Z + 1), fx - 1.0, fy, fz - 1.0)),
-                                      noise_nerp(u, noise_grad(hash(X, Y + 1, Z + 1), fx, fy - 1.0, fz - 1.0),
-                                                 noise_grad(hash(X + 1, Y + 1, Z + 1), fx - 1.0, fy - 1.0, fz - 1.0))));
-       return noise_scale3(result);
+       return noise_scale3(noise_nerp(w, noise_v[0], noise_v[1]));
 }
 
 float noise(vec3 p)