@@ -1,85 +0,0 @@
5−import Math.Vector2 (Vec2)
6−import Math.Vector3 (..)
7−import Math.Matrix4 (..)
8−import Graphics.WebGL (..)
10−-- Define the mesh for a crate
11−crate : [Triangle { pos:Vec3, coord:Vec3 }]
12−crate = concatMap rotatedFace [ (0,0), (90,0), (180,0), (270,0), (0,90), (0,-90) ]
14−rotatedFace : (Float,Float) -> [Triangle { pos:Vec3, coord:Vec3 }]
15−rotatedFace (angleX,angleY) =
16− let x = makeRotate (degrees angleX) (v3 1 0 0)
17− y = makeRotate (degrees angleY) (v3 0 1 0)
18− t = x `mul` y `mul` makeTranslate (v3 0 0 1)
20− map (mapTriangle (\x -> {x | pos <- mulVec3 t x.pos })) face
22−face : [Triangle { pos:Vec3, coord:Vec3 }]
24− let topLeft = { pos = v3 -1 1 0, coord = v3 0 1 0 }
25− topRight = { pos = v3 1 1 0, coord = v3 1 1 0 }
26− bottomLeft = { pos = v3 -1 -1 0, coord = v3 0 0 0 }
27− bottomRight = { pos = v3 1 -1 0, coord = v3 1 0 0 }
29− [ (topLeft,topRight,bottomLeft), (bottomLeft,topRight,bottomRight) ]
34− foldr1 mul [ perspective
36− , makeRotate (3*angle) (v3 0 1 0)
37− , makeRotate (2*angle) (v3 1 0 0)
41−perspective = makePerspective 45 1 0.01 100
44−camera = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
46−-- Putting it together
48−main = webgl (400,400) <~ lift2 scene (loadTex "woodCrate.jpg") (view <~ angle)
51−angle = foldp (\dt theta -> theta + dt / 10000) 0 (fps 25)
53−scene : Response Texture -> Mat4 -> [Model]
58− Success tex -> [model vertexShader fragmentShader crate { crate = tex, view = view }]
61−vertexShader : Shader { pos:Vec3, coord:Vec3 } { u | view:Mat4 } { vcoord:Vec2 }
62−vertexShader = [glShader|
69− gl_Position = view * vec4(pos, 1.0);
75−fragmentShader : Shader {} { u | crate:Texture } { vcoord:Vec2 }
76−fragmentShader = [glShader|
78−precision mediump float;
79−uniform sampler2D crate;
82− gl_FragColor = texture2D(crate, vcoord);