@@ -2,7 +2,7 @@
2module Box where
2module Box where
4import MJS (V3,M4x4,v3,makeRotate,makePerspective,makeLookAt,mul)
4import MJS (V3,M4x4,v3,makeRotate,makePerspective,makeLookAt,mul)
5−import Graphics.WebGL (Program, link, Triangle, zipTriangle, Buffer, bind, Model, encapsulate, webgl)
5+import Graphics.WebGL (Triangle, zipTriangle, Shader, Model, model, webgl)
6import Window(dimensions)
6import Window(dimensions)
8-- Define what our geometry looks like
8-- Define what our geometry looks like
@@ -39,6 +39,7 @@ colors = concat . map (\c -> repeat 2 (c,c,c)) <| [gray,red,green,blue,yellow,pu
39mesh : [Triangle {pos : V3, color : V3}]
39mesh : [Triangle {pos : V3, color : V3}]
40mesh = zipWith (zipTriangle (\pos color -> { pos = pos, color = color })) positions colors
40mesh = zipWith (zipTriangle (\pos color -> { pos = pos, color = color })) positions colors
42+vert : Shader {a | pos : V3, color : V3} {b | rot : M4x4, per : M4x4, cam : M4x4} {vcolor : V3}
42vert = [glShader|
43vert = [glShader|
43attribute vec3 pos;
44attribute vec3 pos;
44attribute vec3 color;
45attribute vec3 color;
@@ -52,19 +53,16 @@ void main () {
56+frag : Shader {} {b | shade : Float} {vcolor : V3}
55frag = [glShader|
57frag = [glShader|
56precision mediump float;
58precision mediump float;
57varying vec3 vcolor;
60varying vec3 vcolor;
58void main () {
61void main () {
59− gl_FragColor = vec4(vcolor, 1.0);
62+ gl_FragColor = shade * vec4(vcolor, 1.0);
65−buf : Buffer {pos : V3, color : V3}
69per = makePerspective 45 1 0.01 100
67per = makePerspective 45 1 0.01 100
@@ -74,10 +72,11 @@ cam = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
74angle : Signal Float
72angle : Signal Float
75angle = foldp (\_ n -> n + 0.02) 0 (fps 25)
73angle = foldp (\_ n -> n + 0.02) 0 (fps 25)
75+rot : Signal { rot : M4x4, per : M4x4, cam : M4x4, shade : Float }
77−rot = (\t -> { rot = mul (makeRotate (3*t) (v3 0 1 0)) (makeRotate (2*t) (v3 1 0 0)), per = per, cam = cam }) <~ angle
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
79draw : Signal [Model]
78draw : Signal [Model]
80−draw = combine [ (encapsulate prog buf) <~ rot ]
79+draw = combine [ (\rot -> (model vert frag mesh rot)) <~ rot ]
82main = webgl <~ dimensions ~ draw
81main = webgl <~ dimensions ~ draw