Index: chrome/test/data/gpu/webgl_teapot/teapot_files/cameracontroller.js |
=================================================================== |
--- chrome/test/data/gpu/webgl_teapot/teapot_files/cameracontroller.js (revision 0) |
+++ chrome/test/data/gpu/webgl_teapot/teapot_files/cameracontroller.js (revision 0) |
@@ -0,0 +1,130 @@ |
+/* |
+ * Copyright (c) 2009 The Chromium Authors. 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. |
+ */ |
+ |
+// A simple camera controller which uses an HTML element as the event |
+// source for constructing a view matrix. Assign an "onchange" |
+// function to the controller as follows to receive the updated X and |
+// Y angles for the camera: |
+// |
+// var controller = new CameraController(canvas); |
+// controller.onchange = function(xRot, yRot) { ... }; |
+// |
+// The view matrix is computed elsewhere. |
+// |
+// opt_canvas (an HTMLCanvasElement) and opt_context (a |
+// WebGLRenderingContext) can be passed in to make the hit detection |
+// more precise -- only opaque pixels will be considered as the start |
+// of a drag action. |
+function CameraController(element, opt_canvas, opt_context) { |
+ var controller = this; |
+ this.onchange = null; |
+ this.xRot = 0; |
+ this.yRot = 0; |
+ this.scaleFactor = 3.0; |
+ this.dragging = false; |
+ this.curX = 0; |
+ this.curY = 0; |
+ |
+ if (opt_canvas) |
+ this.canvas_ = opt_canvas; |
+ |
+ if (opt_context) |
+ this.context_ = opt_context; |
+ |
+ // Assign a mouse down handler to the HTML element. |
+ element.onmousedown = function(ev) { |
+ controller.curX = ev.clientX; |
+ controller.curY = ev.clientY; |
+ var dragging = false; |
+ if (controller.canvas_ && controller.context_) { |
+ var rect = controller.canvas_.getBoundingClientRect(); |
+ // Transform the event's x and y coordinates into the coordinate |
+ // space of the canvas |
+ var canvasRelativeX = ev.pageX - rect.left; |
+ var canvasRelativeY = ev.pageY - rect.top; |
+ var canvasWidth = controller.canvas_.width; |
+ var canvasHeight = controller.canvas_.height; |
+ |
+ // Read back a small portion of the frame buffer around this point |
+ if (canvasRelativeX > 0 && canvasRelativeX < canvasWidth && |
+ canvasRelativeY > 0 && canvasRelativeY < canvasHeight) { |
+ var pixels = new Uint8Array(1); |
+ controller.context_.readPixels(canvasRelativeX, |
+ canvasHeight - canvasRelativeY, |
+ 1, |
+ 1, |
+ controller.context_.RGBA, |
+ controller.context_.UNSIGNED_BYTE, |
+ pixels); |
+ // See whether this pixel has an alpha value of >= about 10% |
+ if (pixels[3] > (255.0 / 10.0)) { |
+ dragging = true; |
+ } |
+ } |
+ } else { |
+ dragging = true; |
+ } |
+ |
+ controller.dragging = dragging; |
+ }; |
+ |
+ // Assign a mouse up handler to the HTML element. |
+ element.onmouseup = function(ev) { |
+ controller.dragging = false; |
+ }; |
+ |
+ // Assign a mouse move handler to the HTML element. |
+ element.onmousemove = function(ev) { |
+ if (controller.dragging) { |
+ // Determine how far we have moved since the last mouse move |
+ // event. |
+ var curX = ev.clientX; |
+ var curY = ev.clientY; |
+ var deltaX = (controller.curX - curX) / controller.scaleFactor; |
+ var deltaY = (controller.curY - curY) / controller.scaleFactor; |
+ controller.curX = curX; |
+ controller.curY = curY; |
+ // Update the X and Y rotation angles based on the mouse motion. |
+ controller.yRot = (controller.yRot + deltaX) % 360; |
+ controller.xRot = (controller.xRot + deltaY); |
+ // Clamp the X rotation to prevent the camera from going upside |
+ // down. |
+ if (controller.xRot < -90) { |
+ controller.xRot = -90; |
+ } else if (controller.xRot > 90) { |
+ controller.xRot = 90; |
+ } |
+ // Send the onchange event to any listener. |
+ if (controller.onchange != null) { |
+ controller.onchange(controller.xRot, controller.yRot); |
+ } |
+ } |
+ }; |
+} |
Property changes on: chrome\test\data\gpu\webgl_teapot\teapot_files\cameracontroller.js |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |