Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/NewFastSIMD' into NewFastSIMD
Browse files Browse the repository at this point in the history
  • Loading branch information
Auburn committed Feb 26, 2025
2 parents ef2a604 + 16dd2ef commit 5cf601a
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 64 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
69 changes: 22 additions & 47 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 @@ -125,19 +95,19 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F

mask32v maskX1 = xGreaterEqualY & xGreaterEqualZ;
mask32v maskY1 = FS::BitwiseAndNot( yGreaterEqualZ, xGreaterEqualY );
mask32v maskZ1 = FS::BitwiseAndNot( ~xGreaterEqualZ, yGreaterEqualZ );
mask32v maskZ1 = xGreaterEqualZ | yGreaterEqualZ; // Inv masked

mask32v nMaskX2 = ~( xGreaterEqualY | xGreaterEqualZ );
mask32v nMaskY2 = xGreaterEqualY & ~yGreaterEqualZ;
mask32v nMaskX2 = xGreaterEqualY | xGreaterEqualZ; // Inv masked
mask32v nMaskY2 = FS::BitwiseAndNot( xGreaterEqualY, yGreaterEqualZ );
mask32v nMaskZ2 = xGreaterEqualZ & yGreaterEqualZ;

float32v dx3 = dx0 - float32v( kReflectUnskew3 * 3 + 1 );
float32v dy3 = dy0 - float32v( kReflectUnskew3 * 3 + 1 );
float32v dz3 = dz0 - float32v( kReflectUnskew3 * 3 + 1 );
float32v dx1 = FS::MaskedSub( maskX1, dx3, float32v( 1 ) ); // kReflectUnskew3 * 3 + 1 = kReflectUnskew3, so dx0 - kReflectUnskew3 = dx3
float32v dy1 = FS::MaskedSub( maskY1, dy3, float32v( 1 ) );
float32v dz1 = FS::MaskedSub( maskZ1, dz3, float32v( 1 ) );
float32v dx2 = FS::MaskedIncrement( nMaskX2, dx0 ); // kReflectUnskew3 * 2 - 1 = 0, so dx0 + ( kReflectUnskew3 * 2 - 1 ) = dx0
float32v dz1 = FS::InvMaskedSub( maskZ1, dz3, float32v( 1 ) );
float32v dx2 = FS::MaskedIncrement( ~nMaskX2, dx0 ); // kReflectUnskew3 * 2 - 1 = 0, so dx0 + ( kReflectUnskew3 * 2 - 1 ) = dx0
float32v dy2 = FS::MaskedIncrement( nMaskY2, dy0 );
float32v dz2 = FS::MaskedIncrement( nMaskZ2, dz0 );

Expand All @@ -157,8 +127,8 @@ class FastSIMD::DispatchClass<FastNoise::Simplex, SIMD> final : public virtual F
falloff3 *= falloff3; falloff3 *= falloff3;

float32v gradientRampValue0 = GetGradientDotCommon( HashPrimes( seed, xPrimedBase, yPrimedBase, zPrimedBase ), dx0, dy0, dz0 );
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 );
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 );
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 );
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 );
float32v gradientRampValue3 = GetGradientDotCommon( HashPrimes( seed, xPrimedBase + int32v( Primes::X ), yPrimedBase + int32v( Primes::Y ), zPrimedBase + int32v( Primes::Z ) ), dx3, dy3, dz3 );

constexpr double kBounding = 32.69428253173828125;
Expand All @@ -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
27 changes: 19 additions & 8 deletions tools/NodeEditor/FastNoiseNodeEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,6 @@ void FastNoiseNodeEditor::Node::GeneratePreview( bool nodeTreeChanged, bool benc
genRGB->SetSource( scale );
scale->SetSource( generator );
scale->SetScaling( editor.mNodeScale );

FastNoise::SmartNode<FastNoise::ConvertRGBA8> l(nullptr);

auto startTime = std::chrono::high_resolution_clock::now();

Expand Down Expand Up @@ -335,7 +333,7 @@ bool FastNoiseNodeEditor::MetadataMenuItem::CanDraw( std::function<bool( const F

const FastNoise::Metadata* FastNoiseNodeEditor::MetadataMenuItem::DrawUI( std::function<bool( const FastNoise::Metadata* )> isValid, bool drawGroups ) const
{
std::string format = FastNoise::Metadata::FormatMetadataNodeName( metadata, true );
std::string format = FastNoise::Metadata::FormatMetadataNodeName( metadata, drawGroups );

if( ImGui::MenuItem( format.c_str() ) )
{
Expand Down Expand Up @@ -589,6 +587,7 @@ void FastNoiseNodeEditor::SetupSettingsHandlers()

FastNoiseNodeEditor::FastNoiseNodeEditor( NodeEditorApp& nodeEditorApp ) :
mNodeEditorApp( nodeEditorApp ),
mMainContext( ImGui::GetCurrentContext() ),
mOverheadNode( *this, new FastNoise::NodeData( &FastNoise::Metadata::Get<FastNoise::Constant>() ), false )
{
if( !mNodeEditorApp.IsDetachedNodeGraph() )
Expand Down Expand Up @@ -830,9 +829,10 @@ void FastNoiseNodeEditor::Draw( const Matrix4& transformation, const Matrix4& pr
OpenStandaloneNodeGraph();
}

ImGui::SetCurrentContext( mMainContext );
DoHelp();

DoContextMenu();
ImGui::SetCurrentContext( ImNodes::GetNodeEditorImGuiContext() );

DoNodes();

Expand Down Expand Up @@ -1048,10 +1048,19 @@ void FastNoiseNodeEditor::DoNodes()
}

ImNodes::EndNodeTitleBar();
ImGuiID popupId = ImGui::GetItemID();

if( ImGui::IsMouseReleased( ImGuiMouseButton_Right ) && ImGui::IsItemHovered( ImGuiHoveredFlags_AllowWhenBlockedByPopup ) )
{
ImGui::SetCurrentContext( mMainContext );
ImGui::OpenPopup( popupId );
}

ImGui::SetCurrentContext( mMainContext );
// Right click node title to change node type
ImGui::PushStyleVar( ImGuiStyleVar_WindowPadding, ImVec2( 4, 4 ) );
if( ImGui::BeginPopupContextItem() )

if( ImGui::BeginPopupEx( popupId, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings ) )
{
if( ImGui::MenuItem( "Copy Encoded Node Tree" ) )
{
Expand All @@ -1074,7 +1083,7 @@ void FastNoiseNodeEditor::DoNodes()
MatchingMembers( newMetadata->memberNodeLookups, nodeMetadata->memberNodeLookups ) &&
MatchingMembers( newMetadata->memberHybrids, nodeMetadata->memberHybrids ) )
{
nodeMetadata = newMetadata;
nodeMetadata = newMetadata;
}
else
{
Expand Down Expand Up @@ -1104,7 +1113,7 @@ void FastNoiseNodeEditor::DoNodes()
links.pop();
}

*node.second.data = std::move( newData );
*node.second.data = std::move( newData );
}

node.second.GeneratePreview();
Expand All @@ -1114,6 +1123,8 @@ void FastNoiseNodeEditor::DoNodes()
}
ImGui::PopStyleVar();

ImGui::SetCurrentContext( ImNodes::GetNodeEditorImGuiContext() );

ImGui::PushItemWidth( 90.0f );

ImNodes::PushAttributeFlag( ImNodesAttributeFlags_EnableLinkCreationOnSnap );
Expand Down Expand Up @@ -1286,7 +1297,7 @@ void FastNoiseNodeEditor::DoHelp()
ImGui::Text( " Help" );
if( ImGui::IsItemHovered() )
{
ImGui::PushStyleVar( ImGuiStyleVar_WindowPadding, ImVec2( 4.f, 4.f ) );
ImGui::PushStyleVar( ImGuiStyleVar_WindowPadding, ImVec2( 6.f, 6.f ) );
ImGui::BeginTooltip();
constexpr float alignPx = 110;

Expand Down
1 change: 1 addition & 0 deletions tools/NodeEditor/FastNoiseNodeEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ namespace Magnum
void UpdateSelected();

NodeEditorApp& mNodeEditorApp;
ImGuiContext* mMainContext;

std::unordered_map<FastNoise::NodeData*, Node> mNodes;
FastNoise::NodeData* mDroppedLinkNode = nullptr;
Expand Down

0 comments on commit 5cf601a

Please sign in to comment.