diff options
author | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-11 00:45:52 +0000 |
---|---|---|
committer | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-11 00:45:52 +0000 |
commit | 97c30fee110aa281dbf5ca13dbdac186bc6098ca (patch) | |
tree | 5edbd21d02e6e1e3b06c14ec06d723fddf08000b /o3d/samples/GoogleIO-2009/step10ex.html | |
parent | 3b4cbbfd3d8c8f5eb703560828c8fa25524819ea (diff) | |
download | chromium_src-97c30fee110aa281dbf5ca13dbdac186bc6098ca.zip chromium_src-97c30fee110aa281dbf5ca13dbdac186bc6098ca.tar.gz chromium_src-97c30fee110aa281dbf5ca13dbdac186bc6098ca.tar.bz2 |
fix sample names to be compatible with selenium scripts.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20446 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/samples/GoogleIO-2009/step10ex.html')
-rw-r--r-- | o3d/samples/GoogleIO-2009/step10ex.html | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/o3d/samples/GoogleIO-2009/step10ex.html b/o3d/samples/GoogleIO-2009/step10ex.html new file mode 100644 index 0000000..965ef7c --- /dev/null +++ b/o3d/samples/GoogleIO-2009/step10ex.html @@ -0,0 +1,361 @@ +<!-- +Copyright 2009, 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. +--> +<!-- +Google I/O O3D Sample. + +This sample shows the steps to make a simple frame rate independent game. +--> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<meta http-equiv="content-type" content="text/html; charset=UTF-8"> +<title> +Google I/O O3D Sample +</title> +<style type="text/css"> + html, body { + height: 100%; + margin: 0; + padding: 0; + border: none; + font-family: Arial, sans-serif; + } +</style> +<!-- Include sample javascript library functions--> +<script type="text/javascript" src="../o3djs/base.js"></script> + +<!-- Our javascript code --> +<script type="text/javascript"> +o3djs.require('o3djs.util'); +o3djs.require('o3djs.math'); +o3djs.require('o3djs.rendergraph'); +o3djs.require('o3djs.primitives'); +o3djs.require('o3djs.material'); +o3djs.require('o3djs.particles'); +o3djs.require('o3djs.scene'); +o3djs.require('o3djs.pack'); + +// Events +// init() once the page has finished loading. +// unload() when the page is unloaded. +window.onload = init; +window.onunload= unload; + +// constants +var MOVE_VELOCITY = 25; // in units per second. +var JUMP_VELOCITY = 100; +var GRAVITY = -500; + +// global variables +var g_o3dElement; +var g_o3d; +var g_math; +var g_client; +var g_viewInfo; +var g_pack; +var g_root; +var g_globalParams; +var g_o3dWidth; +var g_o3dHeight; +var g_o3dElement; +var g_keyDown = []; // which keys are down by key code. +var g_playerTransform; +var g_playerXPosition = 0; +var g_playerYPosition = 0; +var g_playerZPosition = 0; +var g_eye = [15, 25, 50]; +var g_target = [0, 10, 0]; +var g_up = [0, 1, 0]; +var g_viewMatrix; +var g_moveMatrix; +var g_canJump = true; +var g_jumping = false; +var g_playerYVelocity = 0; +var g_particleSystem; +var g_poofEmitter; +var g_poof; + +/** + * Updates the projection matrix. + */ +function updateProjection() { + g_viewInfo.drawContext.projection = g_math.matrix4.perspective( + g_math.degToRad(45), // field of view. + g_o3dWidth / g_o3dHeight, // aspect ratio + 0.1, // Near plane. + 5000); // Far plane. +} + +/** + * Given a view matrix computes an movement matrix to make it easy + * to move something relative to the camera view in the XZ plane. + * @param {!o3djs.math.Matrix4} viewMatrix A view matrix. + * @return {!o3djs.math.Matrix4} A movement matrix. + */ +function computeMoveMatrixFromViewMatrix(viewMatrix) { + var cameraMatrix = g_math.matrix4.inverse(viewMatrix); + var xAxis = g_math.cross([0, 1, 0], cameraMatrix[2].slice(0, 3)); + var zAxis = g_math.cross(xAxis, [0, 1, 0]); + return [ + xAxis.concat(0), + [0, 1, 0, 0], + zAxis.concat(0), + [0, 0, 0, 1]]; +} + +/* + * Updates the camera. + */ +function updateCamera() { + g_viewMatrix = g_math.matrix4.lookAt(g_eye, g_target, g_up); + g_viewInfo.drawContext.view = g_viewMatrix; + g_moveMatrix = computeMoveMatrixFromViewMatrix(g_viewMatrix); +}; + +/** + * Updates global variables of the client's size if they have changed. + */ +function updateClientSize() { + var newWidth = g_client.width; + var newHeight = g_client.height; + if (g_o3dWidth != newWidth || g_o3dHeight != newHeight) { + g_o3dWidth = newWidth; + g_o3dHeight = newHeight; + updateProjection(); + } +} + +/** + * Creates the client area. + */ +function init() { + o3djs.util.makeClients(initStep2); +} + +/** + * Initializes O3D and creates one shape. + * @param {Array} clientElements Array of o3d object elements. + */ +function initStep2(clientElements) { + // Initializes global variables and libraries. + g_o3dElement = clientElements[0]; + g_o3d = g_o3dElement.o3d; + g_math = o3djs.math; + g_client = g_o3dElement.client; + + // Creates a pack to manage our resources/assets + g_pack = g_client.createPack(); + + g_root = g_pack.createObject('Transform'); + + g_viewInfo = o3djs.rendergraph.createBasicView( + g_pack, + g_root, + g_client.renderGraphRoot); + + updateCamera(); + + var checkerMaterial = o3djs.material.createMaterialFromFile( + g_pack, 'shaders/checker.shader', g_viewInfo.performanceDrawList); + + g_globalParams = o3djs.material.createAndBindStandardParams(g_pack); + g_globalParams.lightWorldPos.value = [30, 60, 40]; + g_globalParams.lightColor.value = [1, 1, 1, 1]; + + // Create a ground plane. + var shape = o3djs.primitives.createPlane( + g_pack, checkerMaterial, 100, 100, 10, 10); + var transform = g_pack.createObject('Transform'); + transform.parent = g_root; + transform.addShape(shape); + + // Load character. + var transform = g_pack.createObject('Transform'); + g_playerTransform = transform; + var playerPack = g_client.createPack(); + o3djs.scene.loadScene(g_client, playerPack, g_playerTransform, + 'assets/character.o3dtgz', initStep3); +} + +/** + * Continue setting up after the model has loaded. + */ +function initStep3(playerPack, parent, exception) { + o3djs.pack.preparePack(playerPack, g_viewInfo); + o3djs.material.bindParams(playerPack, g_globalParams); + g_playerTransform.parent = g_root; + + g_particleSystem = o3djs.particles.createParticleSystem(g_pack, g_viewInfo); + g_poofEmitter = g_particleSystem.createParticleEmitter(); + g_poofEmitter.setState(o3djs.particles.ParticleStateIds.ADD); + g_poofEmitter.setColorRamp( + [1, 1, 1, 0.3, + 1, 1, 1, 0]); + g_poofEmitter.setParameters({ + numParticles: 30, + lifeTime: 0.5, + startTime: 0, + startSize: 5, + endSize: 10, + spinSpeedRange: 10}, + function(index, parameters) { + var angle = Math.random() * 2 * Math.PI; + parameters.velocity = g_math.matrix4.transformPoint( + g_math.matrix4.rotationY(angle), [25, 2.5, 0]); + parameters.acceleration = g_math.mulVectorVector( + parameters.velocity, [-1.5, 1, -1.5]); + }); + g_poof = g_poofEmitter.createOneShot(g_root); + + // Setup a render callback for per frame processing. + g_client.setRenderCallback(onRender); + + o3djs.event.addEventListener(g_o3dElement, 'keydown', onKeyDown); + o3djs.event.addEventListener(g_o3dElement, 'keyup', onKeyUp); + + window.g_finished = true; // for selenium testing. +} + +/** + * Tracks key down events. + * @param {Event} e keyboard event. + */ +function onKeyDown(e) { + g_keyDown[e.keyCode] = true; +} + +/** + * Tracks key up events. + * @param {Event} e keyboard event. + */ +function onKeyUp(e) { + g_keyDown[e.keyCode] = false; +} + +/** + * Look at keys. + */ +function handleMoveKeys(elapsedTime) { + var directionX = 0; + var directionZ = 0; + + if (g_keyDown[37] || g_keyDown[65]) { directionX = -1; } + if (g_keyDown[39] || g_keyDown[68]) { directionX = 1; } + if (g_keyDown[38] || g_keyDown[87]) { directionZ = -1; } + if (g_keyDown[40] || g_keyDown[83]) { directionZ = 1; } + + if (g_canJump) { + if (g_keyDown[32]) { + g_jumping = true; + g_canJump = false; + g_playerYVelocity = JUMP_VELOCITY; + } + } else { + if (g_jumping) { + g_playerYVelocity += GRAVITY * elapsedTime; + g_playerYPosition += g_playerYVelocity * elapsedTime; + if (g_playerYPosition <= 0) { + g_playerYPosition = 0; + g_poof.trigger( + [g_playerXPosition, g_playerYPosition, g_playerZPosition]); + g_jumping = false; + } + } else { + if (!g_keyDown[32]) { + g_canJump = true; + } + } + } + + if (directionX != 0 || directionZ != 0) { + var moveTranslation = g_math.matrix4.transformPoint( + g_moveMatrix, + [MOVE_VELOCITY * directionX * elapsedTime, + 0, + MOVE_VELOCITY * directionZ * elapsedTime]); + + g_playerXPosition += moveTranslation[0]; + g_playerZPosition += moveTranslation[2]; + } + + g_playerTransform.identity(); + g_playerTransform.translate( + g_playerXPosition, g_playerYPosition, g_playerZPosition); +} + +/** + * Move the camera. + */ +function moveCamera() { + var newTarget = [g_playerXPosition, 10, g_playerZPosition]; + g_target = g_math.lerpVector(g_target, newTarget, 0.03); + updateCamera(); +} + +/** + * Called every frame. + * @param {!o3d.RenderEvent} renderEvent Rendering Information. + */ +function onRender(renderEvent) { + var elapsedTime = renderEvent.elapsedTime; + + updateClientSize(); + handleMoveKeys(elapsedTime); + moveCamera(); +}; + +/** + * Remove any callbacks so they don't get called after the page has unloaded. + */ +function unload() { + if (g_client) { + g_client.cleanup(); + } +} +</script> +</head> +<body> +<table style="width: 100%; height:100%;"> + <tr style="height: 50px;"><td> + <div style="width: 100%; height: 50px; font-size: large;"> + <img src="assets/colorbar.png" width="100%" height="10px"/><br/> + Google I/O 2009 O3D Sample + </div> + </td></tr> + <tr style="height: 100%;"><td> + <div style="width: 100%; height: 100%;"> + <div id="o3d" style="width: 100%; height: 100%;"></div> + </div> + </td></tr> +</table> +</body> +</html> |