summaryrefslogtreecommitdiffstats
path: root/o3d
diff options
context:
space:
mode:
authorluchen@google.com <luchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-13 20:29:34 +0000
committerluchen@google.com <luchen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-13 20:29:34 +0000
commit335a82de3ca04230b393f1722e973a0f20e720b6 (patch)
tree1fd357e9801f99cdd0787446de3c3924a0f63bd8 /o3d
parent55779e6a7c90f306405003383aabab7dc1d1abc6 (diff)
downloadchromium_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.html277
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>