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/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; }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user