diff options
Diffstat (limited to 'Spear/Math/Vector')
-rw-r--r-- | Spear/Math/Vector/Vector3.hs | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/Spear/Math/Vector/Vector3.hs b/Spear/Math/Vector/Vector3.hs index eeab486..8a1cfa9 100644 --- a/Spear/Math/Vector/Vector3.hs +++ b/Spear/Math/Vector/Vector3.hs | |||
@@ -1,6 +1,10 @@ | |||
1 | module Spear.Math.Vector.Vector3 | 1 | module Spear.Math.Vector.Vector3 |
2 | ( | 2 | ( |
3 | Vector3 | 3 | Vector3 |
4 | , Right3 | ||
5 | , Up3 | ||
6 | , Forward3 | ||
7 | , Position3 | ||
4 | -- * Construction | 8 | -- * Construction |
5 | , unitx3 | 9 | , unitx3 |
6 | , unity3 | 10 | , unity3 |
@@ -19,6 +23,11 @@ import Spear.Math.Vector.Class | |||
19 | import Foreign.C.Types (CFloat) | 23 | import Foreign.C.Types (CFloat) |
20 | import Foreign.Storable | 24 | import Foreign.Storable |
21 | 25 | ||
26 | type Right3 = Vector3 | ||
27 | type Up3 = Vector3 | ||
28 | type Forward3 = Vector3 | ||
29 | type Position3 = Vector3 | ||
30 | |||
22 | 31 | ||
23 | -- | Represents a vector in 3D. | 32 | -- | Represents a vector in 3D. |
24 | data Vector3 = Vector3 | 33 | data Vector3 = Vector3 |
@@ -27,7 +36,6 @@ data Vector3 = Vector3 | |||
27 | {-# UNPACK #-} !Float | 36 | {-# UNPACK #-} !Float |
28 | deriving (Eq, Show) | 37 | deriving (Eq, Show) |
29 | 38 | ||
30 | |||
31 | instance Num Vector3 where | 39 | instance Num Vector3 where |
32 | Vector3 ax ay az + Vector3 bx by bz = Vector3 (ax + bx) (ay + by) (az + bz) | 40 | Vector3 ax ay az + Vector3 bx by bz = Vector3 (ax + bx) (ay + by) (az + bz) |
33 | Vector3 ax ay az - Vector3 bx by bz = Vector3 (ax - bx) (ay - by) (az - bz) | 41 | Vector3 ax ay az - Vector3 bx by bz = Vector3 (ax - bx) (ay - by) (az - bz) |
@@ -35,29 +43,29 @@ instance Num Vector3 where | |||
35 | abs (Vector3 ax ay az) = Vector3 (abs ax) (abs ay) (abs az) | 43 | abs (Vector3 ax ay az) = Vector3 (abs ax) (abs ay) (abs az) |
36 | signum (Vector3 ax ay az) = Vector3 (signum ax) (signum ay) (signum az) | 44 | signum (Vector3 ax ay az) = Vector3 (signum ax) (signum ay) (signum az) |
37 | fromInteger i = Vector3 i' i' i' where i' = fromInteger i | 45 | fromInteger i = Vector3 i' i' i' where i' = fromInteger i |
38 | 46 | ||
39 | 47 | ||
40 | instance Fractional Vector3 where | 48 | instance Fractional Vector3 where |
41 | Vector3 ax ay az / Vector3 bx by bz = Vector3 (ax / bx) (ay / by) (az / bz) | 49 | Vector3 ax ay az / Vector3 bx by bz = Vector3 (ax / bx) (ay / by) (az / bz) |
42 | fromRational r = Vector3 r' r' r' where r' = fromRational r | 50 | fromRational r = Vector3 r' r' r' where r' = fromRational r |
43 | 51 | ||
44 | 52 | ||
45 | instance Ord Vector3 where | 53 | instance Ord Vector3 where |
46 | Vector3 ax ay az <= Vector3 bx by bz | 54 | Vector3 ax ay az <= Vector3 bx by bz |
47 | = (ax <= bx) | 55 | = (ax <= bx) |
48 | || (az == bx && ay <= by) | 56 | || (az == bx && ay <= by) |
49 | || (ax == bx && ay == by && az <= bz) | 57 | || (ax == bx && ay == by && az <= bz) |
50 | 58 | ||
51 | Vector3 ax ay az >= Vector3 bx by bz | 59 | Vector3 ax ay az >= Vector3 bx by bz |
52 | = (ax >= bx) | 60 | = (ax >= bx) |
53 | || (ax == bx && ay >= by) | 61 | || (ax == bx && ay >= by) |
54 | || (ax == bx && ay == by && az >= bz) | 62 | || (ax == bx && ay == by && az >= bz) |
55 | 63 | ||
56 | Vector3 ax ay az < Vector3 bx by bz | 64 | Vector3 ax ay az < Vector3 bx by bz |
57 | = (ax < bx) | 65 | = (ax < bx) |
58 | || (az == bx && ay < by) | 66 | || (az == bx && ay < by) |
59 | || (ax == bx && ay == by && az < bz) | 67 | || (ax == bx && ay == by && az < bz) |
60 | 68 | ||
61 | Vector3 ax ay az > Vector3 bx by bz | 69 | Vector3 ax ay az > Vector3 bx by bz |
62 | = (ax > bx) | 70 | = (ax > bx) |
63 | || (ax == bx && ay > by) | 71 | || (ax == bx && ay > by) |
@@ -80,7 +88,7 @@ instance VectorClass Vector3 where | |||
80 | 88 | ||
81 | {-# INLINABLE z #-} | 89 | {-# INLINABLE z #-} |
82 | z (Vector3 _ _ az) = az | 90 | z (Vector3 _ _ az) = az |
83 | 91 | ||
84 | {-# INLINABLE (!) #-} | 92 | {-# INLINABLE (!) #-} |
85 | (Vector3 ax _ _) ! 0 = ax | 93 | (Vector3 ax _ _) ! 0 = ax |
86 | (Vector3 _ ay _) ! 1 = ay | 94 | (Vector3 _ ay _) ! 1 = ay |
@@ -115,13 +123,13 @@ sizeFloat = sizeOf (undefined :: CFloat) | |||
115 | instance Storable Vector3 where | 123 | instance Storable Vector3 where |
116 | sizeOf _ = 3*sizeFloat | 124 | sizeOf _ = 3*sizeFloat |
117 | alignment _ = alignment (undefined :: CFloat) | 125 | alignment _ = alignment (undefined :: CFloat) |
118 | 126 | ||
119 | peek ptr = do | 127 | peek ptr = do |
120 | ax <- peekByteOff ptr 0 | 128 | ax <- peekByteOff ptr 0 |
121 | ay <- peekByteOff ptr $ 1*sizeFloat | 129 | ay <- peekByteOff ptr $ 1*sizeFloat |
122 | az <- peekByteOff ptr $ 2*sizeFloat | 130 | az <- peekByteOff ptr $ 2*sizeFloat |
123 | return (Vector3 ax ay az) | 131 | return (Vector3 ax ay az) |
124 | 132 | ||
125 | poke ptr (Vector3 ax ay az) = do | 133 | poke ptr (Vector3 ax ay az) = do |
126 | pokeByteOff ptr 0 ax | 134 | pokeByteOff ptr 0 ax |
127 | pokeByteOff ptr (1*sizeFloat) ay | 135 | pokeByteOff ptr (1*sizeFloat) ay |