(def vertex-shader "
attribute vec2 pos;
void main()
{
  gl_Position = vec4(pos, 0, 1);
}")

(def fragment-shader "
precision mediump float;

void main()
{
  gl_FragColor = vec4(0, 0.8, 0, 1);
}
")

(defn create-shader
  [gl text type]
  (let [shader (.createShader gl type)]
    (.shaderSource gl shader text)
    (.compileShader gl shader)
    shader))

(defn create-program
  [gl vstr fstr
  (let [program (.createProgram gl)
        vshader (create-shader gl vstr (.-VERTEX_SHADER gl))
        fshader (create-shader gl fstr (.-FRAGMENT_SHADER gl))]
    (.attachShader gl program vshader)
    (.attachShader gl program fshader)
    (.linkProgram gl program)
    program))

(defn init
	[]
	(let [canvas (.getElementById js/document "c")
	  	  gl     (.getContext canvas "experimental-webgl")
        buffer (.createBuffer gl)
        vertices (js/Array. -0.5 -0.5
                             0.5 -0.5
                             0    0.5)
        program (create-program gl vertex-shader fragment-shader)]
		(.bindBuffer gl (.-ARRAY_BUFFER gl) buffer)
    (.bufferData gl (.-ARRAY_BUFFER gl) (js/Float32Array. vertices) (.-STATIC_DRAW gl))
    (.useProgram gl program)
    (set! (.-vertexPosAttrib program) (.getAttribLocation gl program "pos"))
    (.enableVertexAttribArray gl (.-vertexPosAttrib program))
    (.vertexAttribPointer gl (.-vertexPosAttrib program) 2 (.-FLOAT gl) false 0 0)
    (.drawArrays gl (.-TRIANGLES gl) 0 3)))

(set! (.-onload js/window) init)
