Home | History | Annotate | Download | only in gtc
      1 ///////////////////////////////////////////////////////////////////////////////////
      2 /// OpenGL Mathematics (glm.g-truc.net)
      3 ///
      4 /// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
      5 /// Permission is hereby granted, free of charge, to any person obtaining a copy
      6 /// of this software and associated documentation files (the "Software"), to deal
      7 /// in the Software without restriction, including without limitation the rights
      8 /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9 /// copies of the Software, and to permit persons to whom the Software is
     10 /// furnished to do so, subject to the following conditions:
     11 /// 
     12 /// The above copyright notice and this permission notice shall be included in
     13 /// all copies or substantial portions of the Software.
     14 /// 
     15 /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16 /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17 /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     18 /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19 /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20 /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     21 /// THE SOFTWARE.
     22 ///
     23 /// @ref gtc_noise
     24 /// @file glm/gtc/noise.inl
     25 /// @date 2011-04-21 / 2012-04-07
     26 /// @author Christophe Riccio
     27 ///////////////////////////////////////////////////////////////////////////////////
     28 // Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": 
     29 // https://github.com/ashima/webgl-noise 
     30 // Following Stefan Gustavson's paper "Simplex noise demystified": 
     31 // http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
     32 ///////////////////////////////////////////////////////////////////////////////////
     33 
     34 #include "../geometric.hpp"
     35 #include "../common.hpp"
     36 #include "../vector_relational.hpp"
     37 #include "../detail/_noise.hpp"
     38 
     39 namespace glm{
     40 namespace gtc
     41 {
     42 	template <typename T, precision P>
     43 	GLM_FUNC_QUALIFIER detail::tvec4<T, P> grad4(T const & j, detail::tvec4<T, P> const & ip)
     44 	{
     45 		detail::tvec3<T, P> pXYZ = floor(fract(detail::tvec3<T, P>(j) * detail::tvec3<T, P>(ip)) * T(7)) * ip[2] - T(1);
     46 		T pW = static_cast<T>(1.5) - dot(abs(pXYZ), detail::tvec3<T, P>(1));
     47 		detail::tvec4<T, P> s = detail::tvec4<T, P>(lessThan(detail::tvec4<T, P>(pXYZ, pW), detail::tvec4<T, P>(0.0)));
     48 		pXYZ = pXYZ + (detail::tvec3<T, P>(s) * T(2) - T(1)) * s.w; 
     49 		return detail::tvec4<T, P>(pXYZ, pW);
     50 	}
     51 }//namespace gtc
     52 
     53 	// Classic Perlin noise
     54 	template <typename T, precision P>
     55 	GLM_FUNC_QUALIFIER T perlin(detail::tvec2<T, P> const & Position)
     56 	{
     57 		detail::tvec4<T, P> Pi = glm::floor(detail::tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) + detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);
     58 		detail::tvec4<T, P> Pf = glm::fract(detail::tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) - detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);
     59 		Pi = mod(Pi, detail::tvec4<T, P>(289)); // To avoid truncation effects in permutation
     60 		detail::tvec4<T, P> ix(Pi.x, Pi.z, Pi.x, Pi.z);
     61 		detail::tvec4<T, P> iy(Pi.y, Pi.y, Pi.w, Pi.w);
     62 		detail::tvec4<T, P> fx(Pf.x, Pf.z, Pf.x, Pf.z);
     63 		detail::tvec4<T, P> fy(Pf.y, Pf.y, Pf.w, Pf.w);
     64 
     65 		detail::tvec4<T, P> i = detail::permute(detail::permute(ix) + iy);
     66 
     67 		detail::tvec4<T, P> gx = static_cast<T>(2) * glm::fract(i / T(41)) - T(1);
     68 		detail::tvec4<T, P> gy = glm::abs(gx) - T(0.5);
     69 		detail::tvec4<T, P> tx = glm::floor(gx + T(0.5));
     70 		gx = gx - tx;
     71 
     72 		detail::tvec2<T, P> g00(gx.x, gy.x);
     73 		detail::tvec2<T, P> g10(gx.y, gy.y);
     74 		detail::tvec2<T, P> g01(gx.z, gy.z);
     75 		detail::tvec2<T, P> g11(gx.w, gy.w);
     76 
     77 		detail::tvec4<T, P> norm = taylorInvSqrt(detail::tvec4<T, P>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
     78 		g00 *= norm.x;  
     79 		g01 *= norm.y;  
     80 		g10 *= norm.z;  
     81 		g11 *= norm.w;  
     82 
     83 		T n00 = dot(g00, detail::tvec2<T, P>(fx.x, fy.x));
     84 		T n10 = dot(g10, detail::tvec2<T, P>(fx.y, fy.y));
     85 		T n01 = dot(g01, detail::tvec2<T, P>(fx.z, fy.z));
     86 		T n11 = dot(g11, detail::tvec2<T, P>(fx.w, fy.w));
     87 
     88 		detail::tvec2<T, P> fade_xy = fade(detail::tvec2<T, P>(Pf.x, Pf.y));
     89 		detail::tvec2<T, P> n_x = mix(detail::tvec2<T, P>(n00, n01), detail::tvec2<T, P>(n10, n11), fade_xy.x);
     90 		T n_xy = mix(n_x.x, n_x.y, fade_xy.y);
     91 		return T(2.3) * n_xy;
     92 	}
     93 
     94 	// Classic Perlin noise
     95 	template <typename T, precision P>
     96 	GLM_FUNC_QUALIFIER T perlin(detail::tvec3<T, P> const & Position)
     97 	{
     98 		detail::tvec3<T, P> Pi0 = floor(Position); // Integer part for indexing
     99 		detail::tvec3<T, P> Pi1 = Pi0 + T(1); // Integer part + 1
    100 		Pi0 = mod289(Pi0);
    101 		Pi1 = mod289(Pi1);
    102 		detail::tvec3<T, P> Pf0 = fract(Position); // Fractional part for interpolation
    103 		detail::tvec3<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0
    104 		detail::tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
    105 		detail::tvec4<T, P> iy = detail::tvec4<T, P>(detail::tvec2<T, P>(Pi0.y), detail::tvec2<T, P>(Pi1.y));
    106 		detail::tvec4<T, P> iz0(Pi0.z);
    107 		detail::tvec4<T, P> iz1(Pi1.z);
    108 
    109 		detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);
    110 		detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);
    111 		detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);
    112 
    113 		detail::tvec4<T, P> gx0 = ixy0 * T(1.0 / 7.0);
    114 		detail::tvec4<T, P> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5);
    115 		gx0 = fract(gx0);
    116 		detail::tvec4<T, P> gz0 = detail::tvec4<T, P>(0.5) - abs(gx0) - abs(gy0);
    117 		detail::tvec4<T, P> sz0 = step(gz0, detail::tvec4<T, P>(0.0));
    118 		gx0 -= sz0 * (step(T(0), gx0) - T(0.5));
    119 		gy0 -= sz0 * (step(T(0), gy0) - T(0.5));
    120 
    121 		detail::tvec4<T, P> gx1 = ixy1 * T(1.0 / 7.0);
    122 		detail::tvec4<T, P> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5);
    123 		gx1 = fract(gx1);
    124 		detail::tvec4<T, P> gz1 = detail::tvec4<T, P>(0.5) - abs(gx1) - abs(gy1);
    125 		detail::tvec4<T, P> sz1 = step(gz1, detail::tvec4<T, P>(0.0));
    126 		gx1 -= sz1 * (step(T(0), gx1) - T(0.5));
    127 		gy1 -= sz1 * (step(T(0), gy1) - T(0.5));
    128 
    129 		detail::tvec3<T, P> g000(gx0.x, gy0.x, gz0.x);
    130 		detail::tvec3<T, P> g100(gx0.y, gy0.y, gz0.y);
    131 		detail::tvec3<T, P> g010(gx0.z, gy0.z, gz0.z);
    132 		detail::tvec3<T, P> g110(gx0.w, gy0.w, gz0.w);
    133 		detail::tvec3<T, P> g001(gx1.x, gy1.x, gz1.x);
    134 		detail::tvec3<T, P> g101(gx1.y, gy1.y, gz1.y);
    135 		detail::tvec3<T, P> g011(gx1.z, gy1.z, gz1.z);
    136 		detail::tvec3<T, P> g111(gx1.w, gy1.w, gz1.w);
    137 
    138 		detail::tvec4<T, P> norm0 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
    139 		g000 *= norm0.x;
    140 		g010 *= norm0.y;
    141 		g100 *= norm0.z;
    142 		g110 *= norm0.w;
    143 		detail::tvec4<T, P> norm1 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
    144 		g001 *= norm1.x;
    145 		g011 *= norm1.y;
    146 		g101 *= norm1.z;
    147 		g111 *= norm1.w;
    148 
    149 		T n000 = dot(g000, Pf0);
    150 		T n100 = dot(g100, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z));
    151 		T n010 = dot(g010, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z));
    152 		T n110 = dot(g110, detail::tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z));
    153 		T n001 = dot(g001, detail::tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z));
    154 		T n101 = dot(g101, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z));
    155 		T n011 = dot(g011, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z));
    156 		T n111 = dot(g111, Pf1);
    157 
    158 		detail::tvec3<T, P> fade_xyz = fade(Pf0);
    159 		detail::tvec4<T, P> n_z = mix(detail::tvec4<T, P>(n000, n100, n010, n110), detail::tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z);
    160 		detail::tvec2<T, P> n_yz = mix(detail::tvec2<T, P>(n_z.x, n_z.y), detail::tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y);
    161 		T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); 
    162 		return T(2.2) * n_xyz;
    163 	}
    164 	/*
    165 	// Classic Perlin noise
    166 	template <typename T, precision P>
    167 	GLM_FUNC_QUALIFIER T perlin(detail::tvec3<T, P> const & P)
    168 	{
    169 		detail::tvec3<T, P> Pi0 = floor(P); // Integer part for indexing
    170 		detail::tvec3<T, P> Pi1 = Pi0 + T(1); // Integer part + 1
    171 		Pi0 = mod(Pi0, T(289));
    172 		Pi1 = mod(Pi1, T(289));
    173 		detail::tvec3<T, P> Pf0 = fract(P); // Fractional part for interpolation
    174 		detail::tvec3<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0
    175 		detail::tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
    176 		detail::tvec4<T, P> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y);
    177 		detail::tvec4<T, P> iz0(Pi0.z);
    178 		detail::tvec4<T, P> iz1(Pi1.z);
    179 
    180 		detail::tvec4<T, P> ixy = permute(permute(ix) + iy);
    181 		detail::tvec4<T, P> ixy0 = permute(ixy + iz0);
    182 		detail::tvec4<T, P> ixy1 = permute(ixy + iz1);
    183 
    184 		detail::tvec4<T, P> gx0 = ixy0 / T(7);
    185 		detail::tvec4<T, P> gy0 = fract(floor(gx0) / T(7)) - T(0.5);
    186 		gx0 = fract(gx0);
    187 		detail::tvec4<T, P> gz0 = detail::tvec4<T, P>(0.5) - abs(gx0) - abs(gy0);
    188 		detail::tvec4<T, P> sz0 = step(gz0, detail::tvec4<T, P>(0.0));
    189 		gx0 -= sz0 * (step(0.0, gx0) - T(0.5));
    190 		gy0 -= sz0 * (step(0.0, gy0) - T(0.5));
    191 
    192 		detail::tvec4<T, P> gx1 = ixy1 / T(7);
    193 		detail::tvec4<T, P> gy1 = fract(floor(gx1) / T(7)) - T(0.5);
    194 		gx1 = fract(gx1);
    195 		detail::tvec4<T, P> gz1 = detail::tvec4<T, P>(0.5) - abs(gx1) - abs(gy1);
    196 		detail::tvec4<T, P> sz1 = step(gz1, detail::tvec4<T, P>(0.0));
    197 		gx1 -= sz1 * (step(T(0), gx1) - T(0.5));
    198 		gy1 -= sz1 * (step(T(0), gy1) - T(0.5));
    199 
    200 		detail::tvec3<T, P> g000(gx0.x, gy0.x, gz0.x);
    201 		detail::tvec3<T, P> g100(gx0.y, gy0.y, gz0.y);
    202 		detail::tvec3<T, P> g010(gx0.z, gy0.z, gz0.z);
    203 		detail::tvec3<T, P> g110(gx0.w, gy0.w, gz0.w);
    204 		detail::tvec3<T, P> g001(gx1.x, gy1.x, gz1.x);
    205 		detail::tvec3<T, P> g101(gx1.y, gy1.y, gz1.y);
    206 		detail::tvec3<T, P> g011(gx1.z, gy1.z, gz1.z);
    207 		detail::tvec3<T, P> g111(gx1.w, gy1.w, gz1.w);
    208 
    209 		detail::tvec4<T, P> norm0 = taylorInvSqrt(detail::tvec4<T, P>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
    210 		g000 *= norm0.x;
    211 		g010 *= norm0.y;
    212 		g100 *= norm0.z;
    213 		g110 *= norm0.w;
    214 		detail::tvec4<T, P> norm1 = taylorInvSqrt(detail::tvec4<T, P>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
    215 		g001 *= norm1.x;
    216 		g011 *= norm1.y;
    217 		g101 *= norm1.z;
    218 		g111 *= norm1.w;
    219 
    220 		T n000 = dot(g000, Pf0);
    221 		T n100 = dot(g100, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z));
    222 		T n010 = dot(g010, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z));
    223 		T n110 = dot(g110, detail::tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z));
    224 		T n001 = dot(g001, detail::tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z));
    225 		T n101 = dot(g101, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z));
    226 		T n011 = dot(g011, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z));
    227 		T n111 = dot(g111, Pf1);
    228 
    229 		detail::tvec3<T, P> fade_xyz = fade(Pf0);
    230 		detail::tvec4<T, P> n_z = mix(detail::tvec4<T, P>(n000, n100, n010, n110), detail::tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z);
    231 		detail::tvec2<T, P> n_yz = mix(
    232 			detail::tvec2<T, P>(n_z.x, n_z.y), 
    233 			detail::tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y);
    234 		T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); 
    235 		return T(2.2) * n_xyz;
    236 	}
    237 	*/
    238 	// Classic Perlin noise
    239 	template <typename T, precision P>
    240 	GLM_FUNC_QUALIFIER T perlin(detail::tvec4<T, P> const & Position)
    241 	{
    242 		detail::tvec4<T, P> Pi0 = floor(Position);	// Integer part for indexing
    243 		detail::tvec4<T, P> Pi1 = Pi0 + T(1);		// Integer part + 1
    244 		Pi0 = mod(Pi0, detail::tvec4<T, P>(289));
    245 		Pi1 = mod(Pi1, detail::tvec4<T, P>(289));
    246 		detail::tvec4<T, P> Pf0 = fract(Position);	// Fractional part for interpolation
    247 		detail::tvec4<T, P> Pf1 = Pf0 - T(1);		// Fractional part - 1.0
    248 		detail::tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
    249 		detail::tvec4<T, P> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y);
    250 		detail::tvec4<T, P> iz0(Pi0.z);
    251 		detail::tvec4<T, P> iz1(Pi1.z);
    252 		detail::tvec4<T, P> iw0(Pi0.w);
    253 		detail::tvec4<T, P> iw1(Pi1.w);
    254 
    255 		detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);
    256 		detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);
    257 		detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);
    258 		detail::tvec4<T, P> ixy00 = detail::permute(ixy0 + iw0);
    259 		detail::tvec4<T, P> ixy01 = detail::permute(ixy0 + iw1);
    260 		detail::tvec4<T, P> ixy10 = detail::permute(ixy1 + iw0);
    261 		detail::tvec4<T, P> ixy11 = detail::permute(ixy1 + iw1);
    262 
    263 		detail::tvec4<T, P> gx00 = ixy00 / T(7);
    264 		detail::tvec4<T, P> gy00 = floor(gx00) / T(7);
    265 		detail::tvec4<T, P> gz00 = floor(gy00) / T(6);
    266 		gx00 = fract(gx00) - T(0.5);
    267 		gy00 = fract(gy00) - T(0.5);
    268 		gz00 = fract(gz00) - T(0.5);
    269 		detail::tvec4<T, P> gw00 = detail::tvec4<T, P>(0.75) - abs(gx00) - abs(gy00) - abs(gz00);
    270 		detail::tvec4<T, P> sw00 = step(gw00, detail::tvec4<T, P>(0.0));
    271 		gx00 -= sw00 * (step(T(0), gx00) - T(0.5));
    272 		gy00 -= sw00 * (step(T(0), gy00) - T(0.5));
    273 
    274 		detail::tvec4<T, P> gx01 = ixy01 / T(7);
    275 		detail::tvec4<T, P> gy01 = floor(gx01) / T(7);
    276 		detail::tvec4<T, P> gz01 = floor(gy01) / T(6);
    277 		gx01 = fract(gx01) - T(0.5);
    278 		gy01 = fract(gy01) - T(0.5);
    279 		gz01 = fract(gz01) - T(0.5);
    280 		detail::tvec4<T, P> gw01 = detail::tvec4<T, P>(0.75) - abs(gx01) - abs(gy01) - abs(gz01);
    281 		detail::tvec4<T, P> sw01 = step(gw01, detail::tvec4<T, P>(0.0));
    282 		gx01 -= sw01 * (step(T(0), gx01) - T(0.5));
    283 		gy01 -= sw01 * (step(T(0), gy01) - T(0.5));
    284 
    285 		detail::tvec4<T, P> gx10 = ixy10 / T(7);
    286 		detail::tvec4<T, P> gy10 = floor(gx10) / T(7);
    287 		detail::tvec4<T, P> gz10 = floor(gy10) / T(6);
    288 		gx10 = fract(gx10) - T(0.5);
    289 		gy10 = fract(gy10) - T(0.5);
    290 		gz10 = fract(gz10) - T(0.5);
    291 		detail::tvec4<T, P> gw10 = detail::tvec4<T, P>(0.75) - abs(gx10) - abs(gy10) - abs(gz10);
    292 		detail::tvec4<T, P> sw10 = step(gw10, detail::tvec4<T, P>(0));
    293 		gx10 -= sw10 * (step(T(0), gx10) - T(0.5));
    294 		gy10 -= sw10 * (step(T(0), gy10) - T(0.5));
    295 
    296 		detail::tvec4<T, P> gx11 = ixy11 / T(7);
    297 		detail::tvec4<T, P> gy11 = floor(gx11) / T(7);
    298 		detail::tvec4<T, P> gz11 = floor(gy11) / T(6);
    299 		gx11 = fract(gx11) - T(0.5);
    300 		gy11 = fract(gy11) - T(0.5);
    301 		gz11 = fract(gz11) - T(0.5);
    302 		detail::tvec4<T, P> gw11 = detail::tvec4<T, P>(0.75) - abs(gx11) - abs(gy11) - abs(gz11);
    303 		detail::tvec4<T, P> sw11 = step(gw11, detail::tvec4<T, P>(0.0));
    304 		gx11 -= sw11 * (step(T(0), gx11) - T(0.5));
    305 		gy11 -= sw11 * (step(T(0), gy11) - T(0.5));
    306 
    307 		detail::tvec4<T, P> g0000(gx00.x, gy00.x, gz00.x, gw00.x);
    308 		detail::tvec4<T, P> g1000(gx00.y, gy00.y, gz00.y, gw00.y);
    309 		detail::tvec4<T, P> g0100(gx00.z, gy00.z, gz00.z, gw00.z);
    310 		detail::tvec4<T, P> g1100(gx00.w, gy00.w, gz00.w, gw00.w);
    311 		detail::tvec4<T, P> g0010(gx10.x, gy10.x, gz10.x, gw10.x);
    312 		detail::tvec4<T, P> g1010(gx10.y, gy10.y, gz10.y, gw10.y);
    313 		detail::tvec4<T, P> g0110(gx10.z, gy10.z, gz10.z, gw10.z);
    314 		detail::tvec4<T, P> g1110(gx10.w, gy10.w, gz10.w, gw10.w);
    315 		detail::tvec4<T, P> g0001(gx01.x, gy01.x, gz01.x, gw01.x);
    316 		detail::tvec4<T, P> g1001(gx01.y, gy01.y, gz01.y, gw01.y);
    317 		detail::tvec4<T, P> g0101(gx01.z, gy01.z, gz01.z, gw01.z);
    318 		detail::tvec4<T, P> g1101(gx01.w, gy01.w, gz01.w, gw01.w);
    319 		detail::tvec4<T, P> g0011(gx11.x, gy11.x, gz11.x, gw11.x);
    320 		detail::tvec4<T, P> g1011(gx11.y, gy11.y, gz11.y, gw11.y);
    321 		detail::tvec4<T, P> g0111(gx11.z, gy11.z, gz11.z, gw11.z);
    322 		detail::tvec4<T, P> g1111(gx11.w, gy11.w, gz11.w, gw11.w);
    323 
    324 		detail::tvec4<T, P> norm00 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100)));
    325 		g0000 *= norm00.x;
    326 		g0100 *= norm00.y;
    327 		g1000 *= norm00.z;
    328 		g1100 *= norm00.w;
    329 
    330 		detail::tvec4<T, P> norm01 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101)));
    331 		g0001 *= norm01.x;
    332 		g0101 *= norm01.y;
    333 		g1001 *= norm01.z;
    334 		g1101 *= norm01.w;
    335 
    336 		detail::tvec4<T, P> norm10 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110)));
    337 		g0010 *= norm10.x;
    338 		g0110 *= norm10.y;
    339 		g1010 *= norm10.z;
    340 		g1110 *= norm10.w;
    341 
    342 		detail::tvec4<T, P> norm11 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111)));
    343 		g0011 *= norm11.x;
    344 		g0111 *= norm11.y;
    345 		g1011 *= norm11.z;
    346 		g1111 *= norm11.w;
    347 
    348 		T n0000 = dot(g0000, Pf0);
    349 		T n1000 = dot(g1000, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf0.w));
    350 		T n0100 = dot(g0100, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf0.w));
    351 		T n1100 = dot(g1100, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf0.w));
    352 		T n0010 = dot(g0010, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf0.w));
    353 		T n1010 = dot(g1010, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf0.w));
    354 		T n0110 = dot(g0110, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf0.w));
    355 		T n1110 = dot(g1110, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf1.z, Pf0.w));
    356 		T n0001 = dot(g0001, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf0.z, Pf1.w));
    357 		T n1001 = dot(g1001, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf1.w));
    358 		T n0101 = dot(g0101, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf1.w));
    359 		T n1101 = dot(g1101, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf1.w));
    360 		T n0011 = dot(g0011, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf1.w));
    361 		T n1011 = dot(g1011, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf1.w));
    362 		T n0111 = dot(g0111, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf1.w));
    363 		T n1111 = dot(g1111, Pf1);
    364 
    365 		detail::tvec4<T, P> fade_xyzw = fade(Pf0);
    366 		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);
    367 		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);
    368 		detail::tvec4<T, P> n_zw = mix(n_0w, n_1w, fade_xyzw.z);
    369 		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);
    370 		T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);
    371 		return T(2.2) * n_xyzw;
    372 	}
    373 
    374 	// Classic Perlin noise, periodic variant
    375 	template <typename T, precision P>
    376 	GLM_FUNC_QUALIFIER T perlin(detail::tvec2<T, P> const & Position, detail::tvec2<T, P> const & rep)
    377 	{
    378 		detail::tvec4<T, P> Pi = floor(detail::tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) + detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);
    379 		detail::tvec4<T, P> Pf = fract(detail::tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) - detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);
    380 		Pi = mod(Pi, detail::tvec4<T, P>(rep.x, rep.y, rep.x, rep.y)); // To create noise with explicit period
    381 		Pi = mod(Pi, detail::tvec4<T, P>(289)); // To avoid truncation effects in permutation
    382 		detail::tvec4<T, P> ix(Pi.x, Pi.z, Pi.x, Pi.z);
    383 		detail::tvec4<T, P> iy(Pi.y, Pi.y, Pi.w, Pi.w);
    384 		detail::tvec4<T, P> fx(Pf.x, Pf.z, Pf.x, Pf.z);
    385 		detail::tvec4<T, P> fy(Pf.y, Pf.y, Pf.w, Pf.w);
    386 
    387 		detail::tvec4<T, P> i = detail::permute(detail::permute(ix) + iy);
    388 
    389 		detail::tvec4<T, P> gx = static_cast<T>(2) * fract(i / T(41)) - T(1);
    390 		detail::tvec4<T, P> gy = abs(gx) - T(0.5);
    391 		detail::tvec4<T, P> tx = floor(gx + T(0.5));
    392 		gx = gx - tx;
    393 
    394 		detail::tvec2<T, P> g00(gx.x, gy.x);
    395 		detail::tvec2<T, P> g10(gx.y, gy.y);
    396 		detail::tvec2<T, P> g01(gx.z, gy.z);
    397 		detail::tvec2<T, P> g11(gx.w, gy.w);
    398 
    399 		detail::tvec4<T, P> norm = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
    400 		g00 *= norm.x;
    401 		g01 *= norm.y;
    402 		g10 *= norm.z;
    403 		g11 *= norm.w;
    404 
    405 		T n00 = dot(g00, detail::tvec2<T, P>(fx.x, fy.x));
    406 		T n10 = dot(g10, detail::tvec2<T, P>(fx.y, fy.y));
    407 		T n01 = dot(g01, detail::tvec2<T, P>(fx.z, fy.z));
    408 		T n11 = dot(g11, detail::tvec2<T, P>(fx.w, fy.w));
    409 
    410 		detail::tvec2<T, P> fade_xy = fade(detail::tvec2<T, P>(Pf.x, Pf.y));
    411 		detail::tvec2<T, P> n_x = mix(detail::tvec2<T, P>(n00, n01), detail::tvec2<T, P>(n10, n11), fade_xy.x);
    412 		T n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    413 		return T(2.3) * n_xy;
    414 	}
    415 
    416 	// Classic Perlin noise, periodic variant
    417 	template <typename T, precision P>
    418 	GLM_FUNC_QUALIFIER T perlin(detail::tvec3<T, P> const & Position, detail::tvec3<T, P> const & rep)
    419 	{
    420 		detail::tvec3<T, P> Pi0 = mod(floor(Position), rep); // Integer part, modulo period
    421 		detail::tvec3<T, P> Pi1 = mod(Pi0 + detail::tvec3<T, P>(T(1)), rep); // Integer part + 1, mod period
    422 		Pi0 = mod(Pi0, detail::tvec3<T, P>(289));
    423 		Pi1 = mod(Pi1, detail::tvec3<T, P>(289));
    424 		detail::tvec3<T, P> Pf0 = fract(Position); // Fractional part for interpolation
    425 		detail::tvec3<T, P> Pf1 = Pf0 - detail::tvec3<T, P>(T(1)); // Fractional part - 1.0
    426 		detail::tvec4<T, P> ix = detail::tvec4<T, P>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
    427 		detail::tvec4<T, P> iy = detail::tvec4<T, P>(Pi0.y, Pi0.y, Pi1.y, Pi1.y);
    428 		detail::tvec4<T, P> iz0(Pi0.z);
    429 		detail::tvec4<T, P> iz1(Pi1.z);
    430 
    431 		detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);
    432 		detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);
    433 		detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);
    434 
    435 		detail::tvec4<T, P> gx0 = ixy0 / T(7);
    436 		detail::tvec4<T, P> gy0 = fract(floor(gx0) / T(7)) - T(0.5);
    437 		gx0 = fract(gx0);
    438 		detail::tvec4<T, P> gz0 = detail::tvec4<T, P>(0.5) - abs(gx0) - abs(gy0);
    439 		detail::tvec4<T, P> sz0 = step(gz0, detail::tvec4<T, P>(0));
    440 		gx0 -= sz0 * (step(T(0), gx0) - T(0.5));
    441 		gy0 -= sz0 * (step(T(0), gy0) - T(0.5));
    442 
    443 		detail::tvec4<T, P> gx1 = ixy1 / T(7);
    444 		detail::tvec4<T, P> gy1 = fract(floor(gx1) / T(7)) - T(0.5);
    445 		gx1 = fract(gx1);
    446 		detail::tvec4<T, P> gz1 = detail::tvec4<T, P>(0.5) - abs(gx1) - abs(gy1);
    447 		detail::tvec4<T, P> sz1 = step(gz1, detail::tvec4<T, P>(T(0)));
    448 		gx1 -= sz1 * (step(T(0), gx1) - T(0.5));
    449 		gy1 -= sz1 * (step(T(0), gy1) - T(0.5));
    450 
    451 		detail::tvec3<T, P> g000 = detail::tvec3<T, P>(gx0.x, gy0.x, gz0.x);
    452 		detail::tvec3<T, P> g100 = detail::tvec3<T, P>(gx0.y, gy0.y, gz0.y);
    453 		detail::tvec3<T, P> g010 = detail::tvec3<T, P>(gx0.z, gy0.z, gz0.z);
    454 		detail::tvec3<T, P> g110 = detail::tvec3<T, P>(gx0.w, gy0.w, gz0.w);
    455 		detail::tvec3<T, P> g001 = detail::tvec3<T, P>(gx1.x, gy1.x, gz1.x);
    456 		detail::tvec3<T, P> g101 = detail::tvec3<T, P>(gx1.y, gy1.y, gz1.y);
    457 		detail::tvec3<T, P> g011 = detail::tvec3<T, P>(gx1.z, gy1.z, gz1.z);
    458 		detail::tvec3<T, P> g111 = detail::tvec3<T, P>(gx1.w, gy1.w, gz1.w);
    459 
    460 		detail::tvec4<T, P> norm0 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
    461 		g000 *= norm0.x;
    462 		g010 *= norm0.y;
    463 		g100 *= norm0.z;
    464 		g110 *= norm0.w;
    465 		detail::tvec4<T, P> norm1 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
    466 		g001 *= norm1.x;
    467 		g011 *= norm1.y;
    468 		g101 *= norm1.z;
    469 		g111 *= norm1.w;
    470 
    471 		T n000 = dot(g000, Pf0);
    472 		T n100 = dot(g100, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z));
    473 		T n010 = dot(g010, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z));
    474 		T n110 = dot(g110, detail::tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z));
    475 		T n001 = dot(g001, detail::tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z));
    476 		T n101 = dot(g101, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z));
    477 		T n011 = dot(g011, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z));
    478 		T n111 = dot(g111, Pf1);
    479 
    480 		detail::tvec3<T, P> fade_xyz = fade(Pf0);
    481 		detail::tvec4<T, P> n_z = mix(detail::tvec4<T, P>(n000, n100, n010, n110), detail::tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z);
    482 		detail::tvec2<T, P> n_yz = mix(detail::tvec2<T, P>(n_z.x, n_z.y), detail::tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y);
    483 		T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
    484 		return T(2.2) * n_xyz;
    485 	}
    486 
    487 	// Classic Perlin noise, periodic version
    488 	template <typename T, precision P>
    489 	GLM_FUNC_QUALIFIER T perlin(detail::tvec4<T, P> const & Position, detail::tvec4<T, P> const & rep)
    490 	{
    491 		detail::tvec4<T, P> Pi0 = mod(floor(Position), rep); // Integer part modulo rep
    492 		detail::tvec4<T, P> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep
    493 		detail::tvec4<T, P> Pf0 = fract(Position); // Fractional part for interpolation
    494 		detail::tvec4<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0
    495 		detail::tvec4<T, P> ix = detail::tvec4<T, P>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
    496 		detail::tvec4<T, P> iy = detail::tvec4<T, P>(Pi0.y, Pi0.y, Pi1.y, Pi1.y);
    497 		detail::tvec4<T, P> iz0(Pi0.z);
    498 		detail::tvec4<T, P> iz1(Pi1.z);
    499 		detail::tvec4<T, P> iw0(Pi0.w);
    500 		detail::tvec4<T, P> iw1(Pi1.w);
    501 
    502 		detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);
    503 		detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);
    504 		detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);
    505 		detail::tvec4<T, P> ixy00 = detail::permute(ixy0 + iw0);
    506 		detail::tvec4<T, P> ixy01 = detail::permute(ixy0 + iw1);
    507 		detail::tvec4<T, P> ixy10 = detail::permute(ixy1 + iw0);
    508 		detail::tvec4<T, P> ixy11 = detail::permute(ixy1 + iw1);
    509 
    510 		detail::tvec4<T, P> gx00 = ixy00 / T(7);
    511 		detail::tvec4<T, P> gy00 = floor(gx00) / T(7);
    512 		detail::tvec4<T, P> gz00 = floor(gy00) / T(6);
    513 		gx00 = fract(gx00) - T(0.5);
    514 		gy00 = fract(gy00) - T(0.5);
    515 		gz00 = fract(gz00) - T(0.5);
    516 		detail::tvec4<T, P> gw00 = detail::tvec4<T, P>(0.75) - abs(gx00) - abs(gy00) - abs(gz00);
    517 		detail::tvec4<T, P> sw00 = step(gw00, detail::tvec4<T, P>(0));
    518 		gx00 -= sw00 * (step(T(0), gx00) - T(0.5));
    519 		gy00 -= sw00 * (step(T(0), gy00) - T(0.5));
    520 
    521 		detail::tvec4<T, P> gx01 = ixy01 / T(7);
    522 		detail::tvec4<T, P> gy01 = floor(gx01) / T(7);
    523 		detail::tvec4<T, P> gz01 = floor(gy01) / T(6);
    524 		gx01 = fract(gx01) - T(0.5);
    525 		gy01 = fract(gy01) - T(0.5);
    526 		gz01 = fract(gz01) - T(0.5);
    527 		detail::tvec4<T, P> gw01 = detail::tvec4<T, P>(0.75) - abs(gx01) - abs(gy01) - abs(gz01);
    528 		detail::tvec4<T, P> sw01 = step(gw01, detail::tvec4<T, P>(0.0));
    529 		gx01 -= sw01 * (step(T(0), gx01) - T(0.5));
    530 		gy01 -= sw01 * (step(T(0), gy01) - T(0.5));
    531 
    532 		detail::tvec4<T, P> gx10 = ixy10 / T(7);
    533 		detail::tvec4<T, P> gy10 = floor(gx10) / T(7);
    534 		detail::tvec4<T, P> gz10 = floor(gy10) / T(6);
    535 		gx10 = fract(gx10) - T(0.5);
    536 		gy10 = fract(gy10) - T(0.5);
    537 		gz10 = fract(gz10) - T(0.5);
    538 		detail::tvec4<T, P> gw10 = detail::tvec4<T, P>(0.75) - abs(gx10) - abs(gy10) - abs(gz10);
    539 		detail::tvec4<T, P> sw10 = step(gw10, detail::tvec4<T, P>(0.0));
    540 		gx10 -= sw10 * (step(T(0), gx10) - T(0.5));
    541 		gy10 -= sw10 * (step(T(0), gy10) - T(0.5));
    542 
    543 		detail::tvec4<T, P> gx11 = ixy11 / T(7);
    544 		detail::tvec4<T, P> gy11 = floor(gx11) / T(7);
    545 		detail::tvec4<T, P> gz11 = floor(gy11) / T(6);
    546 		gx11 = fract(gx11) - T(0.5);
    547 		gy11 = fract(gy11) - T(0.5);
    548 		gz11 = fract(gz11) - T(0.5);
    549 		detail::tvec4<T, P> gw11 = detail::tvec4<T, P>(0.75) - abs(gx11) - abs(gy11) - abs(gz11);
    550 		detail::tvec4<T, P> sw11 = step(gw11, detail::tvec4<T, P>(T(0)));
    551 		gx11 -= sw11 * (step(T(0), gx11) - T(0.5));
    552 		gy11 -= sw11 * (step(T(0), gy11) - T(0.5));
    553 
    554 		detail::tvec4<T, P> g0000(gx00.x, gy00.x, gz00.x, gw00.x);
    555 		detail::tvec4<T, P> g1000(gx00.y, gy00.y, gz00.y, gw00.y);
    556 		detail::tvec4<T, P> g0100(gx00.z, gy00.z, gz00.z, gw00.z);
    557 		detail::tvec4<T, P> g1100(gx00.w, gy00.w, gz00.w, gw00.w);
    558 		detail::tvec4<T, P> g0010(gx10.x, gy10.x, gz10.x, gw10.x);
    559 		detail::tvec4<T, P> g1010(gx10.y, gy10.y, gz10.y, gw10.y);
    560 		detail::tvec4<T, P> g0110(gx10.z, gy10.z, gz10.z, gw10.z);
    561 		detail::tvec4<T, P> g1110(gx10.w, gy10.w, gz10.w, gw10.w);
    562 		detail::tvec4<T, P> g0001(gx01.x, gy01.x, gz01.x, gw01.x);
    563 		detail::tvec4<T, P> g1001(gx01.y, gy01.y, gz01.y, gw01.y);
    564 		detail::tvec4<T, P> g0101(gx01.z, gy01.z, gz01.z, gw01.z);
    565 		detail::tvec4<T, P> g1101(gx01.w, gy01.w, gz01.w, gw01.w);
    566 		detail::tvec4<T, P> g0011(gx11.x, gy11.x, gz11.x, gw11.x);
    567 		detail::tvec4<T, P> g1011(gx11.y, gy11.y, gz11.y, gw11.y);
    568 		detail::tvec4<T, P> g0111(gx11.z, gy11.z, gz11.z, gw11.z);
    569 		detail::tvec4<T, P> g1111(gx11.w, gy11.w, gz11.w, gw11.w);
    570 
    571 		detail::tvec4<T, P> norm00 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100)));
    572 		g0000 *= norm00.x;
    573 		g0100 *= norm00.y;
    574 		g1000 *= norm00.z;
    575 		g1100 *= norm00.w;
    576 
    577 		detail::tvec4<T, P> norm01 = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101)));
    578 		g0001 *= norm01.x;
    579 		g0101 *= norm01.y;
    580 		g1001 *= norm01.z;
    581 		g1101 *= norm01.w;
    582 
    583 		detail::tvec4<T, P> norm10 = taylorInvSqrt(detail::tvec4<T, P>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110)));
    584 		g0010 *= norm10.x;
    585 		g0110 *= norm10.y;
    586 		g1010 *= norm10.z;
    587 		g1110 *= norm10.w;
    588 
    589 		detail::tvec4<T, P> norm11 = taylorInvSqrt(detail::tvec4<T, P>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111)));
    590 		g0011 *= norm11.x;
    591 		g0111 *= norm11.y;
    592 		g1011 *= norm11.z;
    593 		g1111 *= norm11.w;
    594 
    595 		T n0000 = dot(g0000, Pf0);
    596 		T n1000 = dot(g1000, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf0.w));
    597 		T n0100 = dot(g0100, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf0.w));
    598 		T n1100 = dot(g1100, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf0.w));
    599 		T n0010 = dot(g0010, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf0.w));
    600 		T n1010 = dot(g1010, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf0.w));
    601 		T n0110 = dot(g0110, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf0.w));
    602 		T n1110 = dot(g1110, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf1.z, Pf0.w));
    603 		T n0001 = dot(g0001, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf0.z, Pf1.w));
    604 		T n1001 = dot(g1001, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf1.w));
    605 		T n0101 = dot(g0101, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf1.w));
    606 		T n1101 = dot(g1101, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf1.w));
    607 		T n0011 = dot(g0011, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf1.w));
    608 		T n1011 = dot(g1011, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf1.w));
    609 		T n0111 = dot(g0111, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf1.w));
    610 		T n1111 = dot(g1111, Pf1);
    611 
    612 		detail::tvec4<T, P> fade_xyzw = fade(Pf0);
    613 		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);
    614 		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);
    615 		detail::tvec4<T, P> n_zw = mix(n_0w, n_1w, fade_xyzw.z);
    616 		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);
    617 		T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);
    618 		return T(2.2) * n_xyzw;
    619 	}
    620 
    621 	template <typename T, precision P>
    622 	GLM_FUNC_QUALIFIER T simplex(glm::detail::tvec2<T, P> const & v)
    623 	{
    624 		detail::tvec4<T, P> const C = detail::tvec4<T, P>(
    625 			T( 0.211324865405187),  // (3.0 -  sqrt(3.0)) / 6.0
    626 			T( 0.366025403784439),  //  0.5 * (sqrt(3.0)  - 1.0)
    627 			T(-0.577350269189626),	// -1.0 + 2.0 * C.x
    628 			T( 0.024390243902439)); //  1.0 / 41.0
    629 
    630 		// First corner
    631 		detail::tvec2<T, P> i  = floor(v + dot(v, detail::tvec2<T, P>(C[1])));
    632 		detail::tvec2<T, P> x0 = v -   i + dot(i, detail::tvec2<T, P>(C[0]));
    633 
    634 		// Other corners
    635 		//i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0
    636 		//i1.y = 1.0 - i1.x;
    637 		detail::tvec2<T, P> i1 = (x0.x > x0.y) ? detail::tvec2<T, P>(1, 0) : detail::tvec2<T, P>(0, 1);
    638 		// x0 = x0 - 0.0 + 0.0 * C.xx ;
    639 		// x1 = x0 - i1 + 1.0 * C.xx ;
    640 		// x2 = x0 - 1.0 + 2.0 * C.xx ;
    641 		detail::tvec4<T, P> x12 = detail::tvec4<T, P>(x0.x, x0.y, x0.x, x0.y) + detail::tvec4<T, P>(C.x, C.x, C.z, C.z);
    642 		x12 = detail::tvec4<T, P>(detail::tvec2<T, P>(x12) - i1, x12.z, x12.w);
    643 
    644 		// Permutations
    645 		i = mod(i, detail::tvec2<T, P>(289)); // Avoid truncation effects in permutation
    646 		detail::tvec3<T, P> p = detail::permute(
    647 			detail::permute(i.y + detail::tvec3<T, P>(T(0), i1.y, T(1)))
    648 			+ i.x + detail::tvec3<T, P>(T(0), i1.x, T(1)));
    649 
    650 		detail::tvec3<T, P> m = max(detail::tvec3<T, P>(0.5) - detail::tvec3<T, P>(
    651 			dot(x0, x0),
    652 			dot(detail::tvec2<T, P>(x12.x, x12.y), detail::tvec2<T, P>(x12.x, x12.y)), 
    653 			dot(detail::tvec2<T, P>(x12.z, x12.w), detail::tvec2<T, P>(x12.z, x12.w))), detail::tvec3<T, P>(0));
    654 		m = m * m ;
    655 		m = m * m ;
    656 
    657 		// Gradients: 41 points uniformly over a line, mapped onto a diamond.
    658 		// The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)
    659 
    660 		detail::tvec3<T, P> x = static_cast<T>(2) * fract(p * C.w) - T(1);
    661 		detail::tvec3<T, P> h = abs(x) - T(0.5);
    662 		detail::tvec3<T, P> ox = floor(x + T(0.5));
    663 		detail::tvec3<T, P> a0 = x - ox;
    664 
    665 		// Normalise gradients implicitly by scaling m
    666 		// Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h );
    667 		m *= static_cast<T>(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h);
    668 
    669 		// Compute final noise value at P
    670 		detail::tvec3<T, P> g;
    671 		g.x  = a0.x  * x0.x  + h.x  * x0.y;
    672 		//g.yz = a0.yz * x12.xz + h.yz * x12.yw;
    673 		g.y = a0.y * x12.x + h.y * x12.y;
    674 		g.z = a0.z * x12.z + h.z * x12.w;
    675 		return T(130) * dot(m, g);
    676 	}
    677 
    678 	template <typename T, precision P>
    679 	GLM_FUNC_QUALIFIER T simplex(detail::tvec3<T, P> const & v)
    680 	{
    681 		detail::tvec2<T, P> const C(1.0 / 6.0, 1.0 / 3.0);
    682 		detail::tvec4<T, P> const D(0.0, 0.5, 1.0, 2.0);
    683 
    684 		// First corner
    685 		detail::tvec3<T, P> i(floor(v + dot(v, detail::tvec3<T, P>(C.y))));
    686 		detail::tvec3<T, P> x0(v - i + dot(i, detail::tvec3<T, P>(C.x)));
    687 
    688 		// Other corners
    689 		detail::tvec3<T, P> g(step(detail::tvec3<T, P>(x0.y, x0.z, x0.x), x0));
    690 		detail::tvec3<T, P> l(T(1) - g);
    691 		detail::tvec3<T, P> i1(min(g, detail::tvec3<T, P>(l.z, l.x, l.y)));
    692 		detail::tvec3<T, P> i2(max(g, detail::tvec3<T, P>(l.z, l.x, l.y)));
    693 
    694 		//   x0 = x0 - 0.0 + 0.0 * C.xxx;
    695 		//   x1 = x0 - i1  + 1.0 * C.xxx;
    696 		//   x2 = x0 - i2  + 2.0 * C.xxx;
    697 		//   x3 = x0 - 1.0 + 3.0 * C.xxx;
    698 		detail::tvec3<T, P> x1(x0 - i1 + C.x);
    699 		detail::tvec3<T, P> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y
    700 		detail::tvec3<T, P> x3(x0 - D.y);      // -1.0+3.0*C.x = -0.5 = -D.y
    701 
    702 		// Permutations
    703 		i = mod289(i); 
    704 		detail::tvec4<T, P> p(detail::permute(detail::permute(detail::permute(
    705 			i.z + detail::tvec4<T, P>(T(0), i1.z, i2.z, T(1))) +
    706 			i.y + detail::tvec4<T, P>(T(0), i1.y, i2.y, T(1))) +
    707 			i.x + detail::tvec4<T, P>(T(0), i1.x, i2.x, T(1))));
    708 
    709 		// Gradients: 7x7 points over a square, mapped onto an octahedron.
    710 		// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
    711 		T n_ = static_cast<T>(0.142857142857); // 1.0/7.0
    712 		detail::tvec3<T, P> ns(n_ * detail::tvec3<T, P>(D.w, D.y, D.z) - detail::tvec3<T, P>(D.x, D.z, D.x));
    713 
    714 		detail::tvec4<T, P> j(p - T(49) * floor(p * ns.z * ns.z));  //  mod(p,7*7)
    715 
    716 		detail::tvec4<T, P> x_(floor(j * ns.z));
    717 		detail::tvec4<T, P> y_(floor(j - T(7) * x_));    // mod(j,N)
    718 
    719 		detail::tvec4<T, P> x(x_ * ns.x + ns.y);
    720 		detail::tvec4<T, P> y(y_ * ns.x + ns.y);
    721 		detail::tvec4<T, P> h(T(1) - abs(x) - abs(y));
    722 
    723 		detail::tvec4<T, P> b0(x.x, x.y, y.x, y.y);
    724 		detail::tvec4<T, P> b1(x.z, x.w, y.z, y.w);
    725 
    726 		// vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;
    727 		// vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;
    728 		detail::tvec4<T, P> s0(floor(b0) * T(2) + T(1));
    729 		detail::tvec4<T, P> s1(floor(b1) * T(2) + T(1));
    730 		detail::tvec4<T, P> sh(-step(h, detail::tvec4<T, P>(0.0)));
    731 
    732 		detail::tvec4<T, P> a0 = detail::tvec4<T, P>(b0.x, b0.z, b0.y, b0.w) + detail::tvec4<T, P>(s0.x, s0.z, s0.y, s0.w) * detail::tvec4<T, P>(sh.x, sh.x, sh.y, sh.y);
    733 		detail::tvec4<T, P> a1 = detail::tvec4<T, P>(b1.x, b1.z, b1.y, b1.w) + detail::tvec4<T, P>(s1.x, s1.z, s1.y, s1.w) * detail::tvec4<T, P>(sh.z, sh.z, sh.w, sh.w);
    734 
    735 		detail::tvec3<T, P> p0(a0.x, a0.y, h.x);
    736 		detail::tvec3<T, P> p1(a0.z, a0.w, h.y);
    737 		detail::tvec3<T, P> p2(a1.x, a1.y, h.z);
    738 		detail::tvec3<T, P> p3(a1.z, a1.w, h.w);
    739 
    740 		// Normalise gradients
    741 		detail::tvec4<T, P> norm = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
    742 		p0 *= norm.x;
    743 		p1 *= norm.y;
    744 		p2 *= norm.z;
    745 		p3 *= norm.w;
    746 
    747 		// Mix final noise value
    748 		detail::tvec4<T, P> m = max(T(0.6) - detail::tvec4<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), detail::tvec4<T, P>(0));
    749 		m = m * m;
    750 		return T(42) * dot(m * m, detail::tvec4<T, P>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));
    751 	}
    752 
    753 	template <typename T, precision P>
    754 	GLM_FUNC_QUALIFIER T simplex(detail::tvec4<T, P> const & v)
    755 	{
    756 		detail::tvec4<T, P> const C(
    757 			0.138196601125011,  // (5 - sqrt(5))/20  G4
    758 			0.276393202250021,  // 2 * G4
    759 			0.414589803375032,  // 3 * G4
    760 			-0.447213595499958); // -1 + 4 * G4
    761 
    762 		// (sqrt(5) - 1)/4 = F4, used once below
    763 		T const F4 = static_cast<T>(0.309016994374947451);
    764 
    765 		// First corner
    766 		detail::tvec4<T, P> i  = floor(v + dot(v, vec4(F4)));
    767 		detail::tvec4<T, P> x0 = v -   i + dot(i, vec4(C.x));
    768 
    769 		// Other corners
    770 
    771 		// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)
    772 		detail::tvec4<T, P> i0;
    773 		detail::tvec3<T, P> isX = step(detail::tvec3<T, P>(x0.y, x0.z, x0.w), detail::tvec3<T, P>(x0.x));
    774 		detail::tvec3<T, P> isYZ = step(detail::tvec3<T, P>(x0.z, x0.w, x0.w), detail::tvec3<T, P>(x0.y, x0.y, x0.z));
    775 		//  i0.x = dot(isX, vec3(1.0));
    776 		//i0.x = isX.x + isX.y + isX.z;
    777 		//i0.yzw = static_cast<T>(1) - isX;
    778 		i0 = detail::tvec4<T, P>(isX.x + isX.y + isX.z, T(1) - isX);
    779 		//  i0.y += dot(isYZ.xy, vec2(1.0));
    780 		i0.y += isYZ.x + isYZ.y;
    781 		//i0.zw += 1.0 - detail::tvec2<T, P>(isYZ.x, isYZ.y);
    782 		i0.z += static_cast<T>(1) - isYZ.x;
    783 		i0.w += static_cast<T>(1) - isYZ.y;
    784 		i0.z += isYZ.z;
    785 		i0.w += static_cast<T>(1) - isYZ.z;
    786 
    787 		// i0 now contains the unique values 0,1,2,3 in each channel
    788 		detail::tvec4<T, P> i3 = clamp(i0, T(0), T(1));
    789 		detail::tvec4<T, P> i2 = clamp(i0 - T(1), T(0), T(1));
    790 		detail::tvec4<T, P> i1 = clamp(i0 - T(2), T(0), T(1));
    791 
    792 		//  x0 = x0 - 0.0 + 0.0 * C.xxxx
    793 		//  x1 = x0 - i1  + 0.0 * C.xxxx
    794 		//  x2 = x0 - i2  + 0.0 * C.xxxx
    795 		//  x3 = x0 - i3  + 0.0 * C.xxxx
    796 		//  x4 = x0 - 1.0 + 4.0 * C.xxxx
    797 		detail::tvec4<T, P> x1 = x0 - i1 + C.x;
    798 		detail::tvec4<T, P> x2 = x0 - i2 + C.y;
    799 		detail::tvec4<T, P> x3 = x0 - i3 + C.z;
    800 		detail::tvec4<T, P> x4 = x0 + C.w;
    801 
    802 		// Permutations
    803 		i = mod(i, detail::tvec4<T, P>(289)); 
    804 		T j0 = detail::permute(detail::permute(detail::permute(detail::permute(i.w) + i.z) + i.y) + i.x);
    805 		detail::tvec4<T, P> j1 = detail::permute(detail::permute(detail::permute(detail::permute(
    806 			i.w + detail::tvec4<T, P>(i1.w, i2.w, i3.w, T(1))) +
    807 			i.z + detail::tvec4<T, P>(i1.z, i2.z, i3.z, T(1))) +
    808 			i.y + detail::tvec4<T, P>(i1.y, i2.y, i3.y, T(1))) +
    809 			i.x + detail::tvec4<T, P>(i1.x, i2.x, i3.x, T(1)));
    810 
    811 		// Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope
    812 		// 7*7*6 = 294, which is close to the ring size 17*17 = 289.
    813 		detail::tvec4<T, P> ip = detail::tvec4<T, P>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0));
    814 
    815 		detail::tvec4<T, P> p0 = gtc::grad4(j0,   ip);
    816 		detail::tvec4<T, P> p1 = gtc::grad4(j1.x, ip);
    817 		detail::tvec4<T, P> p2 = gtc::grad4(j1.y, ip);
    818 		detail::tvec4<T, P> p3 = gtc::grad4(j1.z, ip);
    819 		detail::tvec4<T, P> p4 = gtc::grad4(j1.w, ip);
    820 
    821 		// Normalise gradients
    822 		detail::tvec4<T, P> norm = detail::taylorInvSqrt(detail::tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
    823 		p0 *= norm.x;
    824 		p1 *= norm.y;
    825 		p2 *= norm.z;
    826 		p3 *= norm.w;
    827 		p4 *= detail::taylorInvSqrt(dot(p4, p4));
    828 
    829 		// Mix contributions from the five corners
    830 		detail::tvec3<T, P> m0 = max(T(0.6) - detail::tvec3<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), detail::tvec3<T, P>(0));
    831 		detail::tvec2<T, P> m1 = max(T(0.6) - detail::tvec2<T, P>(dot(x3, x3), dot(x4, x4)             ), detail::tvec2<T, P>(0));
    832 		m0 = m0 * m0;
    833 		m1 = m1 * m1;
    834 		return T(49) * 
    835 			(dot(m0 * m0, detail::tvec3<T, P>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + 
    836 			dot(m1 * m1, detail::tvec2<T, P>(dot(p3, x3), dot(p4, x4))));
    837 	}
    838 }//namespace glm
    839