use crate::core::adapters;
use std::marker::Sized;
pub trait Generator<const D: usize>: Sized {
fn sample(&self, point: [f64; D]) -> f64;
#[inline]
fn scale(self, scale: [f64; D]) -> adapters::Scale<D, Self> {
adapters::Scale::new(self, scale)
}
#[inline]
fn translate(self, translation: [f64; D]) -> adapters::Translate<D, Self> {
adapters::Translate::new(self, translation)
}
#[inline]
fn neg(self) -> adapters::Neg<D, Self> {
adapters::Neg::new(self)
}
#[inline]
fn abs(self) -> adapters::Abs<D, Self> {
adapters::Abs::new(self)
}
#[inline]
fn exp(self) -> adapters::Exp<D, Self> {
adapters::Exp::new(self)
}
#[inline]
fn add(self, offset: f64) -> adapters::Add<D, Self> {
adapters::Add::new(self, offset)
}
#[inline]
fn mul(self, scale: f64) -> adapters::Mul<D, Self> {
adapters::Mul::new(self, scale)
}
#[inline]
fn powi(self, exponent: i32) -> adapters::Pow<D, Self, i32> {
adapters::Pow::new(self, exponent)
}
#[inline]
fn powf(self, exponent: f64) -> adapters::Pow<D, Self, f64> {
adapters::Pow::new(self, exponent)
}
#[inline]
fn clamp(self, min: f64, max: f64) -> adapters::Clamp<D, Self> {
adapters::Clamp::new(self, min, max)
}
#[inline]
fn lambda<L>(self, lambda: L) -> adapters::Lambda<D, Self, L>
where
L: Fn(f64) -> f64,
{
adapters::Lambda::new(self, lambda)
}
#[inline]
fn sum<G>(self, other: G) -> adapters::Sum<D, Self, G>
where
G: Generator<D>,
{
adapters::Sum::new(self, other)
}
#[inline]
fn product<G>(self, other: G) -> adapters::Product<D, Self, G>
where
G: Generator<D>,
{
adapters::Product::new(self, other)
}
#[inline]
fn min<G>(self, other: G) -> adapters::Min<D, Self, G>
where
G: Generator<D>,
{
adapters::Min::new(self, other)
}
#[inline]
fn max<G>(self, other: G) -> adapters::Max<D, Self, G>
where
G: Generator<D>,
{
adapters::Max::new(self, other)
}
#[inline]
fn power<G>(self, other: G) -> adapters::Power<D, Self, G>
where
G: Generator<D>,
{
adapters::Power::new(self, other)
}
#[inline]
fn fbm(
self,
octaves: u32,
frequency: f64,
lacunarity: f64,
persistence: f64,
) -> adapters::Fbm<D, Self> {
adapters::Fbm::new(self, octaves, frequency, lacunarity, persistence)
}
#[inline]
fn billow(
self,
octaves: u32,
frequency: f64,
lacunarity: f64,
persistence: f64,
) -> adapters::Billow<D, Self> {
adapters::Billow::new(self, octaves, frequency, lacunarity, persistence)
}
#[inline]
fn ridgedmulti(
self,
octaves: u32,
frequency: f64,
lacunarity: f64,
attenuation: f64,
) -> adapters::RidgedMulti<D, Self> {
adapters::RidgedMulti::new(self, octaves, frequency, lacunarity, attenuation)
}
#[inline]
fn blend<G, GC>(self, other: G, control: GC) -> adapters::Blend<D, Self, G, GC>
where
G: Generator<D>,
GC: Generator<D>,
{
adapters::Blend::new(self, other, control)
}
#[inline]
fn select<G, GC>(
self,
other: G,
control: GC,
selection_min: f64,
selection_max: f64,
) -> adapters::Select<D, Self, G, GC>
where
G: Generator<D>,
GC: Generator<D>,
{
adapters::Select::new(self, other, control, selection_min, selection_max)
}
#[inline]
fn spline<S>(self, knot_vector: &[f64], knots: &[f64]) -> adapters::Spline<D, Self, S>
where
S: adapters::SplineImpl,
{
adapters::Spline::new(self, knot_vector, knots)
}
}
pub trait Generator1D: Generator<1> {
#[inline]
fn displace_x<GA>(self, displacement_generator: GA) -> adapters::Displace<1, 0, Self, GA>
where
GA: Generator<1>,
{
adapters::Displace::new(self, displacement_generator)
}
}
pub trait Generator2D: Generator<2> {
#[inline]
fn rotate(self, rotation: [f64; 1]) -> adapters::Rotate<2, 1, Self> {
adapters::Rotate::new(self, rotation)
}
#[inline]
fn displace_x<GA>(self, displacement_generator: GA) -> adapters::Displace<2, 0, Self, GA>
where
GA: Generator<2>,
{
adapters::Displace::new(self, displacement_generator)
}
#[inline]
fn displace_y<GA>(self, displacement_generator: GA) -> adapters::Displace<2, 1, Self, GA>
where
GA: Generator<2>,
{
adapters::Displace::new(self, displacement_generator)
}
}
pub trait Generator3D: Generator<3> {
#[inline]
fn rotate(self, rotation: [f64; 3]) -> adapters::Rotate<3, 3, Self> {
adapters::Rotate::new(self, rotation)
}
#[inline]
fn displace_x<GA>(self, displacement_generator: GA) -> adapters::Displace<3, 0, Self, GA>
where
GA: Generator<3>,
{
adapters::Displace::new(self, displacement_generator)
}
#[inline]
fn displace_y<GA>(self, displacement_generator: GA) -> adapters::Displace<3, 1, Self, GA>
where
GA: Generator<3>,
{
adapters::Displace::new(self, displacement_generator)
}
#[inline]
fn displace_z<GA>(self, displacement_generator: GA) -> adapters::Displace<3, 2, Self, GA>
where
GA: Generator<3>,
{
adapters::Displace::new(self, displacement_generator)
}
}
pub trait Generator4D: Generator<4> {
#[inline]
fn rotate(self, rotation: [f64; 6]) -> adapters::Rotate<4, 6, Self> {
adapters::Rotate::new(self, rotation)
}
#[inline]
fn displace_x<GA>(self, displacement_generator: GA) -> adapters::Displace<4, 0, Self, GA>
where
GA: Generator<4>,
{
adapters::Displace::new(self, displacement_generator)
}
#[inline]
fn displace_y<GA>(self, displacement_generator: GA) -> adapters::Displace<4, 1, Self, GA>
where
GA: Generator<4>,
{
adapters::Displace::new(self, displacement_generator)
}
#[inline]
fn displace_z<GA>(self, displacement_generator: GA) -> adapters::Displace<4, 2, Self, GA>
where
GA: Generator<4>,
{
adapters::Displace::new(self, displacement_generator)
}
#[inline]
fn displace_w<GA>(self, displacement_generator: GA) -> adapters::Displace<4, 3, Self, GA>
where
GA: Generator<4>,
{
adapters::Displace::new(self, displacement_generator)
}
}