1
0
Fork 0
Univerxel/deps/FastNoise2/include/FastNoise/Generators/DomainWarpFractal.inl

72 lines
2.5 KiB
C++

#include "FastSIMD/InlInclude.h"
#include "DomainWarpFractal.h"
template<typename FS>
class FS_T<FastNoise::DomainWarpFractalProgressive, FS> : public virtual FastNoise::DomainWarpFractalProgressive, public FS_T<FastNoise::Fractal<FastNoise::DomainWarp>, FS>
{
FASTSIMD_DECLARE_FS_TYPES;
FASTNOISE_IMPL_GEN_T;
template<typename... P>
FS_INLINE float32v GenT( int32v seed, P... pos ) const
{
auto* warp = this->GetSourceSIMD( mSource );
float32v amp = float32v( mFractalBounding ) * this->GetSourceValue( warp->GetWarpAmplitude(), seed, pos... );
float32v freq = float32v( warp->GetWarpFrequency() );
int32v seedInc = seed;
float32v gain = this->GetSourceValue( mGain, seed, pos... );
float32v lacunarity( mLacunarity );
warp->Warp( seedInc, amp, (pos * freq)..., pos... );
for (int i = 1; i < mOctaves; i++)
{
seedInc -= int32v( -1 );
freq *= lacunarity;
amp *= gain;
warp->Warp( seedInc, amp, (pos * freq)..., pos... );
}
return this->GetSourceValue( warp->GetWarpSource(), seed, pos... );
}
};
template<typename FS>
class FS_T<FastNoise::DomainWarpFractalIndependant, FS> : public virtual FastNoise::DomainWarpFractalIndependant, public FS_T<FastNoise::Fractal<FastNoise::DomainWarp>, FS>
{
FASTSIMD_DECLARE_FS_TYPES;
FASTNOISE_IMPL_GEN_T;
template<typename... P>
FS_INLINE float32v GenT( int32v seed, P... pos ) const
{
return [this, seed] ( std::remove_reference_t<P>... noisePos, std::remove_reference_t<P>... warpPos )
{
auto* warp = this->GetSourceSIMD( mSource );
float32v amp = float32v( mFractalBounding ) * this->GetSourceValue( warp->GetWarpAmplitude(), seed, noisePos... );
float32v freq = float32v( warp->GetWarpFrequency() );
int32v seedInc = seed;
float32v gain = this->GetSourceValue( mGain, seed, noisePos... );
float32v lacunarity( mLacunarity );
warp->Warp( seedInc, amp, (noisePos * freq)..., warpPos... );
for( int i = 1; i < mOctaves; i++ )
{
seedInc -= int32v( -1 );
freq *= lacunarity;
amp *= gain;
warp->Warp( seedInc, amp, (noisePos * freq)..., warpPos... );
}
return this->GetSourceValue( warp->GetWarpSource(), seed, warpPos... );
} ( pos..., pos... );
}
};