From d6fd0538254f0cb00440d7be5935b3d993da65bd Mon Sep 17 00:00:00 2001 From: nek0 Date: Sat, 18 Nov 2017 11:02:55 +0100 Subject: [PATCH] make make --- assets/spheres/vertHandle.blend | Bin 409496 -> 409024 bytes assets/spheres/vertHandle.obj | 24 +++++++++--------- examples/example03/Init.hs | 42 ++++++++++++++++++-------------- examples/example03/Logging.hs | 37 ++++++++++++++++++++++++++++ examples/example03/Main.hs | 30 ++++++++++++++--------- examples/example03/Types.hs | 2 +- examples/example03/Util.hs | 9 ++++--- hw.cabal | 22 +++++++++++++++++ 8 files changed, 120 insertions(+), 46 deletions(-) create mode 100644 examples/example03/Logging.hs diff --git a/assets/spheres/vertHandle.blend b/assets/spheres/vertHandle.blend index 0f517dba1b7c77a7d7b8c0bd62ba65baafce9b4b..806e473632aeeb15a5c851b1a2738d98682c352d 100644 GIT binary patch delta 33178 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 diff --git a/assets/spheres/vertHandle.obj b/assets/spheres/vertHandle.obj index c1b2e6a..ed5b583 100644 --- a/assets/spheres/vertHandle.obj +++ b/assets/spheres/vertHandle.obj @@ -2,18 +2,18 @@ # www.blender.org mtllib vertHandle.mtl o Icosphere -v 0.000000 -0.100000 0.000000 -v 0.072360 -0.044721 0.052572 -v -0.027639 -0.044721 0.085064 -v -0.089442 -0.044721 0.000000 -v -0.027639 -0.044721 -0.085064 -v 0.072360 -0.044721 -0.052572 -v 0.027639 0.044721 0.085064 -v -0.072360 0.044721 0.052572 -v -0.072360 0.044721 -0.052572 -v 0.027639 0.044721 -0.085064 -v 0.089442 0.044721 0.000000 -v 0.000000 0.100000 0.000000 +v 0.000000 -0.050000 0.000000 +v 0.036180 -0.022361 0.026286 +v -0.013819 -0.022361 0.042532 +v -0.044721 -0.022361 0.000000 +v -0.013819 -0.022361 -0.042532 +v 0.036180 -0.022361 -0.026286 +v 0.013819 0.022361 0.042532 +v -0.036180 0.022361 0.026286 +v -0.036180 0.022361 -0.026286 +v 0.013819 0.022361 -0.042532 +v 0.044721 0.022361 0.000000 +v 0.000000 0.050000 0.000000 vn 0.1876 -0.7947 0.5774 vn 0.6071 -0.7947 0.0000 vn -0.4911 -0.7947 0.3568 diff --git a/examples/example03/Init.hs b/examples/example03/Init.hs index a99c9af..14d3418 100644 --- a/examples/example03/Init.hs +++ b/examples/example03/Init.hs @@ -23,6 +23,7 @@ import Foreign import Util import Types +import Logging as LL import Debug.Trace @@ -92,12 +93,14 @@ load = do phys <- initPhysics - po <- initPhysicsObjects + po <- initPhysicsObjects (map listToPos $ chunksOf 4 $ loLocations sobj) -- traceIO $ show $ loLines sobj -- mapM_ (addRigidBody (pWorld phys)) (map bodyRigidBody (poBalls po)) - addRigidBody (pWorld phys) (bodyRigidBody $ poBall po) + mapM_ (\b -> addRigidBody (pWorld phys) (bodyRigidBody b)) (poBalls po) + + logIO Debug "Hello world" return StateData { ship = (Ship svao stl @@ -105,7 +108,7 @@ load = do (Quaternion 1 (V3 0 0 0)) (Just t) (Just texture)) - , vertHandles = createHandles hvao vhtl (loTriangles sobj) + , vertHandles = createHandles hvao vhtl (loLocations sobj) , proj = perspective (pi/2) (1600 / 900) 1 (-1) , camera = Camera { cameraFocus = V3 0 0 0 @@ -128,25 +131,26 @@ initPhysics = do setGravity world (V3 0 0 0) return $ Physics bp config disp solver world -initPhysicsObjects :: IO PhysicsObjects -initPhysicsObjects = do +initPhysicsObjects :: [V3 Float] -> IO PhysicsObjects +initPhysicsObjects poss = do -- ground <- newStaticPlaneShape (V3 0 1 0) 1 - ball <- newSphereShape 3 + ball <- newSphereShape 0.05 -- groundMotionState <- newDefaultMotionState (Quaternion 1 (V3 0 0 0)) (V3 0 (-51) 0) -- groundBody <- newRigidBody 0 groundMotionState 0.9 0.5 ground (V3 0 0 0) - -- balls <- mapM (\pos -> do - ballMotionState <- newDefaultMotionState (Quaternion 1 (V3 0 0 0)) - (V3 0 0 0) - localInertia <- calculateLocalInertia ball 1 (V3 0 0 0) - ballBody <- newRigidBody 1 ballMotionState 0 0 ball localInertia - setSleepingThresholds ballBody 0 0 - -- ) poss + balls <- mapM (\pos -> do + ballMotionState <- newDefaultMotionState (Quaternion 1 (V3 0 0 0)) + (fmap realToFrac pos) + localInertia <- calculateLocalInertia ball 1 (V3 0 0 0) + ballBody <- newRigidBody 0 ballMotionState 0 0 ball localInertia + setSleepingThresholds ballBody 0 0 + return $ PhysBody ball ballMotionState ballBody + ) poss return PhysicsObjects -- { poGround = PhysBody ground groundMotionState groundBody - { poBall = PhysBody ball ballMotionState ballBody + { poBalls = balls } genVertBufObject :: FilePath -> IO (GL.BufferObject, LoadedObject, Int) @@ -174,8 +178,10 @@ genVertBufObject path = do createHandles :: GL.VertexArrayObject -> Int -> [Float] -> [Ship] createHandles bo len ps = - map (\p -> Ship bo len (toPos p) (Quaternion 1 (V3 0 0 0)) Nothing Nothing) tris + map (\p -> Ship bo len (listToPos p) (Quaternion 1 (V3 0 0 0)) Nothing Nothing) tris where - tris = chunksOf 3 ps - toPos [x, y, z] = V3 x y z - toPos _ = error "not triangular" + tris = chunksOf 4 ps + +listToPos :: [Float] -> V3 Float +listToPos [x, y, z, _] = V3 x y z +listToPos _ = error "listToPos: not triangular coordinates encountered" diff --git a/examples/example03/Logging.hs b/examples/example03/Logging.hs new file mode 100644 index 0000000..2fe52db --- /dev/null +++ b/examples/example03/Logging.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE CPP #-} +module Logging where + +import Debug.Trace + +data LogLevel + = Debug + | Warn + | Error + +log :: LogLevel -> String -> a -> a +#if defined(DEBUG) +log Debug s = trace ("DEBUG: " ++ s) +#endif +#if defined(WARN) || defined(DEBUG) +log Warn s = trace ("WARN: " ++ s) +#endif +#if defined(ERROR) || defined(WARN) || defined(DEBUG) +log Error s = trace ("ERROR: " ++ s) +#endif +#if !(defined(ERROR) && defined(WARN) && defined(DEBUG)) || !defined(DEBUG) +log _ _ = id +#endif + +logIO :: LogLevel -> String -> IO () +#if defined(DEBUG) +logIO Debug s = traceIO ("DEBUG: " ++ s) +#endif +#if defined(WARN) || defined(DEBUG) +logIO Warn s = traceIO ("WARN: " ++ s) +#endif +#if defined(ERROR) || defined(WARN) || defined(DEBUG) +logIO Error s = traceIO ("ERROR: " ++ s) +#endif +#if !(defined(ERROR) && defined(WARN) && defined(DEBUG)) || !defined(DEBUG) +logIO _ _ = return () +#endif diff --git a/examples/example03/Main.hs b/examples/example03/Main.hs index 74a533d..6762b03 100644 --- a/examples/example03/Main.hs +++ b/examples/example03/Main.hs @@ -55,18 +55,26 @@ update dt = do let phys = physics sd physos = physicsObjects sd liftIO $ stepSimulation (pWorld phys) dt 10 Nothing - (pos, rot) <- do - ms <- liftIO $ getMotionState (bodyRigidBody $ poBall physos) - npos <- liftIO $ return . fmap realToFrac =<< getPosition ms - nrot <- liftIO $ return . fmap realToFrac =<< getRotation ms - return (npos, nrot) - let nship = - (ship sd) - { shipRot = rot - , shipPos = pos - } + nvhs <- mapM (\(smallBall, vh) -> do + ms1 <- liftIO $ getMotionState (bodyRigidBody smallBall) + r1 <- liftIO $ return . fmap realToFrac =<< getPosition ms1 + return vh + { shipPos = r1 + } + ) (zip (poBalls physos) (vertHandles sd)) + -- (pos, rot) <- do + -- ms <- liftIO $ getMotionState (bodyRigidBody $ poBall physos) + -- npos <- liftIO $ return . fmap realToFrac =<< getPosition ms + -- nrot <- liftIO $ return . fmap realToFrac =<< getRotation ms + -- return (npos, nrot) + -- let nship = + -- (ship sd) + -- { shipRot = rot + -- , shipPos = pos + -- } putAffection sd - { ship = nship + { -- ship = nship + vertHandles = nvhs } draw :: Affection StateData () diff --git a/examples/example03/Types.hs b/examples/example03/Types.hs index c167312..931ab46 100644 --- a/examples/example03/Types.hs +++ b/examples/example03/Types.hs @@ -45,7 +45,7 @@ data Physics = Physics data PhysicsObjects = PhysicsObjects -- { poGround :: PhysBody StaticPlaneShape - { poBall :: PhysBody SphereShape + { poBalls :: [PhysBody SphereShape] } data PhysBody a = PhysBody diff --git a/examples/example03/Util.hs b/examples/example03/Util.hs index 3b40c0b..15a4422 100644 --- a/examples/example03/Util.hs +++ b/examples/example03/Util.hs @@ -17,19 +17,19 @@ data LoadedObject = LoadedObject { loTriangles :: [Float] , loLines :: [Float] , loPoints :: [Float] + , loLocations :: [Float] , loTexTri :: Maybe [Float] } deriving (Show) loadObj :: WavefrontOBJ -> LoadedObject loadObj obj = - LoadedObject ts ls ps tritex + LoadedObject ts ls ps locs tritex where inter = objLocations obj interTex = objTexCoords obj faces = map elValue (V.toList $ objFaces obj) lns = map elValue (V.toList $ objLines obj) - points = trace (show $ map elValue (V.toList $ objPoints obj)) - (map elValue (V.toList $ objPoints obj)) + points = map elValue (V.toList $ objPoints obj) deface (Face a b c []) = map (\i -> inter V.! (faceLocIndex i -1)) [a, b, c] deface _ = @@ -39,12 +39,13 @@ loadObj obj = depoint (Point i) = inter V.! (i - 1) tsLocs = concatMap deface faces lsLocs = concatMap deline lns - psLocs = map depoint (trace (show points) points) + psLocs = map depoint points deLoc (Location x y z w) = [x, y, z, w] deTex (TexCoord r s _) = [r, s] ts = concatMap deLoc tsLocs ls = concatMap deLoc lsLocs ps = concatMap deLoc psLocs + locs = concatMap deLoc (V.toList inter) defaceTex :: Face -> Maybe [TexCoord] defaceTex (Face a b c []) = mapM diff --git a/hw.cabal b/hw.cabal index 4767bbf..028b71c 100644 --- a/hw.cabal +++ b/hw.cabal @@ -15,6 +15,21 @@ build-type: Simple extra-source-files: ChangeLog.md cabal-version: >=1.10 +flag debug + description: Enable debug messages + default: False + manual: True + +flag warn + description: Enable warning messages + default: False + manual: True + +flag error + description: Enable error messages + default: False + manual: True + executable hw main-is: Main.hs other-modules: Util @@ -123,10 +138,17 @@ executable example02 extra-libraries: stdc++ executable example03 + if flag(debug) + cpp-options: -DDEBUG + if flag(warn) + cpp-options: -DWARN + if flag(error) + cpp-options: -DERROR main-is: Main.hs other-modules: Util , Types , Init + , Logging -- other-extensions: default-extensions: OverloadedStrings build-depends: base >=4.9