2010-02-23 20:51:30 +01:00
|
|
|
module Render ( setup
|
|
|
|
, render
|
2010-02-23 15:05:31 +01:00
|
|
|
) where
|
|
|
|
|
|
|
|
|
|
|
|
import Game
|
2010-02-25 02:15:26 +01:00
|
|
|
import Level
|
2010-02-25 03:16:44 +01:00
|
|
|
import Texture
|
2010-02-25 02:15:26 +01:00
|
|
|
|
2010-02-23 15:05:31 +01:00
|
|
|
import Control.Monad.State
|
2010-02-23 20:51:30 +01:00
|
|
|
|
2010-02-24 02:42:10 +01:00
|
|
|
import Data.Fixed
|
2010-02-25 03:16:44 +01:00
|
|
|
import Data.Maybe
|
2010-02-24 02:42:10 +01:00
|
|
|
import Data.Ratio
|
2010-02-25 03:16:44 +01:00
|
|
|
import qualified Data.Map as M
|
|
|
|
|
|
|
|
import Bindings.GLPng
|
2010-02-24 02:42:10 +01:00
|
|
|
|
2010-02-25 04:38:14 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL (($=), GLfloat, GLdouble, Capability(..), Vector3(..))
|
2010-02-23 20:51:30 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.BeginEnd (renderPrimitive, PrimitiveMode(..))
|
2010-03-02 23:22:44 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, preservingMatrix, ortho, translate, rotate)
|
2010-02-23 15:05:31 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.Framebuffer (clear, ClearBuffer(..))
|
2010-02-25 04:38:14 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.PerFragment (blend, blendFunc, BlendingFactor(..))
|
2010-02-25 03:48:17 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.Texturing.Application (texture)
|
|
|
|
import Graphics.Rendering.OpenGL.GL.Texturing.Objects (textureBinding, TextureObject(..))
|
2010-02-25 02:15:26 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.Texturing.Parameters (Repetition(..), Clamping(..), TextureFilter(..), MinificationFilter, MagnificationFilter)
|
2010-02-25 03:48:17 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.Texturing.Specification (TextureTarget(..))
|
2010-02-23 20:51:30 +01:00
|
|
|
import Graphics.Rendering.OpenGL.GL.VertexSpec
|
|
|
|
|
|
|
|
|
2010-02-25 03:16:44 +01:00
|
|
|
texturePath :: Texture -> String
|
|
|
|
texturePath t
|
|
|
|
| t == TextureWood = "tex/Wood.png"
|
2010-02-25 04:38:14 +01:00
|
|
|
| t == TextureTank = "tex/Tank.png"
|
2010-03-05 03:32:02 +01:00
|
|
|
| t == TextureCannon = "tex/Cannon.png"
|
2010-03-08 22:13:35 +01:00
|
|
|
| t == TextureBullet = "tex/Bullet.png"
|
2010-02-25 03:16:44 +01:00
|
|
|
|
|
|
|
getTexture :: Texture -> Game TextureObject
|
|
|
|
getTexture t = do
|
|
|
|
ts <- gets textures
|
|
|
|
let tobj = M.lookup t ts
|
|
|
|
|
|
|
|
if (isJust tobj)
|
|
|
|
then
|
|
|
|
return $ fromJust tobj
|
|
|
|
else do
|
2010-02-25 04:38:14 +01:00
|
|
|
tex <- liftIO $ pngBind (texturePath t) BuildMipmap Alpha (Repeated, Repeat) (Linear', Just Linear') Linear' >>= return . TextureObject . fromIntegral . fst
|
2010-02-25 03:16:44 +01:00
|
|
|
modify $ \state -> state {textures = M.insert t tex ts}
|
|
|
|
return tex
|
|
|
|
|
|
|
|
|
2010-03-05 03:32:02 +01:00
|
|
|
setup :: Game ()
|
|
|
|
setup = do
|
2010-02-25 04:38:14 +01:00
|
|
|
liftIO $ do
|
|
|
|
blend $= Enabled
|
|
|
|
blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
|
2010-02-25 02:15:26 +01:00
|
|
|
|
2010-02-25 03:16:44 +01:00
|
|
|
-- cache textures
|
|
|
|
getTexture TextureWood
|
2010-02-25 04:38:14 +01:00
|
|
|
getTexture TextureTank
|
2010-03-05 03:32:02 +01:00
|
|
|
getTexture TextureCannon
|
2010-03-08 22:13:35 +01:00
|
|
|
getTexture TextureBullet
|
2010-02-25 03:16:44 +01:00
|
|
|
|
|
|
|
return ()
|
2010-02-23 23:31:11 +01:00
|
|
|
|
2010-02-23 15:05:31 +01:00
|
|
|
|
|
|
|
render :: Game ()
|
2010-02-23 23:31:11 +01:00
|
|
|
render = do
|
2010-03-02 23:22:44 +01:00
|
|
|
tanklist <- gets tanks
|
2010-03-08 22:13:35 +01:00
|
|
|
shootlist <- gets shoots
|
|
|
|
|
2010-02-25 03:48:17 +01:00
|
|
|
textureWood <- getTexture TextureWood
|
2010-02-25 04:38:14 +01:00
|
|
|
textureTank <- getTexture TextureTank
|
2010-03-05 03:32:02 +01:00
|
|
|
textureCannon <- getTexture TextureCannon
|
2010-03-08 22:13:35 +01:00
|
|
|
textureBullet <- getTexture TextureBullet
|
2010-02-23 23:31:11 +01:00
|
|
|
|
2010-03-02 23:22:44 +01:00
|
|
|
(lw, lh) <- gets level >>= \l -> return (fromIntegral . levelWidth $ l :: GLfloat, fromIntegral . levelHeight $ l :: GLfloat)
|
|
|
|
|
2010-02-23 23:31:11 +01:00
|
|
|
liftIO $ do
|
2010-02-23 20:51:30 +01:00
|
|
|
clear [ColorBuffer]
|
|
|
|
|
2010-02-25 03:48:17 +01:00
|
|
|
texture Texture2D $= Enabled
|
|
|
|
textureBinding Texture2D $= Just textureWood
|
|
|
|
|
|
|
|
renderPrimitive Quads $ do
|
|
|
|
texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat)
|
2010-03-08 19:31:48 +01:00
|
|
|
vertex $ Vertex2 0 lh
|
2010-02-25 03:48:17 +01:00
|
|
|
|
2010-03-08 19:31:48 +01:00
|
|
|
texCoord $ TexCoord2 lw 0
|
|
|
|
vertex $ Vertex2 lw lh
|
2010-02-25 03:48:17 +01:00
|
|
|
|
2010-03-08 19:31:48 +01:00
|
|
|
texCoord $ TexCoord2 lw lh
|
|
|
|
vertex $ Vertex2 lw 0
|
2010-02-25 03:48:17 +01:00
|
|
|
|
2010-03-08 19:31:48 +01:00
|
|
|
texCoord $ TexCoord2 0 lh
|
|
|
|
vertex $ Vertex2 (0 :: GLfloat) (0 :: GLfloat)
|
2010-03-02 23:22:44 +01:00
|
|
|
|
|
|
|
forM_ tanklist $ \tank -> preservingMatrix $ do
|
|
|
|
let x = fromReal . posx $ tank
|
|
|
|
y = fromReal . posy $ tank
|
2010-03-08 22:13:35 +01:00
|
|
|
rotDir = fromReal . dir $ tank
|
|
|
|
rotAim = fromReal . aim $ tank
|
2010-03-02 23:22:44 +01:00
|
|
|
|
|
|
|
translate $ Vector3 x y (0 :: GLfloat)
|
2010-03-05 03:32:02 +01:00
|
|
|
rotate rotDir $ Vector3 0 0 (1 :: GLfloat)
|
|
|
|
|
|
|
|
textureBinding Texture2D $= Just textureTank
|
|
|
|
|
|
|
|
renderPrimitive Quads $ do
|
|
|
|
texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (-0.5 :: GLfloat) (-0.5 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (0 :: GLfloat) (1 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (-0.5 :: GLfloat) (0.5 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (1 :: GLfloat) (1 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (0.5 :: GLfloat) (0.5 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat)
|
|
|
|
|
|
|
|
rotate (rotAim-rotDir) $ Vector3 0 0 (1 :: GLfloat)
|
|
|
|
|
|
|
|
textureBinding Texture2D $= Just textureCannon
|
2010-03-02 23:22:44 +01:00
|
|
|
|
|
|
|
renderPrimitive Quads $ do
|
|
|
|
texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (-0.5 :: GLfloat) (-0.5 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (0 :: GLfloat) (1 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (-0.5 :: GLfloat) (0.5 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (1 :: GLfloat) (1 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (0.5 :: GLfloat) (0.5 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat)
|
2010-03-08 22:13:35 +01:00
|
|
|
|
|
|
|
forM_ shootlist $ \shoot -> preservingMatrix $ do
|
|
|
|
let x = fromReal . shootX $ shoot
|
|
|
|
y = fromReal . shootY $ shoot
|
|
|
|
rotDir = fromReal . shootDir $ shoot
|
|
|
|
|
|
|
|
translate $ Vector3 x y (0 :: GLfloat)
|
|
|
|
rotate rotDir $ Vector3 0 0 (1 :: GLfloat)
|
|
|
|
|
|
|
|
textureBinding Texture2D $= Just textureBullet
|
|
|
|
|
|
|
|
renderPrimitive Quads $ do
|
|
|
|
texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (-0.2 :: GLfloat) (-0.2 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (0 :: GLfloat) (1 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (-0.2 :: GLfloat) (0.2 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (1 :: GLfloat) (1 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (0.2 :: GLfloat) (0.2 :: GLfloat)
|
|
|
|
|
|
|
|
texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat)
|
|
|
|
vertex $ Vertex2 (0.2 :: GLfloat) (-0.2 :: GLfloat)
|
|
|
|
|
2010-03-05 03:32:02 +01:00
|
|
|
|
2010-02-25 02:15:26 +01:00
|
|
|
fromReal :: (Real a, Fractional b) => a -> b
|
|
|
|
fromReal = fromRational . toRational
|