11// Perlin noise benchmark from https://gist.github.com/1170424
22
3- use core:: rand:: RngUtil ;
3+ use core:: rand:: { Rng , RngUtil } ;
44
55struct Vec2 {
66 x : f32 ,
77 y : f32 ,
88}
99
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 }
1212
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 {
1417 let v = r. gen_float ( ) * float:: consts:: pi * 2.0 ;
15- Vec2 {
18+ Vec2 {
1619 x : float:: cos ( v) as f32 ,
1720 y : float:: sin ( v) as f32 ,
1821 }
1922}
2023
2124fn 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 } ;
2326 grad. x * sp. x + grad. y + sp. y
2427}
2528
@@ -28,28 +31,28 @@ struct Noise2DContext {
2831 permutations : [ int , ..256 ] ,
2932}
3033
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+ }
4247 }
43- }
4448
45- pub impl Noise2DContext {
4649 #[ inline( always) ]
4750 fn get_gradient ( & self , x : int , y : int ) -> Vec2 {
4851 let idx = self . permutations [ x & 255 ] + self . permutations [ y & 255 ] ;
4952 self . rgradients [ idx & 255 ]
5053 }
5154
52- #[ inline( always ) ]
55+ #[ inline]
5356 fn get_gradients ( & self , gradients : & mut [ Vec2 , ..4 ] , origins : & mut [ Vec2 , ..4 ] , x : f32 , y : f32 ) {
5457 let x0f = f32:: floor ( x) ;
5558 let y0f = f32:: floor ( y) ;
@@ -63,14 +66,15 @@ pub impl Noise2DContext {
6366 gradients[ 2 ] = self . get_gradient ( x0, y1) ;
6467 gradients[ 3 ] = self . get_gradient ( x1, y1) ;
6568
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 } ;
7073 }
7174
75+ #[ inline]
7276 fn get ( & self , x : f32 , y : f32 ) -> f32 {
73- let p = Vec2 { x : x, y : y} ;
77+ let p = Vec2 { x : x, y : y} ;
7478 let mut gradients = [ Vec2 { x : 0.0 , y : 0.0 } , ..4 ] ;
7579 let mut origins = [ Vec2 { x : 0.0 , y : 0.0 } , ..4 ] ;
7680 self . get_gradients ( & mut gradients, & mut origins, x, y) ;
@@ -88,9 +92,9 @@ pub impl Noise2DContext {
8892
8993fn main ( ) {
9094 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 {
9498 for int:: range( 0 , 256 ) |y| {
9599 for int:: range( 0 , 256 ) |x| {
96100 let v = n2d. get (
@@ -109,4 +113,3 @@ fn main() {
109113 io::println("");
110114 }*/
111115}
112-
0 commit comments