GLM_FUNC_QUALIFIER T perlin()

in endless-tunnel/app/src/main/cpp/glm/gtc/noise.inl [489:619]


	GLM_FUNC_QUALIFIER T perlin(detail::tvec4<T, P> const & Position, detail::tvec4<T, P> const & rep)
	{
		detail::tvec4<T, P> Pi0 = mod(floor(Position), rep); // Integer part modulo rep
		detail::tvec4<T, P> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep
		detail::tvec4<T, P> Pf0 = fract(Position); // Fractional part for interpolation
		detail::tvec4<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0
		detail::tvec4<T, P> ix = detail::tvec4<T, P>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
		detail::tvec4<T, P> iy = detail::tvec4<T, P>(Pi0.y, Pi0.y, Pi1.y, Pi1.y);
		detail::tvec4<T, P> iz0(Pi0.z);
		detail::tvec4<T, P> iz1(Pi1.z);
		detail::tvec4<T, P> iw0(Pi0.w);
		detail::tvec4<T, P> iw1(Pi1.w);

		detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);
		detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);
		detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);
		detail::tvec4<T, P> ixy00 = detail::permute(ixy0 + iw0);
		detail::tvec4<T, P> ixy01 = detail::permute(ixy0 + iw1);
		detail::tvec4<T, P> ixy10 = detail::permute(ixy1 + iw0);
		detail::tvec4<T, P> ixy11 = detail::permute(ixy1 + iw1);

		detail::tvec4<T, P> gx00 = ixy00 / T(7);
		detail::tvec4<T, P> gy00 = floor(gx00) / T(7);
		detail::tvec4<T, P> gz00 = floor(gy00) / T(6);
		gx00 = fract(gx00) - T(0.5);
		gy00 = fract(gy00) - T(0.5);
		gz00 = fract(gz00) - T(0.5);
		detail::tvec4<T, P> gw00 = detail::tvec4<T, P>(0.75) - abs(gx00) - abs(gy00) - abs(gz00);
		detail::tvec4<T, P> sw00 = step(gw00, detail::tvec4<T, P>(0));
		gx00 -= sw00 * (step(T(0), gx00) - T(0.5));
		gy00 -= sw00 * (step(T(0), gy00) - T(0.5));

		detail::tvec4<T, P> gx01 = ixy01 / T(7);
		detail::tvec4<T, P> gy01 = floor(gx01) / T(7);
		detail::tvec4<T, P> gz01 = floor(gy01) / T(6);
		gx01 = fract(gx01) - T(0.5);
		gy01 = fract(gy01) - T(0.5);
		gz01 = fract(gz01) - T(0.5);
		detail::tvec4<T, P> gw01 = detail::tvec4<T, P>(0.75) - abs(gx01) - abs(gy01) - abs(gz01);
		detail::tvec4<T, P> sw01 = step(gw01, detail::tvec4<T, P>(0.0));
		gx01 -= sw01 * (step(T(0), gx01) - T(0.5));
		gy01 -= sw01 * (step(T(0), gy01) - T(0.5));

		detail::tvec4<T, P> gx10 = ixy10 / T(7);
		detail::tvec4<T, P> gy10 = floor(gx10) / T(7);
		detail::tvec4<T, P> gz10 = floor(gy10) / T(6);
		gx10 = fract(gx10) - T(0.5);
		gy10 = fract(gy10) - T(0.5);
		gz10 = fract(gz10) - T(0.5);
		detail::tvec4<T, P> gw10 = detail::tvec4<T, P>(0.75) - abs(gx10) - abs(gy10) - abs(gz10);
		detail::tvec4<T, P> sw10 = step(gw10, detail::tvec4<T, P>(0.0));
		gx10 -= sw10 * (step(T(0), gx10) - T(0.5));
		gy10 -= sw10 * (step(T(0), gy10) - T(0.5));

		detail::tvec4<T, P> gx11 = ixy11 / T(7);
		detail::tvec4<T, P> gy11 = floor(gx11) / T(7);
		detail::tvec4<T, P> gz11 = floor(gy11) / T(6);
		gx11 = fract(gx11) - T(0.5);
		gy11 = fract(gy11) - T(0.5);
		gz11 = fract(gz11) - T(0.5);
		detail::tvec4<T, P> gw11 = detail::tvec4<T, P>(0.75) - abs(gx11) - abs(gy11) - abs(gz11);
		detail::tvec4<T, P> sw11 = step(gw11, detail::tvec4<T, P>(T(0)));
		gx11 -= sw11 * (step(T(0), gx11) - T(0.5));
		gy11 -= sw11 * (step(T(0), gy11) - T(0.5));

		detail::tvec4<T, P> g0000(gx00.x, gy00.x, gz00.x, gw00.x);
		detail::tvec4<T, P> g1000(gx00.y, gy00.y, gz00.y, gw00.y);
		detail::tvec4<T, P> g0100(gx00.z, gy00.z, gz00.z, gw00.z);
		detail::tvec4<T, P> g1100(gx00.w, gy00.w, gz00.w, gw00.w);
		detail::tvec4<T, P> g0010(gx10.x, gy10.x, gz10.x, gw10.x);
		detail::tvec4<T, P> g1010(gx10.y, gy10.y, gz10.y, gw10.y);
		detail::tvec4<T, P> g0110(gx10.z, gy10.z, gz10.z, gw10.z);
		detail::tvec4<T, P> g1110(gx10.w, gy10.w, gz10.w, gw10.w);
		detail::tvec4<T, P> g0001(gx01.x, gy01.x, gz01.x, gw01.x);
		detail::tvec4<T, P> g1001(gx01.y, gy01.y, gz01.y, gw01.y);
		detail::tvec4<T, P> g0101(gx01.z, gy01.z, gz01.z, gw01.z);
		detail::tvec4<T, P> g1101(gx01.w, gy01.w, gz01.w, gw01.w);
		detail::tvec4<T, P> g0011(gx11.x, gy11.x, gz11.x, gw11.x);
		detail::tvec4<T, P> g1011(gx11.y, gy11.y, gz11.y, gw11.y);
		detail::tvec4<T, P> g0111(gx11.z, gy11.z, gz11.z, gw11.z);
		detail::tvec4<T, P> g1111(gx11.w, gy11.w, gz11.w, gw11.w);

		detail::tvec4<T, P> norm00 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100)));
		g0000 *= norm00.x;
		g0100 *= norm00.y;
		g1000 *= norm00.z;
		g1100 *= norm00.w;

		detail::tvec4<T, P> norm01 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101)));
		g0001 *= norm01.x;
		g0101 *= norm01.y;
		g1001 *= norm01.z;
		g1101 *= norm01.w;

		detail::tvec4<T, P> norm10 = taylorInvSqrt(detail::tvec4<T, P>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110)));
		g0010 *= norm10.x;
		g0110 *= norm10.y;
		g1010 *= norm10.z;
		g1110 *= norm10.w;

		detail::tvec4<T, P> norm11 = taylorInvSqrt(detail::tvec4<T, P>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111)));
		g0011 *= norm11.x;
		g0111 *= norm11.y;
		g1011 *= norm11.z;
		g1111 *= norm11.w;

		T n0000 = dot(g0000, Pf0);
		T n1000 = dot(g1000, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf0.w));
		T n0100 = dot(g0100, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf0.w));
		T n1100 = dot(g1100, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf0.w));
		T n0010 = dot(g0010, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf0.w));
		T n1010 = dot(g1010, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf0.w));
		T n0110 = dot(g0110, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf0.w));
		T n1110 = dot(g1110, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf1.z, Pf0.w));
		T n0001 = dot(g0001, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf0.z, Pf1.w));
		T n1001 = dot(g1001, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf1.w));
		T n0101 = dot(g0101, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf1.w));
		T n1101 = dot(g1101, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf1.w));
		T n0011 = dot(g0011, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf1.w));
		T n1011 = dot(g1011, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf1.w));
		T n0111 = dot(g0111, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf1.w));
		T n1111 = dot(g1111, Pf1);

		detail::tvec4<T, P> fade_xyzw = fade(Pf0);
		detail::tvec4<T, P> n_0w = mix(detail::tvec4<T, P>(n0000, n1000, n0100, n1100), detail::tvec4<T, P>(n0001, n1001, n0101, n1101), fade_xyzw.w);
		detail::tvec4<T, P> n_1w = mix(detail::tvec4<T, P>(n0010, n1010, n0110, n1110), detail::tvec4<T, P>(n0011, n1011, n0111, n1111), fade_xyzw.w);
		detail::tvec4<T, P> n_zw = mix(n_0w, n_1w, fade_xyzw.z);
		detail::tvec2<T, P> n_yzw = mix(detail::tvec2<T, P>(n_zw.x, n_zw.y), detail::tvec2<T, P>(n_zw.z, n_zw.w), fade_xyzw.y);
		T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);
		return T(2.2) * n_xyzw;
	}