@@ -9,16 +9,50 @@ use std::mem;
9
9
use std:: num:: One ;
10
10
use std:: num:: zero;
11
11
12
- /// The modulo function .
12
+ /// Clamp a value to a range .
13
13
#[ inline]
14
- pub fn modulo < I : Int > ( a : I , b : I ) -> I {
15
- match a % b {
16
- r if ( r > zero ( ) && b < zero ( ) )
17
- || ( r < zero ( ) && b > zero ( ) ) => ( r + b) ,
18
- r => r,
14
+ pub fn clamp < T : Num + Primitive > ( val : T , min : T , max : T ) -> T {
15
+ if val < min { min } else { if val > max { max } else { val } }
16
+ }
17
+
18
+ /// Floors value.
19
+ #[ inline]
20
+ pub fn fast_floor < F : Float + FromPrimitive + ToPrimitive > ( f : F ) -> int {
21
+ return if f > FromPrimitive :: from_int ( 0 ) . unwrap ( ) {
22
+ f. to_int ( ) . unwrap ( )
23
+ } else {
24
+ f. to_int ( ) . unwrap ( ) - One :: one ( )
19
25
}
20
26
}
21
27
28
+ /// Models the CPP fmod function.
29
+ #[ inline]
30
+ pub fn fmod < F : Float + FromPrimitive + ToPrimitive > ( numer : F , denom : F ) -> F {
31
+ let rquot: F = ( numer / denom) . floor ( ) ;
32
+ numer - rquot * denom
33
+ }
34
+
35
+ /// Implementation of grad1 for the ported _slang_library_noise1 method
36
+ #[ inline]
37
+ pub fn grad1 ( hash : int , x : f32 ) -> f32 {
38
+ let h: int = hash & 15 ;
39
+ let mut grad: f32 = 1.0f32 + ( ( h & 7 ) as f32 ) ;
40
+ if h & 8 > 0 { grad = ( -1.0f32 ) * grad; }
41
+ grad * x
42
+ }
43
+
44
+ /// Check if value is in range.
45
+ #[ inline]
46
+ pub fn in_range < T : Num + Primitive > ( val : T , min : T , max : T ) -> bool {
47
+ val >= min && val <= max
48
+ }
49
+
50
+ /// Interpolate from start to stop 'amt' amount.
51
+ #[ inline]
52
+ pub fn lerp ( start : f32 , stop : f32 , amt : f32 ) -> f32 {
53
+ start + ( stop - start) * amt
54
+ }
55
+
22
56
/// Map a value from a given range to a new given range.
23
57
#[ inline]
24
58
pub fn map_range < X : Num + Copy + FromPrimitive + ToPrimitive ,
@@ -41,22 +75,21 @@ pub fn map_range<X: Num + Copy + FromPrimitive + ToPrimitive,
41
75
) . unwrap ( )
42
76
}
43
77
44
- /// Clamp a value to a range.
45
- #[ inline]
46
- pub fn clamp < T : Num + Primitive > ( val : T , min : T , max : T ) -> T {
47
- if val < min { min } else { if val > max { max } else { val } }
48
- }
49
-
50
- /// Check if value is in range.
78
+ /// Models the CPP remainder function.
51
79
#[ inline]
52
- pub fn in_range < T : Num + Primitive > ( val : T , min : T , max : T ) -> bool {
53
- val >= min && val <= max
80
+ pub fn remainder < F : Float + FromPrimitive + ToPrimitive > ( numer : F , denom : F ) -> F {
81
+ let rquot: F = ( numer / denom) . round ( ) ;
82
+ numer - rquot * denom
54
83
}
55
84
56
- /// Interpolate from start to stop 'amt' amount .
85
+ /// The modulo function .
57
86
#[ inline]
58
- pub fn lerp ( start : f32 , stop : f32 , amt : f32 ) -> f32 {
59
- start + ( stop - start) * amt
87
+ pub fn modulo < I : Int > ( a : I , b : I ) -> I {
88
+ match a % b {
89
+ r if ( r > zero ( ) && b < zero ( ) )
90
+ || ( r < zero ( ) && b > zero ( ) ) => ( r + b) ,
91
+ r => r,
92
+ }
60
93
}
61
94
62
95
/// Wrap value to a range.
@@ -68,39 +101,6 @@ pub fn wrap(val: f32, mut from: f32, mut to: f32) -> f32 {
68
101
val - cycle * ( ( val - from) / cycle) . floor ( )
69
102
}
70
103
71
- /// Floors value.
72
- #[ inline]
73
- pub fn fast_floor < F : Float + FromPrimitive + ToPrimitive > ( f : F ) -> int {
74
- return if f > FromPrimitive :: from_int ( 0 ) . unwrap ( ) {
75
- f. to_int ( ) . unwrap ( )
76
- } else {
77
- f. to_int ( ) . unwrap ( ) - One :: one ( )
78
- }
79
- }
80
-
81
- /// Models the CPP remainder function.
82
- #[ inline]
83
- pub fn remainder < F : Float + FromPrimitive + ToPrimitive > ( numer : F , denom : F ) -> F {
84
- let rquot: F = ( numer / denom) . round ( ) ;
85
- numer - rquot * denom
86
- }
87
-
88
- /// Models the CPP fmod function.
89
- #[ inline]
90
- pub fn fmod < F : Float + FromPrimitive + ToPrimitive > ( numer : F , denom : F ) -> F {
91
- let rquot: F = ( numer / denom) . floor ( ) ;
92
- numer - rquot * denom
93
- }
94
-
95
- /// Implementation of grad1 for the ported _slang_library_noise1 method
96
- #[ inline]
97
- pub fn grad1 ( hash : int , x : f32 ) -> f32 {
98
- let h: int = hash & 15 ;
99
- let mut grad: f32 = 1.0f32 + ( ( h & 7 ) as f32 ) ;
100
- if h & 8 > 0 { grad = ( -1.0f32 ) * grad; }
101
- grad * x
102
- }
103
-
104
104
/// Implementation of perm for the ported _slang_library_noise1 method
105
105
const PERM : [ u8 , ..512 ] = [ 151u8 , 160u8 , 137u8 , 91u8 , 90u8 , 15u8 ,
106
106
131u8 , 13u8 , 201u8 , 95u8 , 96u8 , 53u8 , 194u8 , 233u8 , 7u8 , 225u8 , 140u8 , 36u8 , 103u8 , 30u8 , 69u8 , 142u8 , 8u8 , 99u8 , 37u8 , 240u8 , 21u8 , 10u8 , 23u8 ,
0 commit comments