Skip to content

Commit

Permalink
SimplexSmooth own node type
Browse files Browse the repository at this point in the history
  • Loading branch information
Auburn committed Dec 24, 2024
1 parent 619739c commit 6792ff9
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 49 deletions.
32 changes: 23 additions & 9 deletions include/FastNoise/Generators/Simplex.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@ namespace FastNoise
class Simplex : public virtual VariableRange<ScalableGenerator>
{
public:
void SetType( SimplexType value ) { mType = value; }
const Metadata& GetMetadata() const override;

protected:
SimplexType mType = SimplexType::Standard;
};

#ifdef FASTNOISE_METADATA
Expand All @@ -26,12 +22,30 @@ namespace FastNoise
description =
"Smooth gradient noise from an N dimensional simplex grid\n"
"Developed by Ken Perlin in 2001";
}
};
#endif

class SimplexSmooth : public virtual VariableRange<ScalableGenerator>
{
public:
const Metadata& GetMetadata() const override;
};

#ifdef FASTNOISE_METADATA
template<>
struct MetadataT<SimplexSmooth> : MetadataT<VariableRange<ScalableGenerator>>
{
SmartNode<> CreateNode( FastSIMD::FeatureSet ) const override;

MetadataT()
{
groups.push_back( "Coherent Noise" );

this->AddVariableEnum(
{ "Type", "Noise character style" },
SimplexType::Standard, &Simplex::SetType,
kSimplexType_Strings
);
description =
"Extra smooth gradient noise from an N dimensional simplex grid\n"
"Slower to generate than Simplex noise\n"
"Developed by K.jpg";
}
};
#endif
Expand Down
55 changes: 15 additions & 40 deletions include/FastNoise/Generators/Simplex.inl
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,7 @@
template<FastSIMD::FeatureSet SIMD>
class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual FastNoise::Simplex, public FastSIMD::DispatchClass<FastNoise::VariableRange<ScalableGenerator>, SIMD>
{
float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y ) const final
{
switch( mType ) {
case SimplexType::Standard:
return Gen_Standard( seed, x, y );
case SimplexType::Smooth:
return Gen_Smooth( seed, x, y );
}
}

float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y, float32v z ) const final
{
switch( mType ) {
case SimplexType::Standard:
return Gen_Standard( seed, x, y, z );
case SimplexType::Smooth:
return Gen_Smooth( seed, x, y, z );
}
}

float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y, float32v z, float32v w ) const final
{
switch( mType ) {
case SimplexType::Standard:
return Gen_Standard( seed, x, y, z, w );
case SimplexType::Smooth:
return Gen_Smooth( seed, x, y, z, w );
}
}

float32v FS_VECTORCALL Gen_Standard( int32v seed, float32v x, float32v y ) const
float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y ) const
{
this->ScalePositions( x, y );

Expand Down Expand Up @@ -90,7 +60,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
-1 / kBounding, 1 / kBounding );
}

float32v FS_VECTORCALL Gen_Standard( int32v seed, float32v x, float32v y, float32v z ) const
float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y, float32v z ) const
{
this->ScalePositions( x, y, z );

Expand Down Expand Up @@ -167,7 +137,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
-1 / kBounding, 1 / kBounding );
}

float32v FS_VECTORCALL Gen_Standard( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
{
this->ScalePositions( x, y, z, w );

Expand Down Expand Up @@ -309,7 +279,12 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
-1 / kBounding, 1 / kBounding );
}

float32v FS_VECTORCALL Gen_Smooth( int32v seed, float32v x, float32v y ) const
};

template<FastSIMD::FeatureSet SIMD>
class FastSIMD::DispatchClass<FastNoise::SimplexSmooth, SIMD> final : public virtual FastNoise::SimplexSmooth, public FastSIMD::DispatchClass<FastNoise::VariableRange<ScalableGenerator>, SIMD>
{
float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y ) const
{
this->ScalePositions( x, y );

Expand Down Expand Up @@ -394,7 +369,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
return this->ScaleOutput( value, -1 / kBounding, 1 / kBounding );
}

float32v FS_VECTORCALL Gen_Smooth( int32v seed, float32v x, float32v y, float32v z ) const
float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y, float32v z ) const
{
this->ScalePositions( x, y, z );

Expand Down Expand Up @@ -545,7 +520,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
float32v falloffBase = FS::Min( ( sign ^ dxBase ) - falloffBaseStemB, float32v( 0.0f ) );
value = FS::FMulAdd( ( falloffBase * falloffBase ) * ( falloffBase * falloffBase ), gradientRampValue, value );
}

// Vertex <1, 0, 0> or <-1, 0, 0>
{
mask32v signMask = xNormal < float32v( 0 );
Expand Down Expand Up @@ -593,10 +568,10 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
return this->ScaleOutput( value, -1 / kBounding, 1 / kBounding );
}

float32v FS_VECTORCALL Gen_Smooth( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
float32v FS_VECTORCALL Gen( int32v seed, float32v x, float32v y, float32v z, float32v w ) const
{
this->ScalePositions( x, y, z, w );

constexpr double kRoot5 = 2.2360679774997896964091736687313;
constexpr double kSkew4 = 1.0 / ( kRoot5 + 1.0 );
constexpr double kUnskew4 = -1.0 / ( kRoot5 + 5.0 );
Expand Down Expand Up @@ -658,7 +633,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
maxScore -= wNormal;
considerVertex( maxScore, moveMaskBits, yNormal, 0b1010 );
considerVertex( maxScore, moveMaskBits, zNormal, 0b1100 );

mask32v moveX = ( moveMaskBits & int32v( 0b0001 ) ) != int32v( 0 );
mask32v moveY = ( moveMaskBits & int32v( 0b0010 ) ) != int32v( 0 );
mask32v moveZ = ( moveMaskBits & int32v( 0b0100 ) ) != int32v( 0 );
Expand All @@ -679,7 +654,7 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
int32v yPrimedBase = FS::Convert<int32_t>( ySkewedBase ) * int32v( Primes::Y );
int32v zPrimedBase = FS::Convert<int32_t>( zSkewedBase ) * int32v( Primes::Z );
int32v wPrimedBase = FS::Convert<int32_t>( wSkewedBase ) * int32v( Primes::W );

float32v skewedCoordinateSum = dxSkewed + dySkewed + dzSkewed + dwSkewed;
float32v twiceUnskewDelta = float32v( kTwiceUnskew4 ) * skewedCoordinateSum;
float32v xNormal = dxSkewed + twiceUnskewDelta;
Expand Down
2 changes: 2 additions & 0 deletions src/FastNoise/FastSIMD_Build.inl
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ FASTNOISE_REGISTER_NODE( PositionOutput );
FASTNOISE_REGISTER_NODE( DistanceToPoint );

FASTNOISE_REGISTER_NODE( Simplex );
FASTNOISE_REGISTER_NODE( SimplexSmooth );
FASTNOISE_REGISTER_NODE( Perlin );
FASTNOISE_REGISTER_NODE( Value );

Expand All @@ -103,6 +104,7 @@ FASTNOISE_REGISTER_NODE( FractalPingPong );
FASTNOISE_REGISTER_NODE( FractalRidged );

FASTNOISE_REGISTER_NODE( DomainWarpSimplex );
//FASTNOISE_REGISTER_NODE( DomainWarpSimplexSmooth );
FASTNOISE_REGISTER_NODE( DomainWarpGradient );

FASTNOISE_REGISTER_NODE( DomainWarpFractalProgressive );
Expand Down

0 comments on commit 6792ff9

Please sign in to comment.