module Reflex.Gloss.Vector
( mv3
, mm3
, rotationMat
, identityMat
, translationMat
, transformPoint
, Matrix33, Vector3
, module Data.VectorSpace
) where
import Graphics.Gloss.Rendering
import Data.VectorSpace
type Vector3 = (Float, Float, Float)
type Matrix33 = (Vector3, Vector3, Vector3)
mv3 :: Matrix33 -> Vector3 -> Vector3
mv3 (a, b, c) v = (a <.> v, b <.> v, c <.> v)
vm3 :: Vector3 -> Matrix33 -> Vector3
vm3 (x, y, z) (a, b, c) = x *^ a ^+^ y *^ b ^+^ z *^ c
mm3 :: Matrix33 -> Matrix33 -> Matrix33
mm3 (a, b, c) m = (a `vm3` m, b `vm3` m, c `vm3` m)
rotationMat :: Float -> Matrix33
rotationMat deg =
( (ca, sa, 0)
, (sa, ca, 0)
, (0, 0, 1))
where
a = deg * pi / 180.0
ca = cos a
sa = sin a
identityMat :: Matrix33
identityMat =
( (1, 0, 0)
, (0, 1, 0)
, (0, 0, 1))
translationMat :: Vector -> Matrix33
translationMat (dx, dy) =
( (1, 0, dx)
, (0, 1, dy)
, (0, 0, 1))
transformPoint :: Matrix33 -> Point -> Point
transformPoint transform (x, y) = (x', y') ^* (1 / w) where
(x', y', w) = transform `mv3` (x, y, 1)
instance AdditiveGroup Color where
zeroV = makeColor 0 0 0 0
c ^+^ c' = makeRawColor (r + r') (g + g') (b + b') (a + a')
where (r, g, b, a) = rgbaOfColor c
(r', g', b', a') = rgbaOfColor c'
negateV c = makeRawColor (r) (g) (b) (a)
where (r, g, b, a) = rgbaOfColor c
instance VectorSpace Color where
type Scalar Color = Float
s *^ c = makeRawColor (r * s) (g * s) (b * s) (a * s)
where (r, g, b, a) = rgbaOfColor c