<!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.autorun = false;
Tests.message = "This might take a second or two (or ten)";

Tests.testMatrixMultiply = function() {
    time("testMatrixMultiply", function() {
        var mat = Matrix.identity;
        for (var i=0; i<1000000; i++)
            Matrix.mul4x4(mat, mat);
    });
}
Tests.testTransformStack = function() {
    time("testTransformStack", function() {
        var j = 0;
        for (var i=0; i<1000; i++) {
            var t = new Date().getTime();
            var pmat = Matrix.perspective(30, 600/400, 1, 100+(t%1000));
            var look = Matrix.lookAt([4,-1,8], [-0.2,0+(t%1000),0], [0,1,0]);
            var rot = Matrix.rotate((t/400) % (2*Math.PI), [0, 1+(t%1000), 1]);
            var trans = Matrix.translate3(0, Math.cos(t/1000)*1, Math.sin(t/1000)*3);
            var sca = Matrix.scale1(0.6+(t%1000));
            var vmat = Matrix.identity;
            vmat = Matrix.mul4x4(vmat, pmat);
            vmat = Matrix.mul4x4(vmat, look);
            vmat = Matrix.mul4x4(vmat, trans);
            vmat = Matrix.mul4x4(vmat, sca);
            vmat = Matrix.mul4x4(vmat, rot);
            j += vmat.length;
        }
        Tests.j = j;
    });
}


</script>
<style>canvas{ position:absolute; }</style>
</head><body>
<h3>1000000x JavaScript Matrix.mul4x4</h3>
<p id="testMatrixMultiply"></p>
<h3>1000x JavaScript transform stack</h3>
<p id="testTransformStack"></p>
</body></html>

