module RSAGL.Types
(RSfloat,RSdouble,toGLfloat,toGLdouble,fromGLfloat,fromGLdouble,f2f,GLUT.GLfloat,GLUT.GLdouble)
where
import Graphics.UI.GLUT as GLUT
import Data.Vec as Vec
import System.Random
import Control.Arrow
newtype RSfloat = RSfloat GLfloat
deriving (Enum,Eq,Floating,Fractional,Num,Ord,Read,Real,RealFloat,RealFrac,Show)
newtype RSdouble = RSdouble GLdouble
deriving (Enum,Eq,Floating,Fractional,Num,Ord,Read,Real,RealFloat,RealFrac,Show)
toGLfloat :: RSfloat -> GLfloat
toGLfloat (RSfloat x) = x
toGLdouble :: RSdouble -> GLdouble
toGLdouble (RSdouble x) = x
fromGLfloat :: GLfloat -> RSfloat
fromGLfloat = RSfloat
fromGLdouble :: GLdouble -> RSdouble
fromGLdouble = RSdouble
f2f :: (RealFloat a,RealFloat b) => a -> b
f2f = uncurry encodeFloat . decodeFloat
instance NearZero RSfloat where
nearZero x = abs x < 1e-6
instance NearZero RSdouble where
nearZero x = abs x < 1e-14
instance Random RSfloat where
randomR (lo,hi) g = first f2f $ randomR (f2f lo, f2f hi :: Float) g
random g = first (f2f :: Float -> RSfloat) $ random g
instance Random RSdouble where
randomR (lo,hi) g = first f2f $ randomR (f2f lo, f2f hi :: Double) g
random g = first (f2f :: Double -> RSdouble) $ random g