123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*
- * Copyright 2010, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- /**
- * @fileoverview This file contains functions every webgl program will need
- * a version of one way or another.
- *
- * Instead of setting up a context manually it is recommended to
- * use. This will check for success or failure. On failure it
- * will attempt to present an approriate message to the user.
- *
- * gl = WebGLUtils.setupWebGL(canvas);
- *
- * For animated WebGL apps use of setTimeout or setInterval are
- * discouraged. It is recommended you structure your rendering
- * loop like this.
- *
- * function render() {
- * window.requestAnimFrame(render, canvas);
- *
- * // do rendering
- * ...
- * }
- * render();
- *
- * This will call your rendering function up to the refresh rate
- * of your display but will stop rendering if your app is not
- * visible.
- */
- WebGLUtils = function() {
- /**
- * Creates the HTLM for a failure message
- * @param {string} canvasContainerId id of container of th
- * canvas.
- * @return {string} The html.
- */
- var makeFailHTML = function(msg) {
- return '' +
- '<table style="background-color: #8CE; width: 100%; height: 100%;"><tr>' +
- '<td align="center">' +
- '<div style="display: table-cell; vertical-align: middle;">' +
- '<div style="">' + msg + '</div>' +
- '</div>' +
- '</td></tr></table>';
- };
- /**
- * Mesasge for getting a webgl browser
- * @type {string}
- */
- var GET_A_WEBGL_BROWSER = '' +
- 'This page requires a browser that supports WebGL.<br/>' +
- '<a href="http://get.webgl.org">Click here to upgrade your browser.</a>';
- /**
- * Mesasge for need better hardware
- * @type {string}
- */
- var OTHER_PROBLEM = '' +
- "It doesn't appear your computer can support WebGL.<br/>" +
- '<a href="http://get.webgl.org/troubleshooting/">Click here for more information.</a>';
- /**
- * Creates a webgl context. If creation fails it will
- * change the contents of the container of the <canvas>
- * tag to an error message with the correct links for WebGL.
- * @param {Element} canvas. The canvas element to create a
- * context from.
- * @param {WebGLContextCreationAttirbutes} opt_attribs Any
- * creation attributes you want to pass in.
- * @return {WebGLRenderingContext} The created context.
- */
- var setupWebGL = function(canvas, opt_attribs) {
- function showLink(str) {
- var container = canvas.parentNode;
- if (container) {
- container.innerHTML = makeFailHTML(str);
- }
- };
- if (!window.WebGLRenderingContext) {
- showLink(GET_A_WEBGL_BROWSER);
- return null;
- }
- var context = create3DContext(canvas, opt_attribs);
- if (!context) {
- showLink(OTHER_PROBLEM);
- }
- return context;
- };
- /**
- * Creates a webgl context.
- * @param {!Canvas} canvas The canvas tag to get context
- * from. If one is not passed in one will be created.
- * @return {!WebGLContext} The created context.
- */
- var create3DContext = function(canvas, opt_attribs) {
- var names = ["webgl", "experimental-webgl", "webkit-3d", "moz-webgl"];
- var context = null;
- for (var ii = 0; ii < names.length; ++ii) {
- try {
- context = canvas.getContext(names[ii], opt_attribs);
- } catch(e) {}
- if (context) {
- break;
- }
- }
- return context;
- }
- return {
- create3DContext: create3DContext,
- setupWebGL: setupWebGL
- };
- }();
- /**
- * Provides requestAnimationFrame in a cross browser way.
- */
- window.requestAnimFrame = (function() {
- return window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
- window.setTimeout(callback, 1000/60);
- };
- })();
|