@@ -25,22 +25,38 @@ bottom = [(p3,p4,p7),(p7,p2,p3)]
26positions = front ++ back ++ right ++ left ++ top ++ bottom
26positions = front ++ back ++ right ++ left ++ top ++ bottom
28−gray = v3 0.7 0.7 0.7
28+toV3 color =
29−red = v3 1 0 0
29+ let c = toRgb color
30−green = v3 0 1 0
30+ in v3 (toFloat c.red / 255) (toFloat c.green / 255) (toFloat c.blue / 255)
35−repeat n elem = map (\_ -> elem) [0..n-1]
32+colors : [Triangle V3]
34+ concatMap (\c' -> let c = toV3 c' in repeat 2 (c,c,c))
37−colors = concat . map (\c -> repeat 2 (c,c,c)) <| [gray,red,green,blue,yellow,purple]
35+ [gray,red,green,blue,yellow,purple]
39mesh : [Triangle {pos : V3, color : V3}]
37mesh : [Triangle {pos : V3, color : V3}]
40mesh = zipWith (zipTriangle (\pos color -> { pos = pos, color = color })) positions colors
38mesh = zipWith (zipTriangle (\pos color -> { pos = pos, color = color })) positions colors
41+per = makePerspective 45 1 0.01 100
44+cam = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
47+angle = foldp (\dt theta -> theta + dt / 10000) 0 (fps 25)
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
53+draw = combine [ model vertexShader fragmentShader mesh <~ rot ]
55+main = webgl <~ dimensions ~ draw
42−vert : Shader {a | pos : V3, color : V3} {b | rot : M4x4, per : M4x4, cam : M4x4} {vcolor : V3}
57+vertexShader : Shader {a | pos : V3, color : V3} {b | rot : M4x4, per : M4x4, cam : M4x4} {vcolor : V3}
43−vert = [glShader|
58+vertexShader = [glShader|
44attribute vec3 pos;
60attribute vec3 pos;
45attribute vec3 color;
61attribute vec3 color;
46uniform mat4 per;
62uniform mat4 per;
@@ -51,32 +67,17 @@ void main () {
51 gl_Position = per * cam * rot * vec4(pos, 1.0);
67 gl_Position = per * cam * rot * vec4(pos, 1.0);
52 vcolor = color;
68 vcolor = color;
56−frag : Shader {} {b | shade : Float} {vcolor : V3}
73+fragmentShader : Shader {} {b | shade : Float} {vcolor : V3}
57−frag = [glShader|
74+fragmentShader = [glShader|
58precision mediump float;
76precision mediump float;
59uniform float shade;
77uniform float shade;
60varying vec3 vcolor;
78varying vec3 vcolor;
61void main () {
79void main () {
62 gl_FragColor = shade * vec4(vcolor, 1.0);
80 gl_FragColor = shade * vec4(vcolor, 1.0);
67−per = makePerspective 45 1 0.01 100
70−cam = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
73−angle = foldp (\_ n -> n + 0.02) 0 (fps 25)
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
79−draw = combine [ (\rot -> (model vert frag mesh rot)) <~ rot ]
81−main = webgl <~ dimensions ~ draw