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

Unified Diff: chrome/test/data/gpu/webgl_teapot/teapot_files/cameracontroller.js

Issue 4723006: Add test fixture for GPU browser tests which do image comparisons.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month 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 side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/test/data/gpu/webgl_teapot/teapot.html ('k') | chrome/test/data/gpu/webgl_teapot/teapot_files/context.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698