1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
extern crate libc;
extern crate noise;
use libc::{c_double, uint32_t};
fn heap_mut_ptr<T>(x: T) -> *mut T {
Box::into_raw(Box::new(x))
}
#[no_mangle]
pub unsafe extern "C" fn noise_seed_new(seed: uint32_t) -> *mut noise::Seed {
heap_mut_ptr(noise::Seed::new(seed as u32))
}
#[no_mangle]
pub unsafe extern "C" fn noise_seed_delete(seed: *mut noise::Seed) {
let seed = Box::from_raw(seed);
drop(seed)
}
macro_rules! wrap_noise {
($wrapper_name:ident, $t:ty, $alg:expr, 2) => {
wrap_noise!($wrapper_name, $t, $alg, x, y);
};
($wrapper_name:ident, $t:ty, $alg:expr, 3) => {
wrap_noise!($wrapper_name, $t, $alg, x, y, z);
};
($wrapper_name:ident, $t:ty, $alg:expr, 4) => {
wrap_noise!($wrapper_name, $t, $alg, x, y, z, w);
};
($wrapper_name:ident, $t:ty, $alg:expr $(, $arg:ident)*) => {
#[no_mangle]
pub unsafe fn $wrapper_name(seed: *mut noise::Seed $(, $arg: $t)*) -> $t {
let seed: &noise::Seed = &*seed;
$alg(&seed, &[$($arg),*])
}
};
}
wrap_noise!(noise_perlin2, c_double, noise::perlin2, 2);
wrap_noise!(noise_perlin3, c_double, noise::perlin3, 3);
wrap_noise!(noise_perlin4, c_double, noise::perlin4, 4);
wrap_noise!(noise_open_simplex2, c_double, noise::open_simplex2, 2);
wrap_noise!(noise_open_simplex3, c_double, noise::open_simplex3, 3);
wrap_noise!(noise_cell2_value, c_double, noise::cell2_value, 2);
wrap_noise!(noise_cell3_value, c_double, noise::cell3_value, 3);
wrap_noise!(noise_cell4_value, c_double, noise::cell4_value, 4);
wrap_noise!(noise_cell2_range, c_double, noise::cell2_range, 2);
wrap_noise!(noise_cell3_range, c_double, noise::cell3_range, 3);
wrap_noise!(noise_cell4_range, c_double, noise::cell4_range, 4);
wrap_noise!(noise_cell2_range_inv, c_double, noise::cell2_range_inv, 2);
wrap_noise!(noise_cell3_range_inv, c_double, noise::cell3_range_inv, 3);
wrap_noise!(noise_cell4_range_inv, c_double, noise::cell4_range_inv, 4);
wrap_noise!(noise_cell2_manhattan_value, c_double, noise::cell2_manhattan_value, 2);
wrap_noise!(noise_cell3_manhattan_value, c_double, noise::cell3_manhattan_value, 3);
wrap_noise!(noise_cell4_manhattan_value, c_double, noise::cell4_manhattan_value, 4);
wrap_noise!(noise_cell2_manhattan_range, c_double, noise::cell2_manhattan, 2);
wrap_noise!(noise_cell3_manhattan_range, c_double, noise::cell3_manhattan, 3);
wrap_noise!(noise_cell4_manhattan_range, c_double, noise::cell4_manhattan, 4);
wrap_noise!(noise_cell2_manhattan_range_inv, c_double, noise::cell2_manhattan_inv, 2);
wrap_noise!(noise_cell3_manhattan_range_inv, c_double, noise::cell3_manhattan_inv, 3);
wrap_noise!(noise_cell4_manhattan_range_inv, c_double, noise::cell4_manhattan_inv, 4);