Merge topic 'perlin-noise-updates'

a200592f4 Fix type conversions in PerlinNoise source
4204e4455 Add changelog for perline noise generator
8f6705450 Allow automatic seed for perlin noise

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2650
This commit is contained in:
Kenneth Moreland 2021-12-17 14:38:12 +00:00 committed by Kitware Robot
commit a282ba2e0e
3 changed files with 56 additions and 25 deletions

@ -0,0 +1,13 @@
# Perlin Noise source
A new source, `vtkm::source::PerlinNoise`, has been added. As the name
would imply, this source generates a pseudo-random [Perlin
noise](https://en.wikipedia.org/wiki/Perlin_noise) field.
The field is defined on a 3D grid of specified dimensions. A seed value can
also be specified to enforce consistent results in, for example, test code.
If a seed is not specified, one will be created based on the current system
time.
Perlin noise is useful for testing purposes as it can create non-trivial
geometry at pretty much any scale.

@ -15,12 +15,11 @@
#include <vtkm/source/PerlinNoise.h> #include <vtkm/source/PerlinNoise.h>
#include <vtkm/worklet/WorkletMapTopology.h> #include <vtkm/worklet/WorkletMapTopology.h>
namespace vtkm #include <time.h>
{
namespace source namespace
{
namespace perlin
{ {
struct PerlinNoiseWorklet : public vtkm::worklet::WorkletVisitPointsWithCells struct PerlinNoiseWorklet : public vtkm::worklet::WorkletVisitPointsWithCells
{ {
using ControlSignature = void(CellSetIn, FieldInPoint, WholeArrayIn, FieldOut noise); using ControlSignature = void(CellSetIn, FieldInPoint, WholeArrayIn, FieldOut noise);
@ -39,9 +38,9 @@ struct PerlinNoiseWorklet : public vtkm::worklet::WorkletVisitPointsWithCells
vtkm::Id xi = static_cast<vtkm::Id>(pos[0]) % this->Repeat; vtkm::Id xi = static_cast<vtkm::Id>(pos[0]) % this->Repeat;
vtkm::Id yi = static_cast<vtkm::Id>(pos[1]) % this->Repeat; vtkm::Id yi = static_cast<vtkm::Id>(pos[1]) % this->Repeat;
vtkm::Id zi = static_cast<vtkm::Id>(pos[2]) % this->Repeat; vtkm::Id zi = static_cast<vtkm::Id>(pos[2]) % this->Repeat;
vtkm::FloatDefault xf = pos[0] - xi; vtkm::FloatDefault xf = static_cast<vtkm::FloatDefault>(pos[0] - xi);
vtkm::FloatDefault yf = pos[1] - yi; vtkm::FloatDefault yf = static_cast<vtkm::FloatDefault>(pos[1] - yi);
vtkm::FloatDefault zf = pos[2] - zi; vtkm::FloatDefault zf = static_cast<vtkm::FloatDefault>(pos[2] - zi);
vtkm::FloatDefault u = this->Fade(xf); vtkm::FloatDefault u = this->Fade(xf);
vtkm::FloatDefault v = this->Fade(yf); vtkm::FloatDefault v = this->Fade(yf);
vtkm::FloatDefault w = this->Fade(zf); vtkm::FloatDefault w = this->Fade(zf);
@ -158,7 +157,7 @@ private:
rng.seed(this->Seed); rng.seed(this->Seed);
std::uniform_int_distribution<vtkm::Id> distribution(0, this->TableSize - 1); std::uniform_int_distribution<vtkm::Id> distribution(0, this->TableSize - 1);
vtkm::cont::ArrayHandle<vtkm::FloatDefault> perms; vtkm::cont::ArrayHandle<vtkm::Id> perms;
perms.Allocate(this->TableSize); perms.Allocate(this->TableSize);
auto permsPortal = perms.WritePortal(); auto permsPortal = perms.WritePortal();
for (auto i = 0; i < permsPortal.GetNumberOfValues(); ++i) for (auto i = 0; i < permsPortal.GetNumberOfValues(); ++i)
@ -175,9 +174,37 @@ private:
vtkm::IdComponent TableSize; vtkm::IdComponent TableSize;
vtkm::Id Seed; vtkm::Id Seed;
vtkm::cont::ArrayHandle<vtkm::FloatDefault> Permutations; vtkm::cont::ArrayHandle<vtkm::Id> Permutations;
}; };
} // namespace perlin
} // anonymous namespace
namespace vtkm
{
namespace source
{
PerlinNoise::PerlinNoise(vtkm::Id3 dims)
: PerlinNoise(dims, vtkm::Vec3f(0), static_cast<vtkm::IdComponent>(time(NULL)))
{
}
PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed)
: PerlinNoise(dims, vtkm::Vec3f(0), seed)
{
}
PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin)
: PerlinNoise(dims, origin, static_cast<vtkm::IdComponent>(time(NULL)))
{
}
PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed)
: Dims(dims)
, Origin(origin)
, Seed(seed)
{
}
vtkm::cont::DataSet PerlinNoise::Execute() const vtkm::cont::DataSet PerlinNoise::Execute() const
{ {
@ -198,7 +225,7 @@ vtkm::cont::DataSet PerlinNoise::Execute() const
auto tableSize = static_cast<vtkm::IdComponent>( auto tableSize = static_cast<vtkm::IdComponent>(
vtkm::Max(this->Dims[0], vtkm::Max(this->Dims[1], this->Dims[2]))); vtkm::Max(this->Dims[0], vtkm::Max(this->Dims[1], this->Dims[2])));
perlin::PerlinNoiseField noiseGenerator(tableSize, this->Seed); PerlinNoiseField noiseGenerator(tableSize, this->Seed);
noiseGenerator.SetOutputFieldName("perlinnoise"); noiseGenerator.SetOutputFieldName("perlinnoise");
dataSet = noiseGenerator.Execute(dataSet); dataSet = noiseGenerator.Execute(dataSet);

@ -30,19 +30,10 @@ class VTKM_SOURCE_EXPORT PerlinNoise final : public vtkm::source::Source
{ {
public: public:
///Construct a PerlinNoise with Cell Dimensions ///Construct a PerlinNoise with Cell Dimensions
VTKM_CONT VTKM_CONT PerlinNoise(vtkm::Id3 dims);
PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed) VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed);
: PerlinNoise(dims, vtkm::Vec3f(0), seed) VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin);
{ VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed);
}
VTKM_CONT
PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed)
: Dims(dims)
, Origin(origin)
, Seed(seed)
{
}
vtkm::IdComponent GetSeed() const { return this->Seed; } vtkm::IdComponent GetSeed() const { return this->Seed; }