<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--

/*
** Copyright (c) 2012 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/

-->
<link rel="stylesheet" type="text/css" href="../unit.css" />
<script type="application/javascript" src="../unit.js"></script>
<script type="application/javascript" src="../util.js"></script>
<script type="application/javascript">

Tests.startUnit = function () {
  var canvas = document.getElementById('gl');
  var gl = getGLContext(canvas);
  return [gl];
}

var arr = ['cr', 'cw', 'vr', 'vw', 'tvw'];
arr.forEach(function(e){
    Tests['test'+e+'vert'] = function(gl) {
        var sh = new Filter(gl, e+'vert', 'frag');
        assertFail(function(){sh.apply(function(f){
            f.uniform3fv('x', [0.0, 1.0, 2.0]);
            throwError(e+"vert");
        });});
        sh.destroy();
    }
    Tests['test'+e+'frag'] = function(gl) {
        var sh = new Filter(gl, 'vert', e+'frag');
        assertFail(function(){sh.apply(function(f){
            f.uniform3fv('x', [0.0, 1.0, 2.0]);
            throwError(e+"frag");
        });});
        sh.destroy();
    }
});

</script>
<script id="crvert" type="x-shader/x-vertex">


  attribute vec3 Vertex; attribute vec2 Tex;
  uniform float x[3];
  void main()
  {
      gl_Position = vec4(Vertex.st, Tex.s, x[4]);
  }
</script>
<script id="cwvert" type="x-shader/x-vertex">


  attribute vec3 Vertex; attribute vec2 Tex;
  uniform float x[3];
  void main()
  {
    x[4] = Vertex.z;
    gl_Position = vec4(Vertex.st, Tex.s, x[4]);
  }
</script>
<script id="vrvert" type="x-shader/x-vertex">


  uniform float x[3];
  attribute vec3 Vertex; attribute vec2 Tex;
  void main()
  {
    float idx = 40.0 * max(1.0, Vertex.x*20.0);
    gl_Position = vec4(Vertex, x[2] + Tex.s + x[int(idx)]);
  }
</script>
<script id="vwvert" type="x-shader/x-vertex">


  attribute vec3 Vertex; attribute vec2 Tex;
  uniform float x[3];
  void main()
  {
    int idx = 4 * int(max(1.0, Vertex.x*20.0));
    x[idx] = Vertex.z;
    gl_Position = vec4(Vertex.st, Tex.s, x[idx]);
  }
</script>
<script id="tvwvert" type="x-shader/x-vertex">


  attribute vec3 Vertex; attribute vec2 Tex;
  uniform float x[3];
  void main()
  {
    int idx = 4 * int(max(1.0, Vertex.x*20.0));
    x[2] = Vertex[idx];
    gl_Position = vec4(Vertex.st, Tex.s, x[2]);
  }
</script>
<script id="vert" type="x-shader/x-vertex">


  attribute vec3 Vertex; attribute vec2 Tex;
  varying vec2 TexCoord;
  void main()
  {
    TexCoord = Vertex.st;
    gl_Position = vec4(Vertex, Tex.s);
  }
</script>

<script id="crfrag" type="x-shader/x-fragment">


  precision mediump float;

  uniform float x[3];

  varying vec2 TexCoord;
  void main()
  {
    gl_FragColor = vec4(1.0, 0.0, 0.0, x[4]);
  }
</script>
<script id="cwfrag" type="x-shader/x-fragment">


  precision mediump float;

  uniform float x[3];

  varying vec2 TexCoord;
  void main()
  {
    x[4] = 6.0;
    gl_FragColor = vec4(1.0, 0.0, 0.0, x[4]);
  }
</script>
<script id="vrfrag" type="x-shader/x-fragment">


  precision mediump float;

  uniform float x[3];

  varying vec2 TexCoord;
  void main()
  {
    int idx = 4 * int(max(1.0, TexCoord.s*20.0));
    gl_FragColor = vec4(1.0, 0.0, 0.0, x[idx]);
  }
</script>
<script id="vwfrag" type="x-shader/x-fragment">


  precision mediump float;

  uniform float x[3];

  varying vec2 TexCoord;
  void main()
  {
    int idx = 4 * int(max(1.0, TexCoord.s*20.0));
    x[idx] = 6.0;
    gl_FragColor = vec4(1.0, 0.0, 0.0, x[idx]);
  }
</script>
<script id="tvwfrag" type="x-shader/x-fragment">


  precision mediump float;

  uniform float x[3];

  varying vec2 TexCoord;
  void main()
  {
    int idx = 4 * int(max(1.0, TexCoord.s*20.0));
    x[2] = TexCoord[idx];
    gl_FragColor = vec4(1.0, 0.0, 0.0, x[2]);
  }
</script>
<script id="frag" type="x-shader/x-fragment">


  precision mediump float;

  void main()
  {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
  }
</script>


<style>canvas{ position:absolute; }</style>
</head><body>
  <canvas id="gl" width="1" height="1"></canvas>
</body></html>
