diff options
author | luchen@google.com <luchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-13 20:29:34 +0000 |
---|---|---|
committer | luchen@google.com <luchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-13 20:29:34 +0000 |
commit | 335a82de3ca04230b393f1722e973a0f20e720b6 (patch) | |
tree | 1fd357e9801f99cdd0787446de3c3924a0f63bd8 /o3d | |
parent | 55779e6a7c90f306405003383aabab7dc1d1abc6 (diff) | |
download | chromium_src-335a82de3ca04230b393f1722e973a0f20e720b6.zip chromium_src-335a82de3ca04230b393f1722e973a0f20e720b6.tar.gz chromium_src-335a82de3ca04230b393f1722e973a0f20e720b6.tar.bz2 |
o3d-webgl: Adding oldschoolshadows sample.
Review URL: http://codereview.chromium.org/2924015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52210 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d')
-rw-r--r-- | o3d/samples/o3d-webgl-samples/old-school-shadows.html | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/o3d/samples/o3d-webgl-samples/old-school-shadows.html b/o3d/samples/o3d-webgl-samples/old-school-shadows.html new file mode 100644 index 0000000..18a85af --- /dev/null +++ b/o3d/samples/o3d-webgl-samples/old-school-shadows.html @@ -0,0 +1,277 @@ +<!-- +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. +--> +<!-- +This sample shows how to use simple circle texture for shadows. +--> +<!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> +Old School Shadows. +</title> +<link rel="stylesheet" type="text/css" href="../assets/style.css" /> +<!-- Include sample javascript library functions--> +<script type="text/javascript" src="../o3djs/base.js"></script> +<script type="text/javascript" src="../o3d-webgl/base.js"></script> + +<!-- Our javascript code --> +<script type="text/javascript" id="o3dscript"> +o3djs.base.o3d = o3d; +o3djs.require('o3djs.webgl'); +o3djs.require('o3djs.util'); +o3djs.require('o3djs.math'); +o3djs.require('o3djs.rendergraph'); +o3djs.require('o3djs.primitives'); +o3djs.require('o3djs.material'); + +// Constants +var SHADOW_SIZE = 5; + +// Events +// init() once the page has finished loading. +// unload() when the page is unloaded. +window.onload = init; +window.onunload = unload; + +// 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_clock = 0; +var g_timeMult = 1; +var g_globalParams; +var g_shadowDrawPassInfo; +var g_o3dWidth; +var g_o3dHeight; +var g_o3dElement; +var g_transforms = []; + +/** + * Creates the client area. + */ +function init() { + o3djs.webgl.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); + + // Make another draw pass just for the shadows so they get + // drawn last. We don't need to pass any extra info to createDrawPass + // because we are using the same drawContext and because we want it to + // happen last, both of which are the default. + g_shadowDrawPassInfo = g_viewInfo.createDrawPass( + g_o3d.DrawList.BY_PERFORMANCE); + + // Get the state object the shadow draw pass and set states for the shadows. + var state = g_shadowDrawPassInfo.state; + + // The following settings turn on blending for all objects using the + // shadow DrawList + state.getStateParam('AlphaBlendEnable').value = true; + state.getStateParam('SourceBlendFunction').value = + o3djs.base.o3d.State.BLENDFUNC_SOURCE_ALPHA; + state.getStateParam('DestinationBlendFunction').value = + o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA; + state.getStateParam('AlphaTestEnable').value = true; + state.getStateParam('AlphaComparisonFunction').value = + o3djs.base.o3d.State.CMP_GREATER; + + // Make the shadow not write to the ZBuffer, otherwise they will interfere + // with each other. Try commenting this line out to see what happens. Look + // closely when 2 shadows overlap. It's easier to see the problem + // if you make the shadows larger. Set the shadow size to 15 + state.getStateParam('ZWriteEnable').value = false; + + // This setting pulls the shadow in front of the ground plane even though + // they are at the same position in space. Comment this 2 lines out + // to see what happens if you don't use this setting. + state.getStateParam('PolygonOffset1').value = -1; + state.getStateParam('PolygonOffset2').value = -1; + + // Setup the view and projection matrices. + var eye = [15, 25, 50]; + var target = [0, 10, 0]; + var up = [0, 1, 0]; + g_viewInfo.drawContext.view = g_math.matrix4.lookAt(eye, target, up); + + g_viewInfo.drawContext.projection = g_math.matrix4.perspective( + g_math.degToRad(45), // field of view. + g_client.width / g_client.height, // aspect ratio + 0.1, // Near plane. + 5000); // Far plane. + + // Load a small circle texture. + o3djs.io.loadTexture( + g_pack, + o3djs.util.getAbsoluteURI('../assets/old-school-shadow.png'), + initStep3); +} + +function initStep3(texture, exception) { + if (exception) { + alert(exception); + return; + } + + // This material is used for the spheres. + var sphereMaterial = o3djs.material.createBasicMaterial( + g_pack, + g_viewInfo, + [1, 1, 1, 1]); + sphereMaterial.getParam('specularFactor').value = 0.4; + + // The material for the ground. + var checkerMaterial = o3djs.material.createCheckerMaterial( + g_pack, + g_viewInfo); + + // Make a material to use for the shadow. A standard constant shader will + // be fine. + var shadowMaterial = o3djs.material.createConstantMaterial( + g_pack, + g_viewInfo, + texture, + true); + shadowMaterial.drawList = g_shadowDrawPassInfo.drawList; + + // Setup the lighting for the ground and spheres. + 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); + + // Create a sphere. + var sphere = o3djs.primitives.createSphere( + g_pack, sphereMaterial, 2.5, 24, 48, + g_math.matrix4.translation([0, 2.5, 0])); + + // Create a plane for the shadow. + var shadow = o3djs.primitives.createPlane(g_pack, shadowMaterial, + SHADOW_SIZE, SHADOW_SIZE, 1, 1); + + // Instance 100 spheres with shadows. + for (var ii = 0; ii < 100; ++ii) { + var transform = g_pack.createObject('Transform'); + g_transforms.push(transform); + transform.parent = g_root; + transform.addShape(sphere); + // Give each sphere a pseudo random color. + transform.createParam('diffuse', 'ParamFloat4').value = [ + (ii * 1.71) % 1, + (ii * 2.09) % 1, + (ii * 6.31) % 1, + 1]; + var shadowTransform = g_pack.createObject('Transform'); + shadowTransform.parent = transform; + shadowTransform.addShape(shadow); + } + + // Setup a render callback for per frame processing. + g_client.setRenderCallback(onRender); + + window.g_finished = true; // for selenium testing. +} + +/** + * Called every frame. + * @param {!o3d.RenderEvent} renderEvent Rendering Information. + */ +function onRender(renderEvent) { + var elapsedTime = renderEvent.elapsedTime; + g_clock += elapsedTime * g_timeMult; + + moveThings(); +}; + +/** + * Moves all the sphere transforms in some pattern that is a function of + * g_clock so we can force it to a predictable state for testing. + */ +function moveThings() { + for (var ii = 0; ii < g_transforms.length; ++ii) { + var transform = g_transforms[ii]; + var xSpeed = g_clock * 0.25 + ii * 1.1; + var ySpeed = g_clock * 0.27 + ii * 0.5; + transform.identity(); + transform.translate(40 * Math.sin(xSpeed), + 0, + 40 * Math.cos(ySpeed)); + var scale = (Math.sin(g_clock * 0.29 + ii * 20.7) + 1) * 0.5 + 0.3; + transform.scale(scale, scale, scale); + } +} + +/** + * 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> +<h1>Old School Shadows</h1> +<div id="o3d" style="width: 800px; height: 600px"></div> +</body> +</html> |