75 lines
2.4 KiB
C++
75 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#if HASTY
|
|
#include <hastyNoise.h>
|
|
#else
|
|
#include <FastNoiseSIMD.h>
|
|
#endif
|
|
#include <tuple>
|
|
#include "position.h"
|
|
|
|
namespace world {
|
|
/// Noise generator
|
|
class Generator {
|
|
public:
|
|
using set = float *;
|
|
#if HASTY
|
|
using noise = std::unique_ptr<HastyNoise::NoiseSIMD>;
|
|
#else
|
|
using noise = FastNoiseSIMD *;
|
|
#endif
|
|
Generator(int seed = 42): seed(seed) {
|
|
#if HASTY
|
|
printf("double!!!\n");
|
|
const size_t fastestSimd = HastyNoise::GetFastestSIMD();
|
|
densityNoise = HastyNoise::CreateNoise(seed, fastestSimd);
|
|
materialNoise = HastyNoise::CreateNoise(seed * 5, fastestSimd);
|
|
materialNoise->SetNoiseType(HastyNoise::NoiseType::Cellular); // NOTE: probably heavy
|
|
materialNoise->SetCellularReturnType(HastyNoise::CellularReturnType::Value);
|
|
materialNoise->SetCellularDistanceFunction(HastyNoise::CellularDistance::Natural);
|
|
materialNoise->SetFrequency(.1);
|
|
#else
|
|
densityNoise = FastNoiseSIMD::NewFastNoiseSIMD(seed);
|
|
materialNoise = FastNoiseSIMD::NewFastNoiseSIMD(seed * 5);
|
|
materialNoise->SetNoiseType(FastNoiseSIMD::Cellular); // NOTE: probably heavy
|
|
materialNoise->SetCellularReturnType(FastNoiseSIMD::CellValue);
|
|
materialNoise->SetCellularDistanceFunction(FastNoiseSIMD::Natural);
|
|
materialNoise->SetFrequency(.1);
|
|
#endif
|
|
}
|
|
~Generator() {
|
|
#if !HASTY
|
|
delete densityNoise;
|
|
delete materialNoise;
|
|
#endif
|
|
}
|
|
|
|
/// Get block of given size with index pos.
|
|
/// @note owning pointers, call free(set set)
|
|
inline std::pair<set, set> getChunk(const chunk_pos& pos, int size) {
|
|
auto pair = std::make_pair(
|
|
densityNoise->GetNoiseSet(pos.x * size, pos.y * size, pos.z * size, size, size, size),
|
|
materialNoise->GetNoiseSet(pos.x * size, pos.y * size, pos.z * size, size, size, size)
|
|
);
|
|
#if HASTY
|
|
return {pair.first.release(), pair.second.release()};
|
|
#else
|
|
return pair;
|
|
#endif
|
|
}
|
|
static inline void free(set set) {
|
|
#if HASTY
|
|
HastyNoise::SetDeleter()(set);
|
|
#else
|
|
FastNoiseSIMD::FreeNoiseSet(set);
|
|
#endif
|
|
}
|
|
|
|
inline int getSeed() const { return seed; }
|
|
|
|
private:
|
|
int seed;
|
|
noise densityNoise;
|
|
noise materialNoise;
|
|
};
|
|
} |