diff options
Diffstat (limited to 'src/Main.hs')
| -rw-r--r-- | src/Main.hs | 128 |
1 files changed, 72 insertions, 56 deletions
diff --git a/src/Main.hs b/src/Main.hs index 2786f86..16029b4 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -22,7 +22,7 @@ import Game.Internal.Types import Graphics.Rendering.OpenGL (($=)) import qualified Graphics.Rendering.OpenGL as GL import qualified Graphics.UI.GLFW as GLFW -import Linear (V3 (..), V4 (..), _y) +import Linear (V3 (..), V4 (..), (*^), _y) import qualified Linear as L -- | Main function runs game @@ -48,8 +48,9 @@ main = do GLFW.setCursorPosCallback window $ Just (cursorPosHandler Nothing) (objects, program) <- initResources $ - -- [map (v3tov4 0) $ map (+ V3 a 0 0) cube | a <- take 100 [0, 2 ..]] - [hCube] + [map (v3tov4 0) $ map (+ V3 a 0 0) cube | a <- take 100 [4, 6 ..]] + ++ [hCube] + ++ [map (\v -> rotate4 0 3 (g90 / 3) (v + V4 0 3 0 0)) hCube] let model = mkModel @@ -75,34 +76,13 @@ main = do -------------------------------------------------------------------------------- -- Arrays -------------------------------------------------------------------------------- -top :: [V3 GL.GLfloat] -top = - [ V3 p 0 p, - V3 p 0 m, - V3 m 0 p, - V3 m 0 m - ] - -side :: [V3 GL.GLfloat] -side = - [ V3 0 p p, - V3 0 p m, - V3 0 m p, - V3 0 m m - ] - -front :: [V3 GL.GLfloat] -front = - [ V3 p p 0, - V3 p m 0, - V3 m p 0, - V3 m m 0 - ] m = (0 - p) p = 0.5 +g90 = pi / 2 + v3tov4 :: GL.GLfloat -> V3 GL.GLfloat -> V4 GL.GLfloat v3tov4 w (V3 x y z) = V4 x y z w @@ -115,41 +95,77 @@ v3tov4'' w (V3 x y z) = V4 x w y z v3tov4''' :: GL.GLfloat -> V3 GL.GLfloat -> V4 GL.GLfloat v3tov4''' w (V3 x y z) = V4 w x y z --- | TODO optimise cube +rotate :: V3 GL.GLfloat -> GL.GLfloat -> V3 GL.GLfloat -> V3 GL.GLfloat +rotate axis angle point = L.fromQuaternion (L.axisAngle axis angle) L.!* point + +rotate4 :: Int -> Int -> GL.GLfloat -> V4 GL.GLfloat -> V4 GL.GLfloat +rotate4 i0 i1 angle (V4 x y z w) = + let coords = [x, y, z, w] + cos' = cos angle + sin' = sin angle + xi = coords !! i0 + xj = coords !! i1 + coords' = + [ if k == i0 + then cos' * xi - sin' * xj + else + if k == i1 + then sin' * xi + cos' * xj + else coords !! k + | k <- [0 .. 3] + ] + in V4 (coords' !! 0) (coords' !! 1) (coords' !! 2) (coords' !! 3) + +cycle3r :: V3 GL.GLfloat -> V3 GL.GLfloat +cycle3r (V3 a b c) = V3 c a b + +cycle3l :: V3 GL.GLfloat -> V3 GL.GLfloat +cycle3l (V3 a b c) = V3 b c a + +face :: [V3 GL.GLfloat] +face = + [ V3 m m 0, + V3 p m 0, + V3 m p 0, + V3 m p 0, + V3 p m 0, + V3 p p 0 + ] + +-- | cube, side length 1, centered on 0 0 0 cube :: [V3 GL.GLfloat] cube = - [ V3 p p p, -- front - V3 p m p, - V3 m p p, - V3 m m p, -- down - V3 m m m, - V3 p m p, - V3 p m m, -- right - V3 p p m, - V3 p m p, - V3 p p p, -- up - V3 m p p, - V3 p p m, - V3 m p m, -- back - V3 p m m, - V3 p p m, - V3 m m m, -- left - V3 m p m, - V3 m m p, - V3 m p p - ] + concatMap + ( \faceSpec -> + map + (\v -> (rotate (fst faceSpec) g90 v) L.^+^ (rotate (fst faceSpec) g90 (snd faceSpec))) + face + ) + [ (V3 0 0 1, V3 0 0 p), + (V3 0 1 0, V3 0 0 p), + (V3 1 0 0, V3 0 0 p), + (V3 0 0 (-1), V3 0 0 m), -- no clue + (V3 0 (-1) 0, V3 0 0 p), + (V3 (-1) 0 0, V3 0 0 p) + ] --- | TODO optimise hCube hCube :: [V4 GL.GLfloat] hCube = - (map (v3tov4 m) cube) - ++ (map (v3tov4 p) cube) - ++ (map (v3tov4' m) cube) - ++ (map (v3tov4' p) cube) - ++ (map (v3tov4'' m) cube) - ++ (map (v3tov4'' p) cube) - ++ (map (v3tov4''' m) cube) - ++ (map (v3tov4''' p) cube) + concatMap + ( \(w, i0, i1) -> + map + (rotate4 i0 i1 g90 . v3tov4 w) + cube + ) + [ (p, 3, 0), + (p, 0, 3), + (p, 1, 3), + (p, 2, 3), + (m, 3, 0), + (m, 0, 3), + (m, 1, 3), + (m, 2, 3) + ] -------------------------------------------------------------------------------- -- Elm-like data structures |
