annotate resources/render/webgl-utils.js @ 0:0b8d8ce99f46 default tip

commit
author Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
date Mon, 14 Feb 2011 17:06:56 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /*
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 * Copyright 2010, Google Inc.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 * All rights reserved.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 * met:
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 * * Redistributions of source code must retain the above copyright
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 * * Redistributions in binary form must reproduce the above
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 * copyright notice, this list of conditions and the following disclaimer
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 * in the documentation and/or other materials provided with the
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 * distribution.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 * * Neither the name of Google Inc. nor the names of its
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 * contributors may be used to endorse or promote products derived from
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 * this software without specific prior written permission.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 * @fileoverview This file contains functions every webgl program will need
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 * a version of one way or another.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 * Instead of setting up a context manually it is recommended to
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 * use. This will check for success or failure. On failure it
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 * will attempt to present an approriate message to the user.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 * gl = WebGLUtils.setupWebGL(canvas);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 * For animated WebGL apps use of setTimeout or setInterval are
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 * discouraged. It is recommended you structure your rendering
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 * loop like this.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 * function render() {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 * WebGLUtils.requestAnimationFrame(canvas, render);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 * // do rendering
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 * ...
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 * }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 * render();
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 * This will call your rendering function up to the refresh rate
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 * of your display but will stop rendering if your app is not
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 * visible.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 * To get an animationTime call
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 * timeInMilliSeconds = WebGLUtils.animationFrame();
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 WebGLUtils = function() {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 var requestAnimationFrameImpl_;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 var getAnimationTimeImpl_;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 * Creates the HTLM for a failure message
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 * @param {string} canvasContainerId id of container of th
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 * canvas.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 * @return {string} The html.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 var makeFailHTML = function(msg) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 return '' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 '<table style="background-color: #8CE; width: 100%; height: 100%;"><tr>' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 '<td align="center">' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 '<div style="display: table-cell; vertical-align: middle;">' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 '<div style="">' + msg + '</div>' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 '</div>' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 '</td></tr></table>';
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 * Mesasge for getting a webgl browser
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 * @type {string}
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 var GET_A_WEBGL_BROWSER = '' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 'This page requires a browser that supports WebGL.<br/>' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 '<a href="http://get.webgl.org">Click here to upgrade your browser.</a>';
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 * Mesasge for need better hardware
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 * @type {string}
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 var OTHER_PROBLEM = '' +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 "It doesn't appear your computer can support WebGL.<br/>" +
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 '<a href="http://get.webgl.org/troubleshooting/">Click here for more information.</a>';
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 * Creates a webgl context. If creation fails it will
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 * change the contents of the container of the <canvas>
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 * tag to an error message with the correct links for WebGL.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 * @param {Element} canvas. The canvas element to create a
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 * context from.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 * @param {WebGLContextCreationAttirbutes} opt_attribs Any
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 * creation attributes you want to pass in.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 * @param {function:(msg)} opt_onError An function to call
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 * if there is an error during creation.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 * @return {WebGLRenderingContext} The created context.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 var setupWebGL = function(canvas, opt_attribs, opt_onError) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 function handleCreationError(msg) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 var container = canvas.parentNode;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 if (container) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 var str = window.WebGLRenderingContext ?
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 OTHER_PROBLEM :
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 GET_A_WEBGL_BROWSER;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 if (msg) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 str += "<br/><br/>Status: " + msg;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 container.innerHTML = makeFailHTML(str);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 opt_onError = opt_onError || handleCreationError;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 if (canvas.addEventListener) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 canvas.addEventListener("webglcontextcreationerror", function(event) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 opt_onError(event.statusMessage);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 }, false);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 var context = create3DContext(canvas, opt_attribs);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 if (!context) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 if (!window.WebGLRenderingContext) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 opt_onError("");
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 return context;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 * Creates a webgl context.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 * @param {!Canvas} canvas The canvas tag to get context
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 * from. If one is not passed in one will be created.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 * @return {!WebGLContext} The created context.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 var create3DContext = function(canvas, opt_attribs) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 var names = ["webgl", "experimental-webgl", "webkit-3d", "moz-webgl"];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 var context = null;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 for (var ii = 0; ii < names.length; ++ii) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 try {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 context = canvas.getContext(names[ii], opt_attribs);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 } catch(e) {}
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 if (context) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 break;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 return context;
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 * Returns the animationTime in a cross browser way.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 * @return {number} The current animationTime
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 var animationTime = function() {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 if (!getAnimationTimeImpl_) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 getAnimationTimeImpl_ = function() {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 var attribNames = [
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 "animationTime",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 "webkitAnimationTime",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 "mozAnimationTime",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 "operaAnimationTime",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 "msAnimationTime"
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 ];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 for (var ii = 0; ii < attribNames.length; ++ii) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 var name = attribNames[ii];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 if (window[name]) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 return function() {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 return window[name];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 return function() {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 return (new Date()).getTime();
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 }();
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 return getAnimationTimeImpl_();
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 /**
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 * Provides requestAnimationFrame in a cross browser
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 * way.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 *
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 * @param {!Element} element Element to request an animation frame for.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 * @param {function(): void} callback. Callback that will be
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 * called when a frame is ready.
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 */
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 var requestAnimationFrame = function(element, callback) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 if (!requestAnimationFrameImpl_) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 requestAnimationFrameImpl_ = function() {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 var objects = [element, window];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 var functionNames = [
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 "requestAnimationFrame",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 "webkitRequestAnimationFrame",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 "mozRequestAnimationFrame",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 "operaRequestAnimationFrame",
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 "msRequestAnimationFrame"
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 ];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 var functions = [
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 function (name) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 return function(element, callback) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 element[name].call(element, callback);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 },
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 function (name) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 return function(element, callback) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 window[name].call(window, callback);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 ];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 for (var ii = 0; ii < objects.length; ++ii) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 var obj = objects[ii];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 for (var jj = 0; jj < functionNames.length; ++jj) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 var functionName = functionNames[jj];
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 if (obj[functionName]) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 return functions[ii](functionName);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 return function(element, callback) {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 window.setTimeout(callback, 1000 / 70);
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 }();
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 }
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 requestAnimationFrameImpl_(element, callback)
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 return {
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 animationTime: animationTime,
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 create3DContext: create3DContext,
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 requestAnimationFrame: requestAnimationFrame,
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 setupWebGL: setupWebGL
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 };
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 }();