@@ -2,14 +2,15 @@
2module Crate where
2module Crate where
4import Http (..)
4import Http (..)
5−import MJS (..)
5+import Math.Vector (..)
6+import Math.Matrix (..)
6import Graphics.WebGL (..)
7import Graphics.WebGL (..)
8-- Define the mesh for a crate
9-- Define the mesh for a crate
9−crate : [Triangle { pos:V3, coord:V3 }]
10+crate : [Triangle { pos:Vec3, coord:Vec3 }]
10crate = concatMap rotatedFace [ (0,0), (90,0), (180,0), (270,0), (0,90), (0,-90) ]
11crate = concatMap rotatedFace [ (0,0), (90,0), (180,0), (270,0), (0,90), (0,-90) ]
12−rotatedFace : (Float,Float) -> [Triangle { pos:V3, coord:V3 }]
13+rotatedFace : (Float,Float) -> [Triangle { pos:Vec3, coord:Vec3 }]
13rotatedFace (angleX,angleY) =
14rotatedFace (angleX,angleY) =
14 let x = makeRotate (degrees angleX) (v3 1 0 0)
15 let x = makeRotate (degrees angleX) (v3 1 0 0)
15 y = makeRotate (degrees angleY) (v3 0 1 0)
16 y = makeRotate (degrees angleY) (v3 0 1 0)
@@ -17,7 +18,7 @@ rotatedFace (angleX,angleY) =
18 map (mapTriangle (\x -> {x | pos <- mul4x4 t x.pos })) face
19 map (mapTriangle (\x -> {x | pos <- mul4x4 t x.pos })) face
20−face : [Triangle { pos:V3, coord:V3 }]
21+face : [Triangle { pos:Vec3, coord:Vec3 }]
22 let topLeft = { pos = v3 -1 1 0, coord = v3 0 1 0 }
23 let topLeft = { pos = v3 -1 1 0, coord = v3 0 1 0 }
23 topRight = { pos = v3 1 1 0, coord = v3 1 1 0 }
24 topRight = { pos = v3 1 1 0, coord = v3 1 1 0 }
@@ -27,7 +28,7 @@ face =
27 [ (topLeft,topRight,bottomLeft), (bottomLeft,topRight,bottomRight) ]
28 [ (topLeft,topRight,bottomLeft), (bottomLeft,topRight,bottomRight) ]
30−view : Float -> M4x4
31+view : Float -> Mat4
31view angle =
32view angle =
32 foldr1 mul [ perspective
33 foldr1 mul [ perspective
@@ -35,10 +36,10 @@ view angle =
35 , makeRotate (2*angle) (v3 1 0 0)
36 , makeRotate (2*angle) (v3 1 0 0)
38−perspective : M4x4
39+perspective : Mat4
39perspective = makePerspective 45 1 0.01 100
40perspective = makePerspective 45 1 0.01 100
41−camera : M4x4
42+camera : Mat4
42camera = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
43camera = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
44-- Putting it together
45-- Putting it together
@@ -48,7 +49,7 @@ main = webgl (400,400) <~ lift2 scene (loadTex "woodCrate.jpg") (view <~ angle)
48angle : Signal Float
49angle : Signal Float
49angle = foldp (\dt theta -> theta + dt / 10000) 0 (fps 25)
50angle = foldp (\dt theta -> theta + dt / 10000) 0 (fps 25)
51−scene : Response Texture -> M4x4 -> [Model]
52+scene : Response Texture -> Mat4 -> [Model]
52scene response view =
53scene response view =
53 case response of
54 case response of
54 Waiting -> []
55 Waiting -> []
@@ -56,7 +57,7 @@ scene response view =
56 Success tex -> [model vertexShader fragmentShader crate { crate = tex, view = view }]
57 Success tex -> [model vertexShader fragmentShader crate { crate = tex, view = view }]
59−vertexShader : Shader { pos:V3, coord:V3 } { u | view:M4x4 } { vcoord:V2 }
60+vertexShader : Shader { pos:Vec3, coord:Vec3 } { u | view:Mat4 } { vcoord:Vec2 }
60vertexShader = [glShader|
61vertexShader = [glShader|
62attribute vec3 pos;
63attribute vec3 pos;
@@ -70,7 +71,7 @@ void main () {
73−fragmentShader : Shader {} { u | crate:Texture } { vcoord:V2 }
74+fragmentShader : Shader {} { u | crate:Texture } { vcoord:Vec2 }
74fragmentShader = [glShader|
75fragmentShader = [glShader|
76precision mediump float;
77precision mediump float;