summaryrefslogtreecommitdiff
path: root/src/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Main.hs')
-rw-r--r--src/Main.hs128
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