packages feed

graphics-formats-collada-0.2.0: sample.hs

{-# LANGUAGE TypeFamilies #-}

import qualified Graphics.Formats.Collada as Collada
import qualified Graphics.UI.GLUT as GLUT
import qualified Graphics.Rendering.OpenGL.GL as GL
import qualified Graphics.Rendering.OpenGL.GLU as GLU
import System.IO
import Control.Applicative
import Data.VectorSpace
import Data.IORef

instance AdditiveGroup GL.GLdouble where
    zeroV = 0
    (^+^) = (+)
    negateV = negate

instance VectorSpace GL.GLdouble where
    type Scalar GL.GLdouble = GL.GLdouble
    (*^) = (*)

instance InnerSpace GL.GLdouble where
    (<.>) = (*)

main = do
    hSetBuffering stdout NoBuffering

    GLUT.initialDisplayMode GL.$= [GLUT.RGBAMode, GLUT.DoubleBuffered, GLUT.WithDepthBuffer]

    GLUT.getArgsAndInitialize
    GLUT.createWindow "Hello!"

    putStrLn "Loading"
    action <- Collada.load Collada.defaultConfig =<< getContents
    putStrLn "Done"

    GL.matrixMode GL.$= GL.Projection
    GL.loadIdentity
    GLU.perspective 45 1 1 1000
    GL.matrixMode GL.$= GL.Modelview 0
    GL.loadIdentity

    GL.lighting GL.$= GL.Enabled
    GL.light (GL.Light 0) GL.$= GL.Enabled
    GL.position (GL.Light 0) GL.$= GL.Vertex4 0 0 10 1
    GL.depthFunc GL.$= Nothing
    GL.depthFunc GL.$= Just GL.Lequal
    GL.depthMask GL.$= GL.Enabled
    GL.normalize GL.$= GL.Enabled

    GLUT.displayCallback GLUT.$= (do
        GL.clearColor GL.$= GL.Color4 0 0 0 0
        GL.clear [GL.ColorBuffer, GL.DepthBuffer]
        GL.preservingMatrix $ do
            GL.loadIdentity
            GLU.lookAt (uncurry3 GL.Vertex3 eye) (uncurry3 GL.Vertex3 object) (uncurry3 GL.Vector3 up)
            GL.renderPrimitive GL.Lines $ do
                vertex (-200) 0 0
                vertex 200 0 0
                vertex 0 (-200) 0
                vertex 0 200 0
                vertex 0 0 (-200)
                vertex 0 0 200
            action
        GLUT.swapBuffers)
    GLUT.mainLoop

    where
    eye = (10, 10, 10)
    object = (0, 0, 0)
    up = normalized $ (object ^-^ eye) `cross` ((object ^-^ eye) `cross` (0,0,-1))
    cross (bx,by,bz) (cx,cy,cz) = (by*cz - cy*bz, bz*cx - bx*cz, bx*cy - by*cx)

    uncurry3 f (x,y,z) = f x y z

    vertex :: GL.GLfloat -> GL.GLfloat -> GL.GLfloat -> IO ()
    vertex x y z = GL.vertex $ GL.Vertex3 x y z