#![doc = include_str!("../examples/sample_raw_noise.rs")]
use std::{
alloc::{self, dealloc, Layout},
mem::transmute,
};
use cubiomes_sys::{enums::Dimension, initSurfaceNoise, initSurfaceNoiseBeta};
#[derive(Debug)]
pub enum BiomeNoise {
Release(SurfaceNoiseRelease),
Beta(SurfaceNoiseBeta),
}
impl From<SurfaceNoiseRelease> for BiomeNoise {
fn from(value: SurfaceNoiseRelease) -> Self {
Self::Release(value)
}
}
impl From<SurfaceNoiseBeta> for BiomeNoise {
fn from(value: SurfaceNoiseBeta) -> Self {
Self::Beta(value)
}
}
#[derive(Debug)]
pub struct SurfaceNoiseRelease(*mut cubiomes_sys::SurfaceNoise);
#[derive(Debug)]
pub struct SurfaceNoiseBeta(*mut cubiomes_sys::SurfaceNoiseBeta);
impl SurfaceNoiseRelease {
pub fn new(dimension: Dimension, seed: i64) -> Self {
let noise: *mut cubiomes_sys::SurfaceNoise = unsafe {
alloc::alloc(Layout::new::<cubiomes_sys::SurfaceNoise>())
as *mut cubiomes_sys::SurfaceNoise
};
unsafe {
initSurfaceNoise(noise, dimension as i32, transmute::<i64, u64>(seed));
}
Self(noise)
}
pub fn sample_raw(&self, x: i32, y: i32, z: i32) -> f64 {
unsafe { cubiomes_sys::sampleSurfaceNoise(self.as_ptr(), x, y, z) }
}
pub fn sample_between(&self, x: i32, y: i32, z: i32, min: f64, max: f64) -> f64 {
unsafe { cubiomes_sys::sampleSurfaceNoiseBetween(self.as_ptr(), x, y, z, min, max) }
}
pub unsafe fn as_ptr(&self) -> *const cubiomes_sys::SurfaceNoise {
self.0
}
pub unsafe fn as_mut_ptr(&mut self) -> *mut cubiomes_sys::SurfaceNoise {
self.0
}
}
impl Drop for SurfaceNoiseRelease {
fn drop(&mut self) {
unsafe {
dealloc(
self.0 as *mut u8,
Layout::new::<cubiomes_sys::SurfaceNoise>(),
)
};
}
}
unsafe impl Send for SurfaceNoiseRelease {}
unsafe impl Sync for SurfaceNoiseRelease {}
impl SurfaceNoiseBeta {
pub fn new(seed: i64) -> Self {
let noise: *mut cubiomes_sys::SurfaceNoiseBeta = unsafe {
alloc::alloc(Layout::new::<cubiomes_sys::SurfaceNoiseBeta>())
as *mut cubiomes_sys::SurfaceNoiseBeta
};
unsafe {
initSurfaceNoiseBeta(noise, transmute::<i64, u64>(seed));
}
Self(noise)
}
pub unsafe fn as_ptr(&self) -> *const cubiomes_sys::SurfaceNoiseBeta {
self.0
}
pub unsafe fn as_mut_ptr(&mut self) -> *mut cubiomes_sys::SurfaceNoiseBeta {
self.0
}
}
unsafe impl Send for SurfaceNoiseBeta {}
unsafe impl Sync for SurfaceNoiseBeta {}
impl Drop for SurfaceNoiseBeta {
fn drop(&mut self) {
unsafe {
alloc::dealloc(
self.0 as *mut u8,
Layout::new::<cubiomes_sys::SurfaceNoiseBeta>(),
)
};
}
}