From dafe16f191f99dc1199a5b386fad916a78c5c4f1 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 12 Apr 2010 14:40:31 +0200 Subject: Some improvements on coordinate calculation & player rendering --- src/GLX.hs | 9 ++++++--- src/HTanks.hs | 6 +++--- src/HWiidPlayer.hs | 7 ++++--- src/Render.hs | 22 ++++++++++------------ 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/GLX.hs b/src/GLX.hs index 6f245a7..bc2201e 100644 --- a/src/GLX.hs +++ b/src/GLX.hs @@ -11,7 +11,7 @@ import Data.Maybe (isJust) import Data.Ratio import Graphics.Rendering.OpenGL.GL (($=), GLdouble, GLfloat, Vector3(..), Capability(..)) -import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, ortho, translate) +import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, ortho, translate, scale, rotate) import Graphics.X11.Types import Graphics.X11.Xlib.Atom (internAtom) @@ -179,8 +179,9 @@ windowToGameCoords :: Integral a => GLX -> a -> a -> IO (Float, Float) windowToGameCoords glx x y = getWindowAttributes (glxDisplay glx) (glxWindow glx) >>= \wa -> let w = fromIntegral . wa_width $ wa h = fromIntegral . wa_height $ wa - in return (((-w/2 + wx)/s + lw/2), ((h/2 - wy)/s + lh/2)) - where s = fromRational . glxScale $ glx + in return (((-w/2 + wx)/sx + lw/2), ((h/2 - wy)/sy + lh/2)) + where sx = fromRational . glxScale $ glx + sy = sx*(cos $ pi/6) lw = fromIntegral . glxLevelWidth $ glx lh = fromIntegral . glxLevelHeight $ glx wx = fromIntegral x @@ -197,6 +198,8 @@ resize lw lh w h = do matrixMode $= Projection loadIdentity ortho (-sf*aspectf) (sf*aspectf) (-sf) sf (-1) 1 + scale 1 1 (0.1 :: GLfloat) + rotate (-30) $ Vector3 1 0 (0 :: GLfloat) translate $ Vector3 (-(fromIntegral lw)/2) (-(fromIntegral lh)/2) (0 :: GLfloat) matrixMode $= Modelview 0 diff --git a/src/HTanks.hs b/src/HTanks.hs index c9525b9..f1e0e98 100644 --- a/src/HTanks.hs +++ b/src/HTanks.hs @@ -27,7 +27,7 @@ import Data.Obj3D.GL main :: IO () main = do let theLevel = testLevel - --hwiidPlayer <- newHWiidPlayer + hwiidPlayer <- newHWiidPlayer gl <- initGL $ glxDriver (levelWidth theLevel) (levelHeight theLevel) when (initialized gl) $ do @@ -36,8 +36,8 @@ main = do , Tank 5.0 3.5 0 0 1.5 270 False 3 1 5 1 ], bullets = []} mainstate = MainState {run = True, driver = SomeDriver gl, time = currentTime, players = - [ SomePlayer $ DefaultPlayer S.empty 0 0 False - --SomePlayer $ hwiidPlayer + [ --SomePlayer $ DefaultPlayer S.empty 0 0 False + SomePlayer $ hwiidPlayer , SomePlayer $ CPUPlayer 0 ], textures = M.empty, models = M.empty, gameState = gamestate} diff --git a/src/HWiidPlayer.hs b/src/HWiidPlayer.hs index d1df2e5..db35871 100644 --- a/src/HWiidPlayer.hs +++ b/src/HWiidPlayer.hs @@ -5,7 +5,7 @@ module HWiidPlayer ( HWiidPlayer ) where import Control.Monad -import Data.Bits +import Data.Bits hiding (rotate) import Data.Function (on) import Data.List (sortBy) import Data.Maybe @@ -14,7 +14,7 @@ import Data.Typeable import HWiid import Graphics.Rendering.OpenGL.GL (GLfloat, Vector3(..)) import Graphics.Rendering.OpenGL.GL.BeginEnd (unsafeRenderPrimitive, PrimitiveMode(..)) -import Graphics.Rendering.OpenGL.GL.CoordTrans (unsafePreservingMatrix, translate) +import Graphics.Rendering.OpenGL.GL.CoordTrans (unsafePreservingMatrix, translate, rotate) import Graphics.Rendering.OpenGL.GL.VertexSpec @@ -65,7 +65,8 @@ instance Player HWiidPlayer where renderPlayer (HWiidPlayer _ _ aims) = unsafePreservingMatrix $ do let (x, y) = mulV (1/(fromIntegral $ length aims)) $ foldr addV (0, 0) aims - translate $ Vector3 x y (0 :: GLfloat) + translate $ Vector3 x y (0.2 :: GLfloat) + rotate 30 $ Vector3 1 0 (0 :: GLfloat) unsafeRenderPrimitive Quads $ do texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat) diff --git a/src/Render.hs b/src/Render.hs index 82ad08e..356310f 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -92,13 +92,6 @@ setup = do (lw, lh) <- gets (level . gameState) >>= \l -> return (fromIntegral . levelWidth $ l :: GLfloat, fromIntegral . levelHeight $ l :: GLfloat) liftIO $ do - matrixMode $= Projection - scale 1 1 (0.1 :: GLfloat) - translate $ Vector3 (lw/2) (lh/2) 0 - rotate (-30) $ Vector3 1 0 (0 :: GLfloat) - translate $ Vector3 (-lw/2) (-lh/2) 0 - matrixMode $= Modelview 0 - blend $= Enabled blendFunc $= (SrcAlpha, OneMinusSrcAlpha) depthFunc $= Just Lequal @@ -144,6 +137,8 @@ render = do liftIO $ do clear [ColorBuffer, DepthBuffer] + depthFunc $= Just Lequal + texture Texture2D $= Enabled textureBinding Texture2D $= Just textureWood @@ -224,23 +219,26 @@ render = do y = realToFrac . bulletY $ bullet rotDir = realToFrac . bulletDir $ bullet - translate $ Vector3 x y (0 :: GLfloat) + translate $ Vector3 x y (0.1 :: GLfloat) + rotate 30 $ Vector3 1 0 (0 :: GLfloat) rotate rotDir $ Vector3 0 0 (1 :: GLfloat) textureBinding Texture2D $= Just textureBullet unsafeRenderPrimitive Quads $ do texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat) - vertex $ Vertex3 (-0.1 :: GLfloat) (-0.1 :: GLfloat) 0.01 + vertex $ Vertex3 (-0.1 :: GLfloat) (-0.1 :: GLfloat) 0 texCoord $ TexCoord2 (0 :: GLfloat) (1 :: GLfloat) - vertex $ Vertex3 (-0.1 :: GLfloat) (0.1 :: GLfloat) 0.01 + vertex $ Vertex3 (-0.1 :: GLfloat) (0.1 :: GLfloat) 0 texCoord $ TexCoord2 (1 :: GLfloat) (1 :: GLfloat) - vertex $ Vertex3 (0.1 :: GLfloat) (0.1 :: GLfloat) 0.01 + vertex $ Vertex3 (0.1 :: GLfloat) (0.1 :: GLfloat) 0 texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat) - vertex $ Vertex3 (0.1 :: GLfloat) (-0.1 :: GLfloat) 0.01 + vertex $ Vertex3 (0.1 :: GLfloat) (-0.1 :: GLfloat) 0 + + depthFunc $= Just Always textureBinding Texture2D $= Just textureCrosshair forM_ playerlist renderPlayer -- cgit v1.2.3