﻿<!--

/*
** Copyright (c) 2014 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.
*/

-->

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" href="../../resources/js-test-style.css"/>
        <script src="../../resources/js-test-pre.js"></script>
        <script src="../resources/webgl-test-utils.js"></script>
        <script id="vshader" type="x-shader/x-vertex">
            attribute vec3 pos;

            void main()
            {
                gl_Position = vec4(pos, 1);
            }
        </script>

        <script id="fshader" type="x-shader/x-fragment">
            precision mediump float;
            uniform vec4 col;

            void main()
            {
                gl_FragColor = col;
            }
        </script>

        <script>
            "use strict";
            var wtu = WebGLTestUtils;

            function draw(gl, arr, colLoc, col)
            {
                var vertices = new Float32Array(arr);
                var vertBuf = gl.createBuffer();
                gl.bindBuffer(gl.ARRAY_BUFFER, vertBuf);
                gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
                gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
                gl.uniform4fv(colLoc, col);
                gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertices.length / 3);
            }

            function clear(gl, col, z)
            {
                gl.clearColor(col[0], col[1], col[2], col[3]);
                gl.clearDepth(z);
                gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
            }

            function check(gl)
            {
                wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0, 255, 0, 255], 'result should be green');
            }

            function runTest()
            {
                var flatSquare = [-1, -1, 0,
                                  -1, 1, 0,
                                   1, -1, 0,
                                   1, 1, 0];
                var slantedSquare = [-1, -1, -0.5,
                                     -1,  1, -0.5,
                                      1, -1, 0.5,
                                      1,  1, 0.5];
                var red = [1, 0, 0, 1];
                var green = [0, 1, 0, 1];
                var blue = [0, 0, 1, 1];

                var gl = wtu.create3DContext('testbed', { antialias: false });
                if (!gl)
                {
                    testFailed('could not create context');
                    return;
                }
                var program = wtu.setupProgram(gl, ['vshader', 'fshader'], ['pos']);
                var colLoc = gl.getUniformLocation(program, 'col');

                gl.enableVertexAttribArray(0);

                gl.enable(gl.DEPTH_TEST);
                gl.depthFunc(gl.LEQUAL);

                debug('Polygon offset fill should be off by default');
                clear(gl, red, 1.0);
                draw(gl, slantedSquare, colLoc, blue);
                draw(gl, slantedSquare, colLoc, green);
                check(gl);
                
                debug('Polygon offset units should have no effect when fill is off');
                clear(gl, red, 1.0);
                draw(gl, slantedSquare, colLoc, blue);
                gl.polygonOffset(0, 10);
                draw(gl, slantedSquare, colLoc, green);
                check(gl);

                debug('Polygon offset factor should have no effect when fill is off');
                clear(gl, red, 1.0);
                gl.polygonOffset(0, 0);
                draw(gl, slantedSquare, colLoc, blue);
                gl.polygonOffset(1.0, 0);
                draw(gl, slantedSquare, colLoc, green);
                check(gl);

                debug('Zero polygon offset units and factor should have no effect');
                clear(gl, red, 1.0);
                gl.enable(gl.POLYGON_OFFSET_FILL);
                gl.polygonOffset(0, 0);
                draw(gl, slantedSquare, colLoc, blue);
                draw(gl, slantedSquare, colLoc, green);
                check(gl);

                // It appears to be VERY common for drivers to implement the units offset in
                // floating-point arithmetic, which results in rount-to-nearest-even to cause
                // an offset of 1 to sometimes not alter the order between these polygons.
                debug('Polygon offset units of 2 should alter order of flat polygons');
                clear(gl, red, 1.0);
                draw(gl, flatSquare, colLoc, green);
                gl.polygonOffset(0, 2);
                draw(gl, flatSquare, colLoc, blue);
                check(gl);

                debug('Polygon offset factor of 0.1 should alter order of slanted polygons');
                clear(gl, red, 1.0);
                draw(gl, slantedSquare, colLoc, green);
                gl.polygonOffset(0.1, 0);
                draw(gl, slantedSquare, colLoc, blue);
                check(gl);

                debug('Polygon offset factor of 0.1 should not alter order of flat polygons');
                clear(gl, red, 1.0);
                draw(gl, flatSquare, colLoc, blue);
                gl.polygonOffset(0.1, 0);
                draw(gl, flatSquare, colLoc, green);
                check(gl);

                debug('Disabling polygon offset fill should leave order unaffected');
                clear(gl, red, 1.0);
                gl.polygonOffset(0.1, 1);
                gl.disable(gl.POLYGON_OFFSET_FILL);
                draw(gl, slantedSquare, colLoc, blue);
                draw(gl, slantedSquare, colLoc, green);
                check(gl);

                debug('Enabling polygon offset fill should affect order again');
                clear(gl, red, 1.0);
                draw(gl, slantedSquare, colLoc, green);
                gl.enable(gl.POLYGON_OFFSET_FILL);
                draw(gl, slantedSquare, colLoc, blue);
                check(gl);
            }
        </script>
    </head>
    <body>
        <canvas id="testbed" width="16" height="16" style="width:50px; height:50px"></canvas>
        <div id="description"></div>
        <div id="console"></div>
        <script>
            "use strict";
            description('Verify that polygon offset works');
            runTest();
            var successfullyParsed = true;
        </script>
        <script src="../../resources/js-test-post.js"></script>
    </body>
</html>
