summaryrefslogtreecommitdiffstats
path: root/Render.hs
blob: ec34e789af56f6a4c83d18f47c2b978cdc8e4223 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module Render ( setup
              , resize
              , render
              ) where


import Game
import Tank

import Control.Monad.State

import Data.Fixed
import Data.Ratio

import Graphics.Rendering.OpenGL.GL (($=), GLfloat)
import Graphics.Rendering.OpenGL.GL.BeginEnd (renderPrimitive, PrimitiveMode(..))
import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, ortho)
import Graphics.Rendering.OpenGL.GL.Framebuffer (clear, ClearBuffer(..))
import Graphics.Rendering.OpenGL.GL.VertexSpec


setup :: Int -> Int -> IO ()
setup w h = do
  resize w h

resize :: Int -> Int -> IO ()
resize w h = do
  let wn = fromIntegral w
      hn = fromIntegral h
      aspect = wn/hn
  
  matrixMode $= Projection
  loadIdentity
  ortho (-aspect) (aspect) (-1) 1 (-1) 1
  
  matrixMode $= Modelview 0
  
  viewport $= ((Position 0 0), (Size (fromIntegral w) (fromIntegral h)))


render :: Game ()
render = do
  tank <- liftM head $ gets tanks
  let x = toFloat . posx $ tank
      y = toFloat . posy $ tank
  
  liftIO $ do
           clear [ColorBuffer]
           
           renderPrimitive Triangles $ do
                    vertex $ Vertex2 (x-0.5 :: GLfloat) (y-0.5 :: GLfloat)
                    vertex $ Vertex2 (x+0.5 :: GLfloat) (y+0.5 :: GLfloat)
                    vertex $ Vertex2 (x+0.5 :: GLfloat) (y-0.5 :: GLfloat)

toFloat :: Real a => a -> GLfloat
toFloat = fromRational . toRational