1
1
// Perlin noise benchmark from https://gist.github.com/1170424
2
2
3
- use core:: rand:: RngUtil ;
3
+ use core:: rand:: { Rng , RngUtil } ;
4
4
5
5
struct Vec2 {
6
6
x : f32 ,
7
7
y : f32 ,
8
8
}
9
9
10
- fn lerp ( a : f32 , b : f32 , v : f32 ) -> f32 { a * ( 1.0 - v ) + b * v }
11
- fn smooth ( v : f32 ) -> f32 { v * v * ( 3 .0 - 2.0 * v) }
10
+ # [ inline ( always ) ]
11
+ fn lerp ( a : f32 , b : f32 , v : f32 ) -> f32 { a * ( 1 .0 - v ) + b * v }
12
12
13
- fn random_gradient ( r : @rand:: Rng ) -> Vec2 {
13
+ #[ inline( always) ]
14
+ fn smooth ( v : f32 ) -> f32 { v * v * ( 3.0 - 2.0 * v) }
15
+
16
+ fn random_gradient ( r : @Rng ) -> Vec2 {
14
17
let v = r. gen_float ( ) * float:: consts:: pi * 2.0 ;
15
- Vec2 {
18
+ Vec2 {
16
19
x : float:: cos ( v) as f32 ,
17
20
y : float:: sin ( v) as f32 ,
18
21
}
19
22
}
20
23
21
24
fn gradient ( orig : Vec2 , grad : Vec2 , p : Vec2 ) -> f32 {
22
- let sp = Vec2 { x : p. x - orig. x , y : p. y - orig. y } ;
25
+ let sp = Vec2 { x : p. x - orig. x , y : p. y - orig. y } ;
23
26
grad. x * sp. x + grad. y + sp. y
24
27
}
25
28
@@ -28,28 +31,28 @@ struct Noise2DContext {
28
31
permutations : [ int , ..256 ] ,
29
32
}
30
33
31
- fn Noise2DContext ( ) -> ~Noise2DContext {
32
- let r = rand:: Rng ( ) ;
33
- let mut rgradients = [ Vec2 { x : 0.0 , y : 0.0 } , ..256 ] ;
34
- for int:: range( 0 , 256 ) |i| { rgradients[ i] = random_gradient ( r) ; }
35
- let mut permutations = [ 0 , ..256 ] ;
36
- for int:: range( 0 , 256 ) |i| { permutations[ i] = i; }
37
- r. shuffle_mut ( permutations) ;
38
-
39
- ~Noise2DContext {
40
- rgradients : rgradients,
41
- permutations : permutations,
34
+ pub impl Noise2DContext {
35
+ fn new ( ) -> Noise2DContext {
36
+ let r = rand:: Rng ( ) ;
37
+ let mut rgradients = [ Vec2 { x : 0.0 , y : 0.0 } , ..256 ] ;
38
+ for int:: range( 0 , 256 ) |i| { rgradients[ i] = random_gradient ( r) ; }
39
+ let mut permutations = [ 0 , ..256 ] ;
40
+ for int:: range( 0 , 256 ) |i| { permutations[ i] = i; }
41
+ r. shuffle_mut ( permutations) ;
42
+
43
+ Noise2DContext {
44
+ rgradients : rgradients,
45
+ permutations : permutations,
46
+ }
42
47
}
43
- }
44
48
45
- pub impl Noise2DContext {
46
49
#[ inline( always) ]
47
50
fn get_gradient ( & self , x : int , y : int ) -> Vec2 {
48
51
let idx = self . permutations [ x & 255 ] + self . permutations [ y & 255 ] ;
49
52
self . rgradients [ idx & 255 ]
50
53
}
51
54
52
- #[ inline( always ) ]
55
+ #[ inline]
53
56
fn get_gradients ( & self , gradients : & mut [ Vec2 , ..4 ] , origins : & mut [ Vec2 , ..4 ] , x : f32 , y : f32 ) {
54
57
let x0f = f32:: floor ( x) ;
55
58
let y0f = f32:: floor ( y) ;
@@ -63,14 +66,15 @@ pub impl Noise2DContext {
63
66
gradients[ 2 ] = self . get_gradient ( x0, y1) ;
64
67
gradients[ 3 ] = self . get_gradient ( x1, y1) ;
65
68
66
- origins[ 0 ] = Vec2 { x : x0f + 0.0 , y : y0f + 0.0 } ;
67
- origins[ 1 ] = Vec2 { x : x0f + 1.0 , y : y0f + 0.0 } ;
68
- origins[ 2 ] = Vec2 { x : x0f + 0.0 , y : y0f + 1.0 } ;
69
- origins[ 3 ] = Vec2 { x : x0f + 1.0 , y : y0f + 1.0 } ;
69
+ origins[ 0 ] = Vec2 { x : x0f + 0.0 , y : y0f + 0.0 } ;
70
+ origins[ 1 ] = Vec2 { x : x0f + 1.0 , y : y0f + 0.0 } ;
71
+ origins[ 2 ] = Vec2 { x : x0f + 0.0 , y : y0f + 1.0 } ;
72
+ origins[ 3 ] = Vec2 { x : x0f + 1.0 , y : y0f + 1.0 } ;
70
73
}
71
74
75
+ #[ inline]
72
76
fn get ( & self , x : f32 , y : f32 ) -> f32 {
73
- let p = Vec2 { x : x, y : y} ;
77
+ let p = Vec2 { x : x, y : y} ;
74
78
let mut gradients = [ Vec2 { x : 0.0 , y : 0.0 } , ..4 ] ;
75
79
let mut origins = [ Vec2 { x : 0.0 , y : 0.0 } , ..4 ] ;
76
80
self . get_gradients ( & mut gradients, & mut origins, x, y) ;
@@ -88,9 +92,9 @@ pub impl Noise2DContext {
88
92
89
93
fn main ( ) {
90
94
let symbols = [ " " , "░" , "▒" , "▓" , "█" , "█" ] ;
91
- let mut pixels = vec :: from_elem ( 256 * 256 , 0f32 ) ;
92
- let n2d = Noise2DContext ( ) ;
93
- for int :: range ( 0 , 100 ) |_| {
95
+ let mut pixels = [ 0f32 , .. 256 * 256 ] ;
96
+ let n2d = ~ Noise2DContext :: new ( ) ;
97
+ for 100 . times {
94
98
for int:: range( 0 , 256 ) |y| {
95
99
for int:: range( 0 , 256 ) |x| {
96
100
let v = n2d. get (
@@ -109,4 +113,3 @@ fn main() {
109
113
io::println("");
110
114
}*/
111
115
}
112
-
0 commit comments