4
4
template <FastSIMD::FeatureSet SIMD>
5
5
class FastSIMD ::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual FastNoise::Simplex, public FastSIMD::DispatchClass<FastNoise::VariableRange<ScalableGenerator>, SIMD>
6
6
{
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
38
8
{
39
9
this ->ScalePositions ( x, y );
40
10
@@ -90,7 +60,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
90
60
-1 / kBounding , 1 / kBounding );
91
61
}
92
62
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
94
64
{
95
65
this ->ScalePositions ( x, y, z );
96
66
@@ -125,19 +95,19 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
125
95
126
96
mask32v maskX1 = xGreaterEqualY & xGreaterEqualZ;
127
97
mask32v maskY1 = FS::BitwiseAndNot ( yGreaterEqualZ, xGreaterEqualY );
128
- mask32v maskZ1 = FS::BitwiseAndNot ( ~ xGreaterEqualZ, yGreaterEqualZ );
98
+ mask32v maskZ1 = xGreaterEqualZ | yGreaterEqualZ; // Inv masked
129
99
130
- mask32v nMaskX2 = ~( xGreaterEqualY | xGreaterEqualZ );
131
- mask32v nMaskY2 = xGreaterEqualY & ~ yGreaterEqualZ;
100
+ mask32v nMaskX2 = xGreaterEqualY | xGreaterEqualZ; // Inv masked
101
+ mask32v nMaskY2 = FS::BitwiseAndNot ( xGreaterEqualY, yGreaterEqualZ ) ;
132
102
mask32v nMaskZ2 = xGreaterEqualZ & yGreaterEqualZ;
133
103
134
104
float32v dx3 = dx0 - float32v ( kReflectUnskew3 * 3 + 1 );
135
105
float32v dy3 = dy0 - float32v ( kReflectUnskew3 * 3 + 1 );
136
106
float32v dz3 = dz0 - float32v ( kReflectUnskew3 * 3 + 1 );
137
107
float32v dx1 = FS::MaskedSub ( maskX1, dx3, float32v ( 1 ) ); // kReflectUnskew3 * 3 + 1 = kReflectUnskew3, so dx0 - kReflectUnskew3 = dx3
138
108
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
141
111
float32v dy2 = FS::MaskedIncrement ( nMaskY2, dy0 );
142
112
float32v dz2 = FS::MaskedIncrement ( nMaskZ2, dz0 );
143
113
@@ -157,8 +127,8 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
157
127
falloff3 *= falloff3; falloff3 *= falloff3;
158
128
159
129
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 );
162
132
float32v gradientRampValue3 = GetGradientDotCommon ( HashPrimes ( seed, xPrimedBase + int32v ( Primes::X ), yPrimedBase + int32v ( Primes::Y ), zPrimedBase + int32v ( Primes::Z ) ), dx3, dy3, dz3 );
163
133
164
134
constexpr double kBounding = 32.69428253173828125 ;
@@ -167,7 +137,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
167
137
-1 / kBounding , 1 / kBounding );
168
138
}
169
139
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
171
141
{
172
142
this ->ScalePositions ( x, y, z, w );
173
143
@@ -309,7 +279,12 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
309
279
-1 / kBounding , 1 / kBounding );
310
280
}
311
281
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
313
288
{
314
289
this ->ScalePositions ( x, y );
315
290
@@ -394,7 +369,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
394
369
return this ->ScaleOutput ( value, -1 / kBounding , 1 / kBounding );
395
370
}
396
371
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
398
373
{
399
374
this ->ScalePositions ( x, y, z );
400
375
@@ -545,7 +520,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
545
520
float32v falloffBase = FS::Min ( ( sign ^ dxBase ) - falloffBaseStemB, float32v ( 0 .0f ) );
546
521
value = FS::FMulAdd ( ( falloffBase * falloffBase ) * ( falloffBase * falloffBase ), gradientRampValue, value );
547
522
}
548
-
523
+
549
524
// Vertex <1, 0, 0> or <-1, 0, 0>
550
525
{
551
526
mask32v signMask = xNormal < float32v ( 0 );
@@ -593,10 +568,10 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
593
568
return this ->ScaleOutput ( value, -1 / kBounding , 1 / kBounding );
594
569
}
595
570
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
597
572
{
598
573
this ->ScalePositions ( x, y, z, w );
599
-
574
+
600
575
constexpr double kRoot5 = 2.2360679774997896964091736687313 ;
601
576
constexpr double kSkew4 = 1.0 / ( kRoot5 + 1.0 );
602
577
constexpr double kUnskew4 = -1.0 / ( kRoot5 + 5.0 );
@@ -658,7 +633,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
658
633
maxScore -= wNormal;
659
634
considerVertex ( maxScore, moveMaskBits, yNormal, 0b1010 );
660
635
considerVertex ( maxScore, moveMaskBits, zNormal, 0b1100 );
661
-
636
+
662
637
mask32v moveX = ( moveMaskBits & int32v ( 0b0001 ) ) != int32v ( 0 );
663
638
mask32v moveY = ( moveMaskBits & int32v ( 0b0010 ) ) != int32v ( 0 );
664
639
mask32v moveZ = ( moveMaskBits & int32v ( 0b0100 ) ) != int32v ( 0 );
@@ -679,7 +654,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
679
654
int32v yPrimedBase = FS::Convert<int32_t >( ySkewedBase ) * int32v ( Primes::Y );
680
655
int32v zPrimedBase = FS::Convert<int32_t >( zSkewedBase ) * int32v ( Primes::Z );
681
656
int32v wPrimedBase = FS::Convert<int32_t >( wSkewedBase ) * int32v ( Primes::W );
682
-
657
+
683
658
float32v skewedCoordinateSum = dxSkewed + dySkewed + dzSkewed + dwSkewed;
684
659
float32v twiceUnskewDelta = float32v ( kTwiceUnskew4 ) * skewedCoordinateSum;
685
660
float32v xNormal = dxSkewed + twiceUnskewDelta;
0 commit comments