This repository has been archived on 2025-03-03. You can view files and clone it, but cannot push or open issues or pull requests.
htanks/Render.hs

167 lines
8.2 KiB
Haskell
Raw Normal View History

2010-02-23 20:51:30 +01:00
module Render ( setup
, render
) where
2010-03-09 02:21:39 +01:00
import Paths_htanks
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
import Control.Monad.State
2010-02-23 20:51:30 +01:00
import Data.Fixed
2010-02-25 03:16:44 +01:00
import Data.Maybe
import Data.Ratio
2010-02-25 03:16:44 +01:00
import qualified Data.Map as M
import Bindings.GLPng
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)
import Graphics.Rendering.OpenGL.GL.Framebuffer (clear, ClearBuffer(..))
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-03-09 02:21:39 +01:00
texturePath :: Texture -> IO FilePath
texturePath t = getDataFileName $ path t
where
path TextureWood = "tex/Wood.png"
path TextureTank = "tex/Tank.png"
path TextureCannon = "tex/Cannon.png"
path 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-03-09 02:21:39 +01:00
path <- liftIO $ texturePath t
tex <- liftIO $ pngBind path 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
setup :: Game ()
setup = do
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
getTexture TextureTank
getTexture TextureCannon
getTexture TextureBullet
2010-02-25 03:16:44 +01:00
return ()
render :: Game ()
render = do
2010-03-02 23:22:44 +01:00
tanklist <- gets tanks
shootlist <- gets shoots
2010-02-25 03:48:17 +01:00
textureWood <- getTexture TextureWood
textureTank <- getTexture TextureTank
textureCannon <- getTexture TextureCannon
textureBullet <- getTexture TextureBullet
2010-03-02 23:22:44 +01:00
(lw, lh) <- gets level >>= \l -> return (fromIntegral . levelWidth $ l :: GLfloat, fromIntegral . levelHeight $ l :: GLfloat)
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
2010-03-09 03:19:34 +01:00
let x = fromReal . tankX $ tank
y = fromReal . tankY $ tank
rotDir = fromReal . tankDir $ tank
rotAim = fromReal . tankAim $ tank
2010-03-02 23:22:44 +01:00
translate $ Vector3 x y (0 :: GLfloat)
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)
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-02-25 02:15:26 +01:00
fromReal :: (Real a, Fractional b) => a -> b
fromReal = fromRational . toRational