From c833fc847c9b0d7f5b226299e3923aedc1511d11 Mon Sep 17 00:00:00 2001 From: nek0 Date: Sun, 12 Nov 2017 17:10:47 +0100 Subject: [PATCH] trying to make vertex handles --- assets/spheres/vertHandle.blend | Bin 0 -> 409496 bytes assets/spheres/vertHandle.mtl | 10 ++ assets/spheres/vertHandle.obj | 58 ++++++++++ examples/example03/Init.hs | 171 +++++++++++++++++++++++++++++ examples/example03/Main.hs | 186 ++++++++++++++++++++++++++++++++ examples/example03/Types.hs | 54 ++++++++++ examples/example03/Util.hs | 79 ++++++++++++++ hw.cabal | 26 +++++ 8 files changed, 584 insertions(+) create mode 100644 assets/spheres/vertHandle.blend create mode 100644 assets/spheres/vertHandle.mtl create mode 100644 assets/spheres/vertHandle.obj create mode 100644 examples/example03/Init.hs create mode 100644 examples/example03/Main.hs create mode 100644 examples/example03/Types.hs create mode 100644 examples/example03/Util.hs diff --git a/assets/spheres/vertHandle.blend b/assets/spheres/vertHandle.blend new file mode 100644 index 0000000000000000000000000000000000000000..0f517dba1b7c77a7d7b8c0bd62ba65baafce9b4b GIT binary patch literal 409496 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

o1ke^^b~hG1fyQmn)*ci@#{_p-+x| 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 NwQiM4czW*N{{a%04)_27 literal 0 HcmV?d00001 diff --git a/assets/spheres/vertHandle.mtl b/assets/spheres/vertHandle.mtl new file mode 100644 index 0000000..9ce65d9 --- /dev/null +++ b/assets/spheres/vertHandle.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'vertHandle.blend' +# Material Count: 1 + +newmtl None +Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/assets/spheres/vertHandle.obj b/assets/spheres/vertHandle.obj new file mode 100644 index 0000000..c1b2e6a --- /dev/null +++ b/assets/spheres/vertHandle.obj @@ -0,0 +1,58 @@ +# Blender v2.79 (sub 0) OBJ File: 'vertHandle.blend' +# 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 +vn 0.1876 -0.7947 0.5774 +vn 0.6071 -0.7947 0.0000 +vn -0.4911 -0.7947 0.3568 +vn -0.4911 -0.7947 -0.3568 +vn 0.1876 -0.7947 -0.5774 +vn 0.9822 -0.1876 0.0000 +vn 0.3035 -0.1876 0.9342 +vn -0.7946 -0.1876 0.5774 +vn -0.7946 -0.1876 -0.5774 +vn 0.3035 -0.1876 -0.9342 +vn 0.7946 0.1876 0.5774 +vn -0.3035 0.1876 0.9342 +vn -0.9822 0.1876 0.0000 +vn -0.3035 0.1876 -0.9342 +vn 0.7946 0.1876 -0.5774 +vn 0.4911 0.7947 0.3568 +vn -0.1876 0.7947 0.5774 +vn -0.6071 0.7947 0.0000 +vn -0.1876 0.7947 -0.5774 +vn 0.4911 0.7947 -0.3568 +usemtl None +s off +f 1//1 2//1 3//1 +f 2//2 1//2 6//2 +f 1//3 3//3 4//3 +f 1//4 4//4 5//4 +f 1//5 5//5 6//5 +f 2//6 6//6 11//6 +f 3//7 2//7 7//7 +f 4//8 3//8 8//8 +f 5//9 4//9 9//9 +f 6//10 5//10 10//10 +f 2//11 11//11 7//11 +f 3//12 7//12 8//12 +f 4//13 8//13 9//13 +f 5//14 9//14 10//14 +f 6//15 10//15 11//15 +f 7//16 11//16 12//16 +f 8//17 7//17 12//17 +f 9//18 8//18 12//18 +f 10//19 9//19 12//19 +f 11//20 10//20 12//20 diff --git a/examples/example03/Init.hs b/examples/example03/Init.hs new file mode 100644 index 0000000..217d2fb --- /dev/null +++ b/examples/example03/Init.hs @@ -0,0 +1,171 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Init where + +import SDL (($=)) +import qualified SDL + +import qualified Graphics.Rendering.OpenGL as GL +import qualified Graphics.GLUtil as GLU + +import Data.List.Split (chunksOf) +import qualified Data.ByteString as BS + +import Physics.Bullet.Raw + +import Codec.Wavefront + +import Linear as L + +import SpatialMath + +import Foreign + +import Util +import Types + +load :: IO StateData +load = do + _ <- SDL.setMouseLocationMode SDL.RelativeLocation + GL.depthFunc $= Just GL.Less + + (shipBO, sobj, stl) <- genVertBufObject "assets/ships/jaeger/jaeger.obj" + + (vectHandleBO, hobj, vhtl) <- genVertBufObject "assets/spheres/vertHandle.obj" + + texture <- GL.genObjectName + GL.bindBuffer GL.ArrayBuffer $= Just texture + maybe (return ()) (\a -> withArray a $ \ptr -> + GL.bufferData GL.ArrayBuffer $= + ( fromIntegral $ length a * 2 * sizeOf (0 :: Double) + , ptr + , GL.StaticDraw + )) (loTexTri sobj) + GL.vertexAttribPointer (GL.AttribLocation 1) $= + ( GL.ToFloat + , GL.VertexArrayDescriptor 2 GL.Float 0 (plusPtr nullPtr 0) + ) + GL.vertexAttribArray (GL.AttribLocation 1) $= GL.Enabled + + GL.texture GL.Texture2D $= GL.Enabled + GL.activeTexture $= GL.TextureUnit 0 + t <- loadTex "assets/ships/jaeger/jaeger.texture.tga" + GL.textureBinding GL.Texture2D $= Just t + + let vertexShader = foldl BS.append BS.empty + [ "attribute vec3 coord3d;" + , "attribute vec2 texcoord;" + , "uniform mat4 mvp;" + , "varying vec2 f_texcoord;" + , "void main(void) {" + , " gl_Position = mvp * vec4(coord3d, 1.0);" + , " f_texcoord = texcoord;" + , "}" + ] + fragmentShaderShip = foldl BS.append BS.empty + [ "varying vec2 f_texcoord;" + , "uniform sampler2D texture;" + , "void main(void) {" + , " vec2 flip = vec2(f_texcoord.x, 1.0 - f_texcoord.y);" + , " gl_FragColor = texture2D(texture, flip);" + , "}" + ] + fragmentShaderHandle = foldl BS.append BS.empty + [ "varying vec2 f_texcoord;" + , "void main(void) {" + , " gl_FragColor = vec4(0,0,0,0.5);" + , "}" + ] + + handleProgram <- GLU.simpleShaderProgramBS vertexShader fragmentShaderHandle + shipProgram <- GLU.simpleShaderProgramBS vertexShader fragmentShaderShip + + phys <- initPhysics + + po <- initPhysicsObjects + + -- mapM_ (addRigidBody (pWorld phys)) (map bodyRigidBody (poBalls po)) + addRigidBody (pWorld phys) (bodyRigidBody $ poBall po) + + return StateData + { ship = Ship shipBO stl + (V3 0 0 0) + (Quaternion 1 (V3 0 0 0)) + (Just t) + , vertHandles = createHandles vectHandleBO vhtl (loPoints sobj) + , proj = perspective (pi/2) (1600 / 900) 1 (-1) + , camera = Camera + { cameraFocus = V3 0 0 0 + , cameraRot = Euler 0 0 0 + , cameraDist = -10 + } + , physics = phys + , physicsObjects = po + , shipProgram = shipProgram + , handleProgram = handleProgram + } + +initPhysics :: IO Physics +initPhysics = do + bp <- newDbvtBroadphase + config <- newDefaultCollisionConfiguration + disp <- newCollisionDispatcher config + solver <- newSequentialImpulseConstraintSolver + world <- newDiscreteDynamicsWorld disp bp solver config + setGravity world (V3 0 0 0) + return $ Physics bp config disp solver world + +initPhysicsObjects :: IO PhysicsObjects +initPhysicsObjects = do + -- ground <- newStaticPlaneShape (V3 0 1 0) 1 + ball <- newSphereShape 3 + + -- 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 + + return PhysicsObjects + -- { poGround = PhysBody ground groundMotionState groundBody + { poBall = PhysBody ball ballMotionState ballBody + } + +genVertBufObject :: FilePath -> IO (GL.VertexArrayObject, LoadedObject, Int) +genVertBufObject path = do + eobj <- fromFile path + let obj = case eobj of + Right o -> o + Left err -> error err + lobj = loadObj obj + + shipBO <- GL.genObjectName + GL.bindVertexArrayObject $= Just shipBO + + verts <- GL.genObjectName + GL.bindBuffer GL.ArrayBuffer $= Just verts + withArray (loTriangles lobj) $ \ptr -> + GL.bufferData GL.ArrayBuffer $= + ( fromIntegral $ length (loTriangles lobj) * 3 * sizeOf (0 :: Double) + , ptr + , GL.StaticDraw + ) + GL.vertexAttribPointer (GL.AttribLocation 0) $= + ( GL.ToFloat + , GL.VertexArrayDescriptor 4 GL.Float 0 (plusPtr nullPtr 0) + ) + GL.vertexAttribArray (GL.AttribLocation 0) $= GL.Enabled + return (shipBO, lobj, length (loTriangles lobj)) + +createHandles :: GL.VertexArrayObject -> Int -> [Float] -> [Ship] +createHandles bo len ps = + map (\p -> Ship bo len (toPos p) (Quaternion 1 (V3 0 0 0)) Nothing) tris + where + tris = chunksOf 3 ps + toPos [x, y, z] = V3 x y z + toPos _ = error "not triangular" diff --git a/examples/example03/Main.hs b/examples/example03/Main.hs new file mode 100644 index 0000000..8a2b01e --- /dev/null +++ b/examples/example03/Main.hs @@ -0,0 +1,186 @@ +{-# LANGUAGE OverloadedStrings, RecordWildCards #-} + +module Main where + +import Affection + +import SDL (($=)) +import qualified SDL + +import qualified Graphics.Rendering.OpenGL as GL +import qualified Graphics.GLUtil as GLU + +import Physics.Bullet.Raw + +import Control.Monad (when) +import Control.Monad.IO.Class (liftIO) + +import qualified Data.ByteString as BS + +import Linear as L + +import System.Random (randomRIO) + +import SpatialMath + +import Init +import Types + +import Debug.Trace as T + +main :: IO () +main = + withAffection AffectionConfig + { initComponents = All + , windowTitle = "hw" + , windowConfig = SDL.defaultWindow + { SDL.windowInitialSize = SDL.V2 1600 900 + , SDL.windowOpenGL = Just SDL.defaultOpenGL + { SDL.glProfile = SDL.Core SDL.Normal 3 2 + } + } + , initScreenMode = SDL.Fullscreen + , preLoop = return () + , eventLoop = handle + , updateLoop = update + , drawLoop = draw + , loadState = load + , cleanUp = const (return ()) + , canvasSize = Nothing + } + +update :: Double -> Affection StateData () +update dt = do + sd <- getAffection + 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 + } + putAffection sd + { ship = nship + } + +draw :: Affection StateData () +draw = + do + GL.viewport $= (GL.Position 0 0, GL.Size 1600 900) + StateData{..} <- getAffection + let view = lookAt + (cameraFocus camera + + rotVecByEulerB2A + (cameraRot camera) + (V3 0 0 (-cameraDist camera))) + (cameraFocus camera) + (V3 0 1 0) + GL.currentProgram $= (Just . GLU.program $ shipProgram) + drawShip shipProgram view ship + GL.currentProgram $= (Just . GLU.program $ handleProgram) + mapM_ (drawShip shipProgram view) vertHandles + where + drawShip program view (Ship{..}) = do + StateData{..} <- getAffection + let model = mkTransformation shipRot shipPos + pvm = proj !*! view !*! model + liftIO $ GLU.setUniform program "mvp" pvm + GL.bindVertexArrayObject $= Just shipVao + liftIO $ GL.drawArrays GL.Triangles 0 (fromIntegral shipVaoLen) + +handle :: SDL.EventPayload -> Affection StateData () +handle (SDL.WindowClosedEvent _) = quit + +handle (SDL.KeyboardEvent dat) = do + let key = SDL.keysymKeycode (SDL.keyboardEventKeysym dat) + when (SDL.keyboardEventKeyMotion dat == SDL.Pressed) $ + handleKey key +handle (SDL.MouseMotionEvent dat) = do + sd <- getAffection + let (V2 rx ry) = fromIntegral <$> SDL.mouseMotionEventRelMotion dat + c = camera sd + putAffection sd + { camera = + case SDL.mouseMotionEventState dat of + [SDL.ButtonRight] -> + let (V3 sx sy sz) = rotVecByEuler (cameraRot c) (V3 (rx / 10) 0 (ry / 10)) + in c {cameraFocus = cameraFocus c + V3 sx 0 sy} + [] -> + let dphi = pi / 4 / 45 / 10 + (Euler yaw pitch roll) = cameraRot c + nangle + | nangle' >= qc = qc - mu + | nangle' <= -qc = -qc + mu + | otherwise = nangle' + where + nangle' = (dphi * ry) + roll + qc = pi / 2 + mu = 0.01 + nrot = + Euler + yaw + (pitch + (rx * dphi)) + nangle + in c + { cameraRot = nrot + } + _ -> + c + } + +handle _ = return () + +handleKey :: SDL.Keycode -> Affection StateData () +handleKey code + | code == SDL.KeycodeR = + GL.clearColor $= GL.Color4 1 0 0 1 + | code == SDL.KeycodeG = + GL.clearColor $= GL.Color4 0 1 0 1 + | code == SDL.KeycodeB = + GL.clearColor $= GL.Color4 0 0 1 1 + | code == SDL.KeycodeP = do + r <- liftIO $ randomRIO (0, 1) + g <- liftIO $ randomRIO (0, 1) + b <- liftIO $ randomRIO (0, 1) + a <- liftIO $ randomRIO (0, 1) + GL.clearColor $= GL.Color4 r g b a + | code == SDL.KeycodeEscape = + quit + | code == SDL.KeycodeF = do + dt <- deltaTime <$> get + liftIO $ putStrLn $ show (1 / dt) ++ " FPS" + | code == SDL.KeycodeT = + toggleScreen + -- | code `elem` + -- [ SDL.KeycodeW + -- , SDL.KeycodeS + -- , SDL.KeycodeA + -- , SDL.KeycodeD + -- , SDL.KeycodeQ + -- , SDL.KeycodeE + -- ] + -- = do + -- sd <- getAffection + -- let body = bodyRigidBody $ poBall $ physicsObjects sd + -- ms <- liftIO $ getMotionState body + -- rot <- liftIO $ return . fmap realToFrac =<< getRotation ms + -- let tor = 5 + -- torqueimp = case code of + -- SDL.KeycodeW -> rotate rot (V3 (-tor) 0 0) -- (-dphi) + -- SDL.KeycodeS -> rotate rot (V3 tor 0 0) -- dphi + -- SDL.KeycodeA -> rotate rot (V3 0 (-tor) 0) -- (-dphi) + -- SDL.KeycodeD -> rotate rot (V3 0 tor 0) -- dphi + -- SDL.KeycodeE -> rotate rot (V3 0 0 (-tor)) -- (-dphi) + -- SDL.KeycodeQ -> rotate rot (V3 0 0 tor) -- dphi + -- _ -> V3 0 0 0 + -- liftIO $ applyTorqueImpulse + -- (bodyRigidBody $ poBall $ physicsObjects sd) + -- torqueimp + | otherwise = + return () diff --git a/examples/example03/Types.hs b/examples/example03/Types.hs new file mode 100644 index 0000000..4dacd93 --- /dev/null +++ b/examples/example03/Types.hs @@ -0,0 +1,54 @@ +module Types where + +import qualified Graphics.Rendering.OpenGL as GL +import qualified Graphics.GLUtil as GLU + +import Linear as L + +import SpatialMath + +import Physics.Bullet.Raw as Bullet + +data StateData = StateData + { ship :: Ship + , vertHandles :: [Ship] + , camera :: Camera + , proj :: M44 Float + , physics :: Physics + , physicsObjects :: PhysicsObjects + , shipProgram :: GLU.ShaderProgram + , handleProgram :: GLU.ShaderProgram + } + +data Ship = Ship + { shipVao :: GL.VertexArrayObject + , shipVaoLen :: Int + , shipPos :: V3 Float + , shipRot :: Quaternion Float + , shipTexture :: Maybe GL.TextureObject + } + +data Camera = Camera + { cameraFocus :: V3 Float + , cameraRot :: Euler Float + , cameraDist :: Float + } + +data Physics = Physics + { pBroadphase :: DbvtBroadphase + , pConfig :: DefaultCollisionConfiguration + , pDispatcher :: CollisionDispatcher + , pSolver :: SequentialImpulseConstraintSolver + , pWorld :: DiscreteDynamicsWorld + } + +data PhysicsObjects = PhysicsObjects + -- { poGround :: PhysBody StaticPlaneShape + { poBall :: PhysBody SphereShape + } + +data PhysBody a = PhysBody + { bodyShape :: a + , bodyMotionState :: MotionState + , bodyRigidBody :: RigidBody + } diff --git a/examples/example03/Util.hs b/examples/example03/Util.hs new file mode 100644 index 0000000..130400a --- /dev/null +++ b/examples/example03/Util.hs @@ -0,0 +1,79 @@ +module Util where + +import Codec.Wavefront + +import Control.Monad (sequence) + +import SDL (($=)) + +import qualified Graphics.Rendering.OpenGL as GL +import qualified Graphics.GLUtil as GLU + +import qualified Data.Vector as V + +data LoadedObject = LoadedObject + { loTriangles :: [Float] + , loLines :: [Float] + , loPoints :: [Float] + , loTexTri :: Maybe [Float] + } + +loadObj :: WavefrontOBJ -> LoadedObject +loadObj obj = + LoadedObject ts ls ps tritex + where + inter = objLocations obj + interTex = objTexCoords obj + faces = map elValue (V.toList $ objFaces obj) + lns = map elValue (V.toList $ objLines obj) + points = map elValue (V.toList $ objPoints obj) + deface (Face a b c []) = + map (\i -> inter V.! (faceLocIndex i -1)) [a, b, c] + deface _ = + error "loadObj: obj with quads encountered" + deline (Line a b) = + map (\i -> inter V.! (lineLocIndex i -1)) [a, b] + depoint (Point i) = inter V.! (i - 1) + tsLocs = concatMap deface faces + lsLocs = concatMap deline lns + 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 + defaceTex :: Face -> Maybe [TexCoord] + defaceTex (Face a b c []) = + mapM + (fmap (\x -> interTex V.! (x - 1)) . faceTexCoordIndex) + [a, b, c] + defaceTex _ = + error "loadObj: obj with quads encountered" + tritex :: Maybe [Float] + tritex = concatMap deTex <$> mftxs + mftxs :: Maybe [TexCoord] + mftxs = fmap concat (mapM defaceTex faces) + +-- objLocsToPtr :: WavefrontOBJ -> IO (Ptr Float, Int) +-- objLocsToPtr obj = do +-- let ivs = objLocations obj +-- faces = map elValue $ V.toList $ objFaces obj +-- vs = concatMap +-- (\(Face a b c []) -> +-- map (\i -> ivs V.! ((faceLocIndex i) - 1)) [a, b, c]) +-- faces +-- ptr <- newArray $ concatMap (\(Location x y z w) -> [x, y, z, w]) vs +-- return (ptr, length vs) +-- +-- objUVsToPtr :: WavefrontOBJ -> IO (Ptr Float, Int) +-- objUVsToPtr obj = do +-- let uvs= V.toList $ objTexCoords obj +-- ptr <- newArray $ concatMap (\(TexCoord r s t) -> [r, s, t]) uvs +-- return (ptr, length uvs) + +loadTex :: FilePath -> IO GL.TextureObject +loadTex f = do + t <- either error id <$> GLU.readTexture f + GL.textureFilter GL.Texture2D $= ((GL.Linear', Nothing), GL.Linear') + GLU.texture2DWrap $= (GL.Repeated, GL.ClampToEdge) + return t diff --git a/hw.cabal b/hw.cabal index 4a44ade..4767bbf 100644 --- a/hw.cabal +++ b/hw.cabal @@ -121,3 +121,29 @@ executable example02 default-language: Haskell2010 ghc-options: -Wall extra-libraries: stdc++ + +executable example03 + main-is: Main.hs + other-modules: Util + , Types + , Init + -- other-extensions: + default-extensions: OverloadedStrings + build-depends: base >=4.9 + , affection + , sdl2 + , linear + , spatial-math + , bytestring + , OpenGL + , OpenGLRaw + , GLUtil + , random + , vector + , wavefront + , shoot + , split + hs-source-dirs: examples/example03 + default-language: Haskell2010 + ghc-options: -Wall + extra-libraries: stdc++