<!DOCTYPE html>
<!--
 * Copyright 2014 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
-->

<html>
    <head>
    <title>WebGL Clear Test</title>
    <script type="text/javascript" src="tdl/base.js"></script>
    <script type="text/javascript">
        tdl.require('tdl.fps');
        tdl.require('tdl.webgl');

        window.onload = initialize;

        var g_fpsTimer; // object to measure frames per second

        function initialize() {
            var then = 0.0;
            var last = 0.0;
            var fpsElem = document.getElementById('fps');
            var canvas = document.getElementById('canvas');
            var w = 1024;
            var h = 1024;

            canvas.width = w;
            canvas.height = h;

            tdl.fps.NUM_FRAMES_TO_AVERAGE = 120;
            g_fpsTimer = new tdl.fps.FPSTimer();

            gl = tdl.webgl.setupWebGL(canvas, {alpha:false,antialias:false});
            if (!gl) {
                return false;
            }

            gl.clearColor(
                Math.random(), Math.random(), Math.random(), 1.0);
            gl.viewport(0, 0, w, h);

            function render() {
                tdl.webgl.requestAnimationFrame(render, canvas);

                var now = (new Date()).getTime();
                var elapsedTime = 0.0;
                if (then != 0.0) {
                    elapsedTime = now - then;
                }
                then = now;

                g_fpsTimer.update(elapsedTime * 0.001);
                fpsElem.innerHTML = g_fpsTimer.averageFPS;

                // Regulate how often we change the clear color over time. If we
                // were to change the color every frame then, depending on the
                // FPS rate, this would potentially happen very very fast and is
                // really irritating to watch.  I'm not sure how much impact
                // changing the color really has on performance, if any.
                // Nonetheless, changing the color periodically gives us a
                // visual cue that somethings actually happening.
                if (now - last > 500) {
                    gl.clearColor(
                        Math.random(), Math.random(), Math.random(), 1.0);
                    last = now;
                }

                // Clear color and depth buffers
                gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
            }

            render();

            return true;
        }
    </script>
  </head>
  <body>
    <div>fps: <span id="fps"></span></div>
    <canvas id="canvas" width="1024" height="1024" style="width: 100%; height: 100%;"></canvas>
  </body>
</html>
