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

129 lines
3.9 KiB
C++

#include "FastSIMD/InlInclude.h"
#include "Fractal.h"
template<typename FS, typename T>
class FS_T<FastNoise::Fractal<T>, FS> : public virtual FastNoise::Fractal<T>, public FS_T<FastNoise::Generator, FS>
{
};
template<typename FS>
class FS_T<FastNoise::FractalFBm, FS> : public virtual FastNoise::FractalFBm, public FS_T<FastNoise::Fractal<>, FS>
{
FASTSIMD_DECLARE_FS_TYPES;
FASTNOISE_IMPL_GEN_T;
template<typename... P>
FS_INLINE float32v GenT( int32v seed, P... pos ) const
{
float32v gain = this->GetSourceValue( mGain , seed, pos... );
float32v sum = this->GetSourceValue( mSource, seed, pos... );
float32v lacunarity( mLacunarity );
float32v amp( 1 );
for( int i = 1; i < mOctaves; i++ )
{
seed -= int32v( -1 );
amp *= gain;
sum += this->GetSourceValue( mSource, seed, (pos *= lacunarity)... ) * amp;
}
return sum * float32v( mFractalBounding );
}
};
template<typename FS>
class FS_T<FastNoise::FractalBillow, FS> : public virtual FastNoise::FractalBillow, public FS_T<FastNoise::Fractal<>, FS>
{
FASTSIMD_DECLARE_FS_TYPES;
FASTNOISE_IMPL_GEN_T;
template<typename... P>
FS_INLINE float32v GenT( int32v seed, P... pos ) const
{
float32v sum = FS_Abs_f32( this->GetSourceValue( mSource, seed, pos... ) ) * float32v( 2 ) - float32v( 1 );
float32v gain = this->GetSourceValue( mGain, seed, pos... );
float32v lacunarity( mLacunarity );
float32v amp( 1 );
for( int i = 1; i < mOctaves; i++ )
{
seed -= int32v( -1 );
amp *= gain;
sum += (FS_Abs_f32(this->GetSourceValue( mSource, seed, (pos *= lacunarity)... ) ) * float32v( 2 ) - float32v( 1 )) * amp;
}
return sum * float32v( mFractalBounding );
}
};
template<typename FS>
class FS_T<FastNoise::FractalRidged, FS> : public virtual FastNoise::FractalRidged, public FS_T<FastNoise::Fractal<>, FS>
{
FASTSIMD_DECLARE_FS_TYPES;
FASTNOISE_IMPL_GEN_T;
template<typename... P>
FS_INLINE float32v GenT(int32v seed, P... pos) const
{
float32v sum = float32v( 1 ) - FS_Abs_f32( this->GetSourceValue( mSource, seed, pos... ) );
float32v gain = this->GetSourceValue( mGain, seed, pos... );
float32v lacunarity( mLacunarity );
float32v amp( 1 );
for( int i = 1; i < mOctaves; i++ )
{
seed -= int32v( -1 );
amp *= gain;
sum -= (float32v( 1 ) - FS_Abs_f32( this->GetSourceValue( mSource, seed, (pos *= lacunarity)... ) )) * amp;
}
return sum;
}
};
template<typename FS>
class FS_T<FastNoise::FractalRidgedMulti, FS> : public virtual FastNoise::FractalRidgedMulti, public FS_T<FastNoise::Fractal<>, FS>
{
FASTSIMD_DECLARE_FS_TYPES;
FASTNOISE_IMPL_GEN_T;
template<typename... P>
FS_INLINE float32v GenT( int32v seed, P... pos ) const
{
float32v offset( 1 );
float32v sum = offset - FS_Abs_f32( this->GetSourceValue( mSource, seed, pos... ) );
float32v gain = this->GetSourceValue( mGain, seed, pos... ) * float32v( 6 );
float32v lacunarity( mLacunarity );
float32v amp = sum;
float32v weightAmp( mWeightAmp );
float32v weight = weightAmp;
float32v totalWeight( 1.0f );
for( int i = 1; i < mOctaves; i++ )
{
amp *= gain;
amp = FS_Min_f32( FS_Max_f32( amp, float32v( 0 ) ), float32v( 1 ) );
seed -= int32v( -1 );
float32v value = offset - FS_Abs_f32( this->GetSourceValue( mSource, seed, (pos *= lacunarity)... ));
value *= amp;
amp = value;
float32v weightRecip = FS_Reciprocal_f32( float32v( weight ) );
sum += value * weightRecip;
totalWeight += weightRecip;
weight *= weightAmp;
}
return sum * float32v( mWeightBounding ) - offset;
}
};