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:
commit
a282ba2e0e
13
docs/changelog/perlin-noise.md
Normal file
13
docs/changelog/perlin-noise.md
Normal file
@ -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/worklet/WorkletMapTopology.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace source
|
||||
{
|
||||
namespace perlin
|
||||
#include <time.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
struct PerlinNoiseWorklet : public vtkm::worklet::WorkletVisitPointsWithCells
|
||||
{
|
||||
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 yi = static_cast<vtkm::Id>(pos[1]) % this->Repeat;
|
||||
vtkm::Id zi = static_cast<vtkm::Id>(pos[2]) % this->Repeat;
|
||||
vtkm::FloatDefault xf = pos[0] - xi;
|
||||
vtkm::FloatDefault yf = pos[1] - yi;
|
||||
vtkm::FloatDefault zf = pos[2] - zi;
|
||||
vtkm::FloatDefault xf = static_cast<vtkm::FloatDefault>(pos[0] - xi);
|
||||
vtkm::FloatDefault yf = static_cast<vtkm::FloatDefault>(pos[1] - yi);
|
||||
vtkm::FloatDefault zf = static_cast<vtkm::FloatDefault>(pos[2] - zi);
|
||||
vtkm::FloatDefault u = this->Fade(xf);
|
||||
vtkm::FloatDefault v = this->Fade(yf);
|
||||
vtkm::FloatDefault w = this->Fade(zf);
|
||||
@ -158,7 +157,7 @@ private:
|
||||
rng.seed(this->Seed);
|
||||
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);
|
||||
auto permsPortal = perms.WritePortal();
|
||||
for (auto i = 0; i < permsPortal.GetNumberOfValues(); ++i)
|
||||
@ -175,9 +174,37 @@ private:
|
||||
|
||||
vtkm::IdComponent TableSize;
|
||||
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
|
||||
{
|
||||
@ -198,7 +225,7 @@ vtkm::cont::DataSet PerlinNoise::Execute() const
|
||||
|
||||
auto tableSize = static_cast<vtkm::IdComponent>(
|
||||
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");
|
||||
dataSet = noiseGenerator.Execute(dataSet);
|
||||
|
||||
|
@ -30,19 +30,10 @@ class VTKM_SOURCE_EXPORT PerlinNoise final : public vtkm::source::Source
|
||||
{
|
||||
public:
|
||||
///Construct a PerlinNoise with Cell Dimensions
|
||||
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::IdComponent seed)
|
||||
: Dims(dims)
|
||||
, Origin(origin)
|
||||
, Seed(seed)
|
||||
{
|
||||
}
|
||||
VTKM_CONT PerlinNoise(vtkm::Id3 dims);
|
||||
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed);
|
||||
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin);
|
||||
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed);
|
||||
|
||||
vtkm::IdComponent GetSeed() const { return this->Seed; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user