44template <FastSIMD::FeatureSet SIMD>
55class FastSIMD ::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual FastNoise::Simplex, public FastSIMD::DispatchClass<FastNoise::VariableRange<ScalableGenerator>, SIMD>
66{
7- float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y ) const final
8- {
9- switch ( mType ) {
10- case SimplexType::Standard:
11- return Gen_Standard ( seed, x, y );
12- case SimplexType::Smooth:
13- return Gen_Smooth ( seed, x, y );
14- }
15- }
16-
17- float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y, float32v z ) const final
18- {
19- switch ( mType ) {
20- case SimplexType::Standard:
21- return Gen_Standard ( seed, x, y, z );
22- case SimplexType::Smooth:
23- return Gen_Smooth ( seed, x, y, z );
24- }
25- }
26-
27- float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y, float32v z, float32v w ) const final
28- {
29- switch ( mType ) {
30- case SimplexType::Standard:
31- return Gen_Standard ( seed, x, y, z, w );
32- case SimplexType::Smooth:
33- return Gen_Smooth ( seed, x, y, z, w );
34- }
35- }
36-
37- float32v FS_VECTORCALL Gen_Standard ( int32v seed, float32v x, float32v y ) const
7+ float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y ) const
388 {
399 this ->ScalePositions ( x, y );
4010
@@ -90,7 +60,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
9060 -1 / kBounding , 1 / kBounding );
9161 }
9262
93- float32v FS_VECTORCALL Gen_Standard ( int32v seed, float32v x, float32v y, float32v z ) const
63+ float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y, float32v z ) const
9464 {
9565 this ->ScalePositions ( x, y, z );
9666
@@ -125,19 +95,19 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
12595
12696 mask32v maskX1 = xGreaterEqualY & xGreaterEqualZ;
12797 mask32v maskY1 = FS::BitwiseAndNot ( yGreaterEqualZ, xGreaterEqualY );
128- mask32v maskZ1 = FS::BitwiseAndNot ( ~ xGreaterEqualZ, yGreaterEqualZ );
98+ mask32v maskZ1 = xGreaterEqualZ | yGreaterEqualZ; // Inv masked
12999
130- mask32v nMaskX2 = ~( xGreaterEqualY | xGreaterEqualZ );
131- mask32v nMaskY2 = xGreaterEqualY & ~ yGreaterEqualZ;
100+ mask32v nMaskX2 = xGreaterEqualY | xGreaterEqualZ; // Inv masked
101+ mask32v nMaskY2 = FS::BitwiseAndNot ( xGreaterEqualY, yGreaterEqualZ ) ;
132102 mask32v nMaskZ2 = xGreaterEqualZ & yGreaterEqualZ;
133103
134104 float32v dx3 = dx0 - float32v ( kReflectUnskew3 * 3 + 1 );
135105 float32v dy3 = dy0 - float32v ( kReflectUnskew3 * 3 + 1 );
136106 float32v dz3 = dz0 - float32v ( kReflectUnskew3 * 3 + 1 );
137107 float32v dx1 = FS::MaskedSub ( maskX1, dx3, float32v ( 1 ) ); // kReflectUnskew3 * 3 + 1 = kReflectUnskew3, so dx0 - kReflectUnskew3 = dx3
138108 float32v dy1 = FS::MaskedSub ( maskY1, dy3, float32v ( 1 ) );
139- float32v dz1 = FS::MaskedSub ( maskZ1, dz3, float32v ( 1 ) );
140- float32v dx2 = FS::MaskedIncrement ( nMaskX2, dx0 ); // kReflectUnskew3 * 2 - 1 = 0, so dx0 + ( kReflectUnskew3 * 2 - 1 ) = dx0
109+ float32v dz1 = FS::InvMaskedSub ( maskZ1, dz3, float32v ( 1 ) );
110+ float32v dx2 = FS::MaskedIncrement ( ~ nMaskX2, dx0 ); // kReflectUnskew3 * 2 - 1 = 0, so dx0 + ( kReflectUnskew3 * 2 - 1 ) = dx0
141111 float32v dy2 = FS::MaskedIncrement ( nMaskY2, dy0 );
142112 float32v dz2 = FS::MaskedIncrement ( nMaskZ2, dz0 );
143113
@@ -157,8 +127,8 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
157127 falloff3 *= falloff3; falloff3 *= falloff3;
158128
159129 float32v gradientRampValue0 = GetGradientDotCommon ( HashPrimes ( seed, xPrimedBase, yPrimedBase, zPrimedBase ), dx0, dy0, dz0 );
160- float32v gradientRampValue1 = GetGradientDotCommon ( HashPrimes ( seed, FS::MaskedAdd ( maskX1, xPrimedBase, int32v ( Primes::X ) ), FS::MaskedAdd ( maskY1, yPrimedBase, int32v ( Primes::Y ) ), FS::MaskedAdd ( maskZ1, zPrimedBase, int32v ( Primes::Z ) ) ), dx1, dy1, dz1 );
161- float32v gradientRampValue2 = GetGradientDotCommon ( HashPrimes ( seed, FS::InvMaskedAdd ( nMaskX2, xPrimedBase, int32v ( Primes::X ) ), FS::InvMaskedAdd ( nMaskY2, yPrimedBase, int32v ( Primes::Y ) ), FS::InvMaskedAdd ( nMaskZ2, zPrimedBase, int32v ( Primes::Z ) ) ), dx2, dy2, dz2 );
130+ float32v gradientRampValue1 = GetGradientDotCommon ( HashPrimes ( seed, FS::MaskedAdd ( maskX1, xPrimedBase, int32v ( Primes::X ) ), FS::MaskedAdd ( maskY1, yPrimedBase, int32v ( Primes::Y ) ), FS::InvMaskedAdd ( maskZ1, zPrimedBase, int32v ( Primes::Z ) ) ), dx1, dy1, dz1 );
131+ float32v gradientRampValue2 = GetGradientDotCommon ( HashPrimes ( seed, FS::MaskedAdd ( nMaskX2, xPrimedBase, int32v ( Primes::X ) ), FS::InvMaskedAdd ( nMaskY2, yPrimedBase, int32v ( Primes::Y ) ), FS::InvMaskedAdd ( nMaskZ2, zPrimedBase, int32v ( Primes::Z ) ) ), dx2, dy2, dz2 );
162132 float32v gradientRampValue3 = GetGradientDotCommon ( HashPrimes ( seed, xPrimedBase + int32v ( Primes::X ), yPrimedBase + int32v ( Primes::Y ), zPrimedBase + int32v ( Primes::Z ) ), dx3, dy3, dz3 );
163133
164134 constexpr double kBounding = 32.69428253173828125 ;
@@ -167,7 +137,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
167137 -1 / kBounding , 1 / kBounding );
168138 }
169139
170- float32v FS_VECTORCALL Gen_Standard ( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
140+ float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
171141 {
172142 this ->ScalePositions ( x, y, z, w );
173143
@@ -309,7 +279,12 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
309279 -1 / kBounding , 1 / kBounding );
310280 }
311281
312- float32v FS_VECTORCALL Gen_Smooth ( int32v seed, float32v x, float32v y ) const
282+ };
283+
284+ template <FastSIMD::FeatureSet SIMD>
285+ class FastSIMD ::DispatchClass<FastNoise::SimplexSmooth, SIMD> final : public virtual FastNoise::SimplexSmooth, public FastSIMD::DispatchClass<FastNoise::VariableRange<ScalableGenerator>, SIMD>
286+ {
287+ float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y ) const
313288 {
314289 this ->ScalePositions ( x, y );
315290
@@ -394,7 +369,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
394369 return this ->ScaleOutput ( value, -1 / kBounding , 1 / kBounding );
395370 }
396371
397- float32v FS_VECTORCALL Gen_Smooth ( int32v seed, float32v x, float32v y, float32v z ) const
372+ float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y, float32v z ) const
398373 {
399374 this ->ScalePositions ( x, y, z );
400375
@@ -545,7 +520,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
545520 float32v falloffBase = FS::Min ( ( sign ^ dxBase ) - falloffBaseStemB, float32v ( 0 .0f ) );
546521 value = FS::FMulAdd ( ( falloffBase * falloffBase ) * ( falloffBase * falloffBase ), gradientRampValue, value );
547522 }
548-
523+
549524 // Vertex <1, 0, 0> or <-1, 0, 0>
550525 {
551526 mask32v signMask = xNormal < float32v ( 0 );
@@ -593,10 +568,10 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
593568 return this ->ScaleOutput ( value, -1 / kBounding , 1 / kBounding );
594569 }
595570
596- float32v FS_VECTORCALL Gen_Smooth ( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
571+ float32v FS_VECTORCALL Gen ( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
597572 {
598573 this ->ScalePositions ( x, y, z, w );
599-
574+
600575 constexpr double kRoot5 = 2.2360679774997896964091736687313 ;
601576 constexpr double kSkew4 = 1.0 / ( kRoot5 + 1.0 );
602577 constexpr double kUnskew4 = -1.0 / ( kRoot5 + 5.0 );
@@ -658,7 +633,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
658633 maxScore -= wNormal;
659634 considerVertex ( maxScore, moveMaskBits, yNormal, 0b1010 );
660635 considerVertex ( maxScore, moveMaskBits, zNormal, 0b1100 );
661-
636+
662637 mask32v moveX = ( moveMaskBits & int32v ( 0b0001 ) ) != int32v ( 0 );
663638 mask32v moveY = ( moveMaskBits & int32v ( 0b0010 ) ) != int32v ( 0 );
664639 mask32v moveZ = ( moveMaskBits & int32v ( 0b0100 ) ) != int32v ( 0 );
@@ -679,7 +654,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
679654 int32v yPrimedBase = FS::Convert<int32_t >( ySkewedBase ) * int32v ( Primes::Y );
680655 int32v zPrimedBase = FS::Convert<int32_t >( zSkewedBase ) * int32v ( Primes::Z );
681656 int32v wPrimedBase = FS::Convert<int32_t >( wSkewedBase ) * int32v ( Primes::W );
682-
657+
683658 float32v skewedCoordinateSum = dxSkewed + dySkewed + dzSkewed + dwSkewed;
684659 float32v twiceUnskewDelta = float32v ( kTwiceUnskew4 ) * skewedCoordinateSum;
685660 float32v xNormal = dxSkewed + twiceUnskewDelta;
0 commit comments