From a4f2d991dacfb539a26e71002b6f244c44753b72 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 12 Apr 2010 02:47:09 +0200 Subject: [PATCH] Added 3D models --- htanks.cabal | 6 +- model/tank.blend | Bin 0 -> 183512 bytes model/tank.obj | 1980 ++++++++++++++++++++++++++++++++++++++++++++++ src/HTanks.hs | 12 +- src/MainLoop.hs | 2 + src/Model.hs | 8 + src/Render.hs | 72 +- 7 files changed, 2062 insertions(+), 18 deletions(-) create mode 100644 model/tank.blend create mode 100644 model/tank.obj create mode 100644 src/Model.hs diff --git a/htanks.cabal b/htanks.cabal index c6f18be..aa33d06 100644 --- a/htanks.cabal +++ b/htanks.cabal @@ -7,14 +7,14 @@ license: GPL-3 license-file: LICENSE author: Matthias Schiffer maintainer: matthias@gamezock.de -build-depends: base >= 4, syb, containers, mtl, time, X11, OpenGL, hwiid +build-depends: base >= 4, syb, containers, mtl, time, X11, OpenGL, hwiid, obj-model, obj-model-gl build-type: Simple -data-files: tex/*.png +data-files: tex/*.png model/*.obj executable: HTanks hs-source-dirs: src main-is: HTanks.hs other-modules: Collision, CPUPlayer, DefaultPlayer, HWiidPlayer, Game, GLDriver, GLX, Level, MainLoop, Paths_htanks, Player, Render, Simulation, Texture, Debris, - Tank, Bindings.GLX, Bindings.GLPng + Tank, Model, Bindings.GLX, Bindings.GLPng --ghc-options: -threaded extra-libraries: glpng diff --git a/model/tank.blend b/model/tank.blend new file mode 100644 index 0000000000000000000000000000000000000000..baf699eb4f6a79430e9b91dcb6275ea11ca4a5ce GIT binary patch literal 183512 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 wK5#M=_}|X^F@e90H IO FilePath texturePath t = getDataFileName $ path t @@ -54,6 +61,29 @@ getTexture t = do tex <- liftIO $ pngBind path BuildMipmap Alpha (Repeated, Repeat) (Linear', Just Linear') Linear' >>= return . TextureObject . fromIntegral . fst modify $ \state -> state {textures = M.insert t tex ts} return tex + +modelPath :: Model -> IO FilePath +modelPath t = getDataFileName $ path t + where + path ModelTank = "model/tank.obj" + +getModel :: Model -> Main InterleavedObj +getModel m = do + ms <- gets models + let mobj = M.lookup m ms + + if (isJust mobj) + then + return $ fromJust mobj + else do + path <- liftIO $ modelPath m + objmod <- liftIO $ loadObjFile path + + model <- case objmod of + Left error -> fail $ show error + Right obj -> liftIO $ makeInterleavedArrays obj + modify $ \state -> state {models = M.insert m model ms} + return model setup :: Main () @@ -62,13 +92,15 @@ setup = do blend $= Enabled blendFunc $= (SrcAlpha, OneMinusSrcAlpha) - -- cache textures + -- cache textures & models getTexture TextureWood getTexture TextureTank getTexture TextureCannon getTexture TextureBullet getTexture TextureCrosshair + getModel ModelTank + return () @@ -84,6 +116,8 @@ render = do textureBullet <- getTexture TextureBullet textureCrosshair <- getTexture TextureCrosshair + modelTank <- getModel ModelTank + (lw, lh) <- gets (level . gameState) >>= \l -> return (fromIntegral . levelWidth $ l :: GLfloat, fromIntegral . levelHeight $ l :: GLfloat) liftIO $ do @@ -104,7 +138,14 @@ render = do texCoord $ TexCoord2 0 (lh/2) vertex $ Vertex2 (0 :: GLfloat) (0 :: GLfloat) - + + texture Texture2D $= Disabled + + clientState VertexArray $= Enabled + clientState NormalArray $= Enabled + clientState TextureCoordArray $= Enabled + bindInterleavedArrays modelTank + forM_ tanklist $ \tank -> unsafePreservingMatrix $ do let x = realToFrac . tankX $ tank y = realToFrac . tankY $ tank @@ -112,11 +153,16 @@ render = do rotAim = realToFrac . tankAim $ tank translate $ Vector3 x y (0 :: GLfloat) + scale 0.1 0.1 (0.1 :: GLfloat) rotate rotDir $ Vector3 0 0 (1 :: GLfloat) - textureBinding Texture2D $= Just textureTank + --textureBinding Texture2D $= Just textureTank - unsafeRenderPrimitive Quads $ do + unsafePreservingMatrix $ do + rotate 90 $ Vector3 1 0 (0 :: GLfloat) + drawObject modelTank 1 + + {-unsafeRenderPrimitive Quads $ do texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat) vertex $ Vertex2 (-0.5 :: GLfloat) (-0.5 :: GLfloat) @@ -127,13 +173,19 @@ render = do vertex $ Vertex2 (0.5 :: GLfloat) (0.5 :: GLfloat) texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat) - vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat) + vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat)-} rotate (rotAim-rotDir) $ Vector3 0 0 (1 :: GLfloat) - textureBinding Texture2D $= Just textureCannon + --textureBinding Texture2D $= Just textureCannon - unsafeRenderPrimitive Quads $ do + unsafePreservingMatrix $ do + rotate 90 $ Vector3 1 0 (0 :: GLfloat) + drawObject modelTank 0 + + + + {-unsafeRenderPrimitive Quads $ do texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat) vertex $ Vertex2 (-0.5 :: GLfloat) (-0.5 :: GLfloat) @@ -144,7 +196,9 @@ render = do vertex $ Vertex2 (0.5 :: GLfloat) (0.5 :: GLfloat) texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat) - vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat) + vertex $ Vertex2 (0.5 :: GLfloat) (-0.5 :: GLfloat)-} + + texture Texture2D $= Enabled forM_ bulletlist $ \bullet -> unsafePreservingMatrix $ do let x = realToFrac . bulletX $ bullet