vtk-m/vtkm/source/PerlinNoise.h
Kenneth Moreland 3e7cde8ecb Change auto seed behavior in PerlinNoise source
The PerlinNoise source has a mode where if a seed is not set, it will
choose a new seed every time it is executed. It did this by using the
value 0 as an indicator to do this (and initializing the Seed to 0).
However, there was a problem with one of the benchmarks that was
specifically setting the seed to 0 and getting unexpected results.

Fix the problem by adding a separate, hidden member of the PerlinNoise
class that keeps track of whether to generate new seeds or not.
2022-12-06 12:21:04 -07:00

80 lines
2.9 KiB
C++

//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
//
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//============================================================================
#ifndef vtk_m_source_PerlinNoise_h
#define vtk_m_source_PerlinNoise_h
#include <vtkm/source/Source.h>
namespace vtkm
{
namespace source
{
/**
* @brief The PerlinNoise source creates a uniform dataset.
*
* This class generates a uniform grid dataset with a tileable perlin
* noise scalar point field.
*
* The Execute method creates a complete structured dataset that have a
* scalar point field named 'perlinnoise'.
**/
class VTKM_SOURCE_EXPORT PerlinNoise final : public vtkm::source::Source
{
public:
VTKM_CONT PerlinNoise() = default;
VTKM_CONT ~PerlinNoise() = default;
VTKM_CONT PerlinNoise(const PerlinNoise&) = default;
VTKM_CONT PerlinNoise(PerlinNoise&&) = default;
VTKM_CONT PerlinNoise& operator=(const PerlinNoise&) = default;
VTKM_CONT PerlinNoise& operator=(PerlinNoise&&) = default;
VTKM_DEPRECATED(2.0, "Use SetCellDimensions or SetPointDimensions.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims);
VTKM_DEPRECATED(2.0, "Use Set*Dimensions and SetSeed.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed);
VTKM_DEPRECATED(2.0, "Use Set*Dimensions and SetOrigin.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin);
VTKM_DEPRECATED(2.0, "Use Set*Dimensions, SetOrigin, and SetSeed.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed);
VTKM_CONT vtkm::Id3 GetPointDimensions() const { return this->PointDimensions; }
VTKM_CONT void SetPointDimensions(vtkm::Id3 dims) { this->PointDimensions = dims; }
VTKM_CONT vtkm::Id3 GetCellDimensions() const { return this->PointDimensions - vtkm::Id3(1); }
VTKM_CONT void SetCellDimensions(vtkm::Id3 dims) { this->PointDimensions = dims + vtkm::Id3(1); }
VTKM_CONT vtkm::Vec3f GetOrigin() const { return this->Origin; }
VTKM_CONT void SetOrigin(const vtkm::Vec3f& origin) { this->Origin = origin; }
/// \brief The seed used for the pseudorandom number generation of the noise.
///
/// If the seed is not set, then a new, unique seed is picked each time `Execute` is run.
VTKM_CONT vtkm::IdComponent GetSeed() const { return this->Seed; }
VTKM_CONT void SetSeed(vtkm::IdComponent seed)
{
this->Seed = seed;
this->SeedSet = true;
}
private:
vtkm::cont::DataSet DoExecute() const override;
vtkm::Id3 PointDimensions = { 16, 16, 16 };
vtkm::Vec3f Origin = { 0, 0, 0 };
vtkm::IdComponent Seed = 0;
bool SeedSet = false;
};
} //namespace source
} //namespace vtkm
#endif //vtk_m_source_PerlinNoise_h