Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: samples/GoogleIO-2009/step11.html

Issue 149438: Add Google IO sample. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: '' Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « samples/GoogleIO-2009/step10.html ('k') | samples/GoogleIO-2009/step12.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 <!--
2 Copyright 2009, Google Inc.
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
7 met:
8
9 * Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above
12 copyright notice, this list of conditions and the following disclaimer
13 in the documentation and/or other materials provided with the
14 distribution.
15 * Neither the name of Google Inc. nor the names of its
16 contributors may be used to endorse or promote products derived from
17 this software without specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 -->
31 <!--
32 Google I/O O3D Sample.
33
34 This sample shows the steps to make a simple frame rate independent game.
35 -->
36 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
37 "http://www.w3.org/TR/html4/loose.dtd">
38 <html>
39 <head>
40 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
41 <title>
42 Google I/O O3D Sample
43 </title>
44 <style type="text/css">
45 html, body {
46 height: 100%;
47 margin: 0;
48 padding: 0;
49 border: none;
50 font-family: Arial, sans-serif;
51 }
52 </style>
53 <!-- Include sample javascript library functions-->
54 <script type="text/javascript" src="../o3djs/base.js"></script>
55
56 <!-- Our javascript code -->
57 <script type="text/javascript">
58 o3djs.require('o3djs.util');
59 o3djs.require('o3djs.math');
60 o3djs.require('o3djs.rendergraph');
61 o3djs.require('o3djs.primitives');
62 o3djs.require('o3djs.material');
63 o3djs.require('o3djs.particles');
64 o3djs.require('o3djs.scene');
65 o3djs.require('o3djs.pack');
66
67 // Events
68 // init() once the page has finished loading.
69 // unload() when the page is unloaded.
70 window.onload = init;
71 window.onunload= unload;
72
73 // constants
74 var MOVE_VELOCITY = 25; // in units per second.
75 var JUMP_VELOCITY = 100;
76 var GRAVITY = -500;
77
78 // global variables
79 var g_o3dElement;
80 var g_o3d;
81 var g_math;
82 var g_client;
83 var g_viewInfo;
84 var g_pack;
85 var g_root;
86 var g_globalParams;
87 var g_o3dWidth;
88 var g_o3dHeight;
89 var g_o3dElement;
90 var g_keyDown = []; // which keys are down by key code.
91 var g_playerTransform;
92 var g_playerXPosition = 0;
93 var g_playerYPosition = 0;
94 var g_playerZPosition = 0;
95 var g_playerDirection = 0;
96 var g_eye = [15, 25, 50];
97 var g_target = [0, 10, 0];
98 var g_up = [0, 1, 0];
99 var g_viewMatrix;
100 var g_moveMatrix;
101 var g_canJump = true;
102 var g_jumping = false;
103 var g_playerYVelocity = 0;
104 var g_particleSystem;
105 var g_poofEmitter;
106 var g_poof;
107
108 /**
109 * Updates the projection matrix.
110 */
111 function updateProjection() {
112 g_viewInfo.drawContext.projection = g_math.matrix4.perspective(
113 g_math.degToRad(45), // field of view.
114 g_o3dWidth / g_o3dHeight, // aspect ratio
115 0.1, // Near plane.
116 5000); // Far plane.
117 }
118
119 /**
120 * Given a view matrix computes an movement matrix to make it easy
121 * to move something relative to the camera view in the XZ plane.
122 * @param {!o3djs.math.Matrix4} viewMatrix A view matrix.
123 * @return {!o3djs.math.Matrix4} A movement matrix.
124 */
125 function computeMoveMatrixFromViewMatrix(viewMatrix) {
126 var cameraMatrix = g_math.matrix4.inverse(viewMatrix);
127 var xAxis = g_math.cross([0, 1, 0], cameraMatrix[2].slice(0, 3));
128 var zAxis = g_math.cross(xAxis, [0, 1, 0]);
129 return [
130 xAxis.concat(0),
131 [0, 1, 0, 0],
132 zAxis.concat(0),
133 [0, 0, 0, 1]];
134 }
135
136 /*
137 * Updates the camera.
138 */
139 function updateCamera() {
140 g_viewMatrix = g_math.matrix4.lookAt(g_eye, g_target, g_up);
141 g_viewInfo.drawContext.view = g_viewMatrix;
142 g_moveMatrix = computeMoveMatrixFromViewMatrix(g_viewMatrix);
143 };
144
145 /**
146 * Updates global variables of the client's size if they have changed.
147 */
148 function updateClientSize() {
149 var newWidth = g_client.width;
150 var newHeight = g_client.height;
151 if (g_o3dWidth != newWidth || g_o3dHeight != newHeight) {
152 g_o3dWidth = newWidth;
153 g_o3dHeight = newHeight;
154 updateProjection();
155 }
156 }
157
158 /**
159 * Creates the client area.
160 */
161 function init() {
162 o3djs.util.makeClients(initStep2);
163 }
164
165 /**
166 * Initializes O3D and creates one shape.
167 * @param {Array} clientElements Array of o3d object elements.
168 */
169 function initStep2(clientElements) {
170 // Initializes global variables and libraries.
171 g_o3dElement = clientElements[0];
172 g_o3d = g_o3dElement.o3d;
173 g_math = o3djs.math;
174 g_client = g_o3dElement.client;
175
176 // Creates a pack to manage our resources/assets
177 g_pack = g_client.createPack();
178
179 g_root = g_pack.createObject('Transform');
180
181 g_viewInfo = o3djs.rendergraph.createBasicView(
182 g_pack,
183 g_root,
184 g_client.renderGraphRoot);
185
186 updateCamera();
187
188 var checkerMaterial = o3djs.material.createMaterialFromFile(
189 g_pack, 'shaders/checker.shader', g_viewInfo.performanceDrawList);
190
191 g_globalParams = o3djs.material.createAndBindStandardParams(g_pack);
192 g_globalParams.lightWorldPos.value = [30, 60, 40];
193 g_globalParams.lightColor.value = [1, 1, 1, 1];
194
195 // Create a ground plane.
196 var shape = o3djs.primitives.createPlane(
197 g_pack, checkerMaterial, 100, 100, 10, 10);
198 var transform = g_pack.createObject('Transform');
199 transform.parent = g_root;
200 transform.addShape(shape);
201
202 // Load character.
203 var transform = g_pack.createObject('Transform');
204 g_playerTransform = transform;
205 var playerPack = g_client.createPack();
206 o3djs.scene.loadScene(g_client, playerPack, g_playerTransform,
207 'assets/character.o3dtgz', initStep3);
208 }
209
210 /**
211 * Continue setting up after the model has loaded.
212 */
213 function initStep3(playerPack, parent, exception) {
214 o3djs.pack.preparePack(playerPack, g_viewInfo);
215 o3djs.material.bindParams(playerPack, g_globalParams);
216 g_playerTransform.parent = g_root;
217
218 g_particleSystem = o3djs.particles.createParticleSystem(g_pack, g_viewInfo);
219 g_poofEmitter = g_particleSystem.createParticleEmitter();
220 g_poofEmitter.setState(o3djs.particles.ParticleStateIds.ADD);
221 g_poofEmitter.setColorRamp(
222 [1, 1, 1, 0.3,
223 1, 1, 1, 0]);
224 g_poofEmitter.setParameters({
225 numParticles: 30,
226 lifeTime: 0.5,
227 startTime: 0,
228 startSize: 5,
229 endSize: 10,
230 spinSpeedRange: 10},
231 function(index, parameters) {
232 var angle = Math.random() * 2 * Math.PI;
233 parameters.velocity = g_math.matrix4.transformPoint(
234 g_math.matrix4.rotationY(angle), [25, 2.5, 0]);
235 parameters.acceleration = g_math.mulVectorVector(
236 parameters.velocity, [-1.5, 1, -1.5]);
237 });
238 g_poof = g_poofEmitter.createOneShot(g_root);
239
240 // Setup a render callback for per frame processing.
241 g_client.setRenderCallback(onRender);
242
243 o3djs.event.addEventListener(g_o3dElement, 'keydown', onKeyDown);
244 o3djs.event.addEventListener(g_o3dElement, 'keyup', onKeyUp);
245
246 window.g_finished = true; // for selenium testing.
247 }
248
249 /**
250 * Tracks key down events.
251 * @param {Event} e keyboard event.
252 */
253 function onKeyDown(e) {
254 g_keyDown[e.keyCode] = true;
255 }
256
257 /**
258 * Tracks key up events.
259 * @param {Event} e keyboard event.
260 */
261 function onKeyUp(e) {
262 g_keyDown[e.keyCode] = false;
263 }
264
265 /**
266 * Look at keys.
267 */
268 function handleMoveKeys(elapsedTime) {
269 var directionX = 0;
270 var directionZ = 0;
271
272 if (g_keyDown[37] || g_keyDown[65]) { directionX = -1; }
273 if (g_keyDown[39] || g_keyDown[68]) { directionX = 1; }
274 if (g_keyDown[38] || g_keyDown[87]) { directionZ = -1; }
275 if (g_keyDown[40] || g_keyDown[83]) { directionZ = 1; }
276
277 if (g_canJump) {
278 if (g_keyDown[32]) {
279 g_jumping = true;
280 g_canJump = false;
281 g_playerYVelocity = JUMP_VELOCITY;
282 }
283 } else {
284 if (g_jumping) {
285 g_playerYVelocity += GRAVITY * elapsedTime;
286 g_playerYPosition += g_playerYVelocity * elapsedTime;
287 if (g_playerYPosition <= 0) {
288 g_playerYPosition = 0;
289 g_poof.trigger(
290 [g_playerXPosition, g_playerYPosition, g_playerZPosition]);
291 g_jumping = false;
292 }
293 } else {
294 if (!g_keyDown[32]) {
295 g_canJump = true;
296 }
297 }
298 }
299
300 if (directionX != 0 || directionZ != 0) {
301 var moveTranslation = g_math.matrix4.transformPoint(
302 g_moveMatrix,
303 [MOVE_VELOCITY * directionX * elapsedTime,
304 0,
305 MOVE_VELOCITY * directionZ * elapsedTime]);
306 var targetDirection = Math.atan2(moveTranslation[0], moveTranslation[2]);
307 g_playerDirection = g_math.lerpRadian(g_playerDirection, targetDirection,
308 0.2);
309 g_playerXPosition += moveTranslation[0];
310 g_playerZPosition += moveTranslation[2];
311 }
312
313 g_playerTransform.identity();
314 g_playerTransform.translate(
315 g_playerXPosition, g_playerYPosition, g_playerZPosition);
316 g_playerTransform.rotateY(g_playerDirection);
317 }
318
319 /**
320 * Move the camera.
321 */
322 function moveCamera() {
323 var newTarget = [g_playerXPosition, 10, g_playerZPosition];
324 g_target = g_math.lerpVector(g_target, newTarget, 0.03);
325 updateCamera();
326 }
327
328 /**
329 * Called every frame.
330 * @param {!o3d.RenderEvent} renderEvent Rendering Information.
331 */
332 function onRender(renderEvent) {
333 var elapsedTime = renderEvent.elapsedTime;
334
335 updateClientSize();
336 handleMoveKeys(elapsedTime);
337 moveCamera();
338 };
339
340 /**
341 * Remove any callbacks so they don't get called after the page has unloaded.
342 */
343 function unload() {
344 if (g_client) {
345 g_client.cleanup();
346 }
347 }
348 </script>
349 </head>
350 <body>
351 <table style="width: 100%; height:100%;">
352 <tr style="height: 50px;"><td>
353 <div style="width: 100%; height: 50px; font-size: large;">
354 <img src="assets/colorbar.png" width="100%" height="10px"/><br/>
355 Google I/O 2009 O3D Sample
356 </div>
357 </td></tr>
358 <tr style="height: 100%;"><td>
359 <div style="width: 100%; height: 100%;">
360 <div id="o3d" style="width: 100%; height: 100%;"></div>
361 </div>
362 </td></tr>
363 </table>
364 </body>
365 </html>
OLDNEW
« no previous file with comments | « samples/GoogleIO-2009/step10.html ('k') | samples/GoogleIO-2009/step12.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698