You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/FastNoise/Code/Source/FastNoiseGradientComponent.h

127 lines
5.0 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AzCore/Component/Component.h>
#include <AzCore/Asset/AssetCommon.h>
#include <AzCore/RTTI/TypeInfo.h>
#include <GradientSignal/Ebuses/GradientRequestBus.h>
#include <FastNoise/Ebuses/FastNoiseGradientRequestBus.h>
#include <External/FastNoise/FastNoise.h>
namespace AZ
{
AZ_TYPE_INFO_SPECIALIZE(FastNoise::Interp, "{E1D450B5-CE30-450F-BD29-382DA64A469B}");
AZ_TYPE_INFO_SPECIALIZE(FastNoise::NoiseType, "{0B54F0FB-F5D2-49DF-B5F8-30B209978D59}");
AZ_TYPE_INFO_SPECIALIZE(FastNoise::FractalType, "{AAC4BD68-217B-4247-A1CE-E5E98B15956F}");
AZ_TYPE_INFO_SPECIALIZE(FastNoise::CellularDistanceFunction, "{761E3584-FACD-4355-BAD6-DA4D2DAFFD8C}");
AZ_TYPE_INFO_SPECIALIZE(FastNoise::CellularReturnType, "{31CDBAC6-882C-4330-8C68-4039FE4D1A48}");
}
namespace LmbrCentral
{
template<typename, typename>
class EditorWrappedComponentBase;
}
namespace FastNoiseGem
{
class FastNoiseGradientConfig
: public AZ::ComponentConfig
{
public:
AZ_CLASS_ALLOCATOR(FastNoiseGradientConfig, AZ::SystemAllocator, 0);
AZ_RTTI(FastNoiseGradientConfig, "{831C1F11-5898-4FBF-B4CF-92B757A907A8}", AZ::ComponentConfig);
static void Reflect(AZ::ReflectContext* context);
AZ::u32 GetCellularParameterVisibility() const;
AZ::u32 GetFractalParameterVisbility() const;
AZ::u32 GetFrequencyParameterVisbility() const;
AZ::u32 GetInterpParameterVisibility() const;
int m_seed = 1;
float m_frequency = 1.f;
FastNoise::Interp m_interp = FastNoise::Interp::Quintic;
FastNoise::NoiseType m_noiseType = FastNoise::NoiseType::PerlinFractal;
int m_octaves = 4;
float m_lacunarity = 2.f;
float m_gain = 0.5;
FastNoise::FractalType m_fractalType = FastNoise::FractalType::FBM;
FastNoise::CellularDistanceFunction m_cellularDistanceFunction = FastNoise::CellularDistanceFunction::Euclidean;
FastNoise::CellularReturnType m_cellularReturnType = FastNoise::CellularReturnType::CellValue;
float m_cellularJitter = 0.45f;
};
static const AZ::Uuid FastNoiseGradientComponentTypeId = "{81449CDF-D6DE-46DA-A50C-576B0B921311}";
class FastNoiseGradientComponent
: public AZ::Component
, private GradientSignal::GradientRequestBus::Handler
, private FastNoiseGradientRequestBus::Handler
{
public:
friend class EditorFastNoiseGradientComponent;
template<typename, typename> friend class LmbrCentral::EditorWrappedComponentBase;
AZ_COMPONENT(FastNoiseGradientComponent, FastNoiseGradientComponentTypeId);
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services);
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& services);
static void Reflect(AZ::ReflectContext* context);
FastNoiseGradientComponent(const FastNoiseGradientConfig& configuration);
FastNoiseGradientComponent() = default;
//////////////////////////////////////////////////////////////////////////
// AZ::Component interface implementation
void Activate() override;
void Deactivate() override;
bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override;
bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override;
//////////////////////////////////////////////////////////////////////////
// GradientRequestBus
float GetValue(const GradientSignal::GradientSampleParams& sampleParams) const override;
protected:
FastNoiseGradientConfig m_configuration;
FastNoise m_generator;
/////////////////////////////////////////////////////////////////////////
// FastNoiseGradientRequest overrides
int GetRandomSeed() const override;
void SetRandomSeed(int seed) override;
float GetFrequency() const override;
void SetFrequency(float freq) override;
FastNoise::Interp GetInterpolation() const override;
void SetInterpolation(FastNoise::Interp interp) override;
FastNoise::NoiseType GetNoiseType() const override;
void SetNoiseType(FastNoise::NoiseType type) override;
int GetOctaves() const override;
void SetOctaves(int octaves) override;
float GetLacunarity() const override;
void SetLacunarity(float lacunarity) override;
float GetGain() const override;
void SetGain(float gain) override;
FastNoise::FractalType GetFractalType() const override;
void SetFractalType(FastNoise::FractalType type) override;
template <typename TValueType, TValueType FastNoiseGradientConfig::*TConfigMember, void (FastNoise::*TMethod)(TValueType)>
void SetConfigValue(TValueType value);
};
} //namespace FastNoiseGem