#![no_std]
#![cfg_attr(
feature = "document-features",
cfg_attr(doc, doc = ::document_features::document_features!())
)]
#![cfg_attr(feature = "nightly-simd", feature(portable_simd))]
#![cfg_attr(docsrs, feature(doc_auto_cfg, doc_cfg_hide), doc(cfg_hide(no_global_oom_handling, feature = "nightly-const-fn-float")))]
#![allow(clippy::excessive_precision, clippy::needless_late_init, clippy::too_many_arguments, clippy::approx_constant)]
#[cfg(any(feature = "std", test))]
extern crate std;
#[cfg(all(not(feature = "std"), not(feature = "libm")))]
compile_error!(r#"`noise-functions` crate: either the "std" or "libm" feature must be enabled"#);
mod base;
mod cellular;
mod from_fast_noise_2;
mod from_fast_noise_lite;
mod from_open_simplex_2;
mod lookup_table;
mod math;
pub mod modifiers;
mod noise;
mod noise_fn;
mod open_simplex_2;
mod sample;
pub use base::{CellDistance, CellDistanceSq, CellValue, OpenSimplex2, OpenSimplex2s, Perlin, Simplex, Value, ValueCubic};
pub use noise::Noise;
pub use noise_fn::NoiseFn;
pub use open_simplex_2::OpenSimplexNoise;
pub use sample::{Sample, Sample2, Sample3, Sample4, SampleWithSeed};
#[cfg(feature = "nightly-simd")]
pub use sample::{Sample2a, Sample3a, Sample4a};
#[inline(always)]
#[cfg(feature = "nightly-simd")]
fn array_4_take_3<T>(array: &[T; 4]) -> &[T; 3] {
array[..3].try_into().unwrap()
}
macro_rules! simple_enum {
(
enum $name:ident {
$(
$(#[$variant_attr:meta])*
$variant:ident $(= $variant_expr:expr)?
),* $(,)?
}
) => {
#[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum $name {
$(
$(#[$variant_attr])*
$variant $(= $variant_expr)?,
)*
}
impl core::str::FromStr for $name {
type Err = $crate::errors::EnumFromStrError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
$(stringify!($variant) => Self::$variant,)*
_ => return Err($crate::errors::EnumFromStrError),
})
}
}
impl $name {
#[expect(dead_code)]
pub const VARIANTS: &'static [Self] = &[
$(Self::$variant,)*
];
pub fn to_str(self) -> &'static str {
[$(stringify!($variant)),*][self as usize]
}
}
impl core::fmt::Debug for $name {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.to_str())
}
}
impl core::fmt::Display for $name {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.to_str())
}
}
};
}
pub(crate) use simple_enum;
pub mod errors {
#[derive(Debug, Clone, Copy)]
pub struct EnumFromStrError;
impl core::fmt::Display for EnumFromStrError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("can't convert string to enum")
}
}
}