@@ -25,22 +25,38 @@ bottom = [(p3,p4,p7),(p7,p2,p3)]
2525
2626positions = front ++ back ++ right ++ left ++ top ++ bottom
2727
28−gray = v3 0.7 0.7 0.7
29−red = v3 1 0 0
30−green = v3 0 1 0
31−blue = v3 0 0 1
32−yellow = v3 1 1 0
33−purple = v3 0 1 1
28+toV3 color =
29+ let c = toRgb color
30+ in v3 (toFloat c.red / 255) (toFloat c.green / 255) (toFloat c.blue / 255)
3431
35−repeat n elem = map (\_ -> elem) [0..n-1]
36−
37−colors = concat . map (\c -> repeat 2 (c,c,c)) <| [gray,red,green,blue,yellow,purple]
32+colors : [Triangle V3]
33+colors =
34+ concatMap (\c' -> let c = toV3 c' in repeat 2 (c,c,c))
35+ [gray,red,green,blue,yellow,purple]
3836
3937mesh : [Triangle {pos : V3, color : V3}]
4038mesh = zipWith (zipTriangle (\pos color -> { pos = pos, color = color })) positions colors
4139
42−vert : Shader {a | pos : V3, color : V3} {b | rot : M4x4, per : M4x4, cam : M4x4} {vcolor : V3}
43−vert = [glShader|
40+per : M4x4
41+per = makePerspective 45 1 0.01 100
42+
43+cam : M4x4
44+cam = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
45+
46+angle : Signal Float
47+angle = foldp (\dt theta -> theta + dt / 10000) 0 (fps 25)
48+
49+rot : Signal { rot : M4x4, per : M4x4, cam : M4x4, shade : Float }
50+rot = (\t -> { rot = mul (makeRotate (3*t) (v3 0 1 0)) (makeRotate (2*t) (v3 1 0 0)), per = per, cam = cam, shade = 0.8 }) <~ angle
51+
52+draw : Signal [Model]
53+draw = combine [ model vertexShader fragmentShader mesh <~ rot ]
54+
55+main = webgl <~ dimensions ~ draw
56+
57+vertexShader : Shader {a | pos : V3, color : V3} {b | rot : M4x4, per : M4x4, cam : M4x4} {vcolor : V3}
58+vertexShader = [glShader|
59+
4460attribute vec3 pos;
4561attribute vec3 color;
4662uniform mat4 per;
@@ -51,32 +67,17 @@ void main () {
5167 gl_Position = per * cam * rot * vec4(pos, 1.0);
5268 vcolor = color;
5369}
70+
5471|]
5572
56−frag : Shader {} {b | shade : Float} {vcolor : V3}
57−frag = [glShader|
73+fragmentShader : Shader {} {b | shade : Float} {vcolor : V3}
74+fragmentShader = [glShader|
75+
5876precision mediump float;
5977uniform float shade;
6078varying vec3 vcolor;
6179void main () {
6280 gl_FragColor = shade * vec4(vcolor, 1.0);
6381}
64−|]
65−
66−per : M4x4
67−per = makePerspective 45 1 0.01 100
68−
69−cam : M4x4
70−cam = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
71−
72−angle : Signal Float
73−angle = foldp (\_ n -> n + 0.02) 0 (fps 25)
74−
75−rot : Signal { rot : M4x4, per : M4x4, cam : M4x4, shade : Float }
76−rot = (\t -> { rot = mul (makeRotate (3*t) (v3 0 1 0)) (makeRotate (2*t) (v3 1 0 0)), per = per, cam = cam, shade = 0.8 }) <~ angle
77−
78−draw : Signal [Model]
79−draw = combine [ (\rot -> (model vert frag mesh rot)) <~ rot ]
80−
81−main = webgl <~ dimensions ~ draw
8282
83+|]