1extern crate libc;
45extern crate noise;
46
47use libc::{c_double, uint32_t};
48
49fn heap_mut_ptr<T>(x: T) -> *mut T {
51 Box::into_raw(Box::new(x))
52}
53
54#[no_mangle]
57pub unsafe extern "C" fn noise_seed_new(seed: uint32_t) -> *mut noise::Seed {
58 heap_mut_ptr(noise::Seed::new(seed as u32))
59}
60
61#[no_mangle]
65pub unsafe extern "C" fn noise_seed_delete(seed: *mut noise::Seed) {
66 let seed = Box::from_raw(seed);
67 drop(seed)
68}
69
70macro_rules! wrap_noise {
71 ($wrapper_name:ident, $t:ty, $alg:expr, 2) => {
72 wrap_noise!($wrapper_name, $t, $alg, x, y);
73 };
74 ($wrapper_name:ident, $t:ty, $alg:expr, 3) => {
75 wrap_noise!($wrapper_name, $t, $alg, x, y, z);
76 };
77 ($wrapper_name:ident, $t:ty, $alg:expr, 4) => {
78 wrap_noise!($wrapper_name, $t, $alg, x, y, z, w);
79 };
80 ($wrapper_name:ident, $t:ty, $alg:expr $(, $arg:ident)*) => {
81 #[no_mangle]
83 pub unsafe fn $wrapper_name(seed: *mut noise::Seed $(, $arg: $t)*) -> $t {
84 let seed: &noise::Seed = &*seed;
85 $alg(&seed, &[$($arg),*])
86 }
87 };
88}
89
90wrap_noise!(noise_perlin2, c_double, noise::perlin2, 2);
92wrap_noise!(noise_perlin3, c_double, noise::perlin3, 3);
93wrap_noise!(noise_perlin4, c_double, noise::perlin4, 4);
94
95wrap_noise!(noise_open_simplex2, c_double, noise::open_simplex2, 2);
97wrap_noise!(noise_open_simplex3, c_double, noise::open_simplex3, 3);
98
99wrap_noise!(noise_cell2_value, c_double, noise::cell2_value, 2);
101wrap_noise!(noise_cell3_value, c_double, noise::cell3_value, 3);
102wrap_noise!(noise_cell4_value, c_double, noise::cell4_value, 4);
103
104wrap_noise!(noise_cell2_range, c_double, noise::cell2_range, 2);
105wrap_noise!(noise_cell3_range, c_double, noise::cell3_range, 3);
106wrap_noise!(noise_cell4_range, c_double, noise::cell4_range, 4);
107
108wrap_noise!(noise_cell2_range_inv, c_double, noise::cell2_range_inv, 2);
109wrap_noise!(noise_cell3_range_inv, c_double, noise::cell3_range_inv, 3);
110wrap_noise!(noise_cell4_range_inv, c_double, noise::cell4_range_inv, 4);
111
112wrap_noise!(noise_cell2_manhattan_value, c_double, noise::cell2_manhattan_value, 2);
114wrap_noise!(noise_cell3_manhattan_value, c_double, noise::cell3_manhattan_value, 3);
115wrap_noise!(noise_cell4_manhattan_value, c_double, noise::cell4_manhattan_value, 4);
116
117wrap_noise!(noise_cell2_manhattan_range, c_double, noise::cell2_manhattan, 2);
118wrap_noise!(noise_cell3_manhattan_range, c_double, noise::cell3_manhattan, 3);
119wrap_noise!(noise_cell4_manhattan_range, c_double, noise::cell4_manhattan, 4);
120
121wrap_noise!(noise_cell2_manhattan_range_inv, c_double, noise::cell2_manhattan_inv, 2);
122wrap_noise!(noise_cell3_manhattan_range_inv, c_double, noise::cell3_manhattan_inv, 3);
123wrap_noise!(noise_cell4_manhattan_range_inv, c_double, noise::cell4_manhattan_inv, 4);