From b89a7ee8b956c96a1dcee995ea840feddc5d4b27 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Thu, 22 Dec 2011 07:25:50 -0800 Subject: First commit of Ninja to ninja-internal Signed-off-by: Valerio Virgillito --- js/helper-classes/3D/snap-2d-record.js | 130 +++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 js/helper-classes/3D/snap-2d-record.js (limited to 'js/helper-classes/3D/snap-2d-record.js') diff --git a/js/helper-classes/3D/snap-2d-record.js b/js/helper-classes/3D/snap-2d-record.js new file mode 100644 index 00000000..c77b28b3 --- /dev/null +++ b/js/helper-classes/3D/snap-2d-record.js @@ -0,0 +1,130 @@ +/* +This file contains proprietary software owned by Motorola Mobility, Inc.
+No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
+(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. +
*/ + +/////////////////////////////////////////////////////////////////////// +// Class HitRecord +// +/////////////////////////////////////////////////////////////////////// +var viewUtils = require("js/helper-classes/3D/view-utils").ViewUtils; +var snapManager = require("js/helper-classes/3D/snap-manager"); +var Snap2DRecord = exports.Snap2DRecord = Object.create(Object.prototype, +{ + /////////////////////////////////////////////////////////////////////// + // Constant definitions + /////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////// + // Instance variables + /////////////////////////////////////////////////////////////////////// + _elt : { value: null , writable: true}, // the four boundary points for the element in global screen space + _screenPtArray : { value: null , writable: true}, // snap point in global screen space + _alignPtArray : { value: null , writable: true}, // points for snap-align. Kept in working plane space + + _localToGlobalMat : { value: null, writable: true }, + _globalToLocalMat : { value: null, writable: true }, + + // indices to the extremal align points + _xMinArray : { value: [], writable: true }, + _xMaxArray : { value: [] , writable: true}, + _yMinArray : { value: [] , writable: true}, + _yMaxArray : { value: [] , writable: true}, + + /////////////////////////////////////////////////////////////////////// + // Property accessors + /////////////////////////////////////////////////////////////////////// + getElement: { value: function() { return this._elt; }}, + setElement: { value: function() { this._elt = e; }}, + + getScreenPointArray: { value: function() { return this._screenPtArray; }}, + getAlignPointArray: { value: function() { return this._alignPtArray; }}, + + getLocalToGlobalMatrix: { value: function() { return this._localToGlobalMat; }}, + setLocalToGlobalMatrix: { value: function() { this._localToGlobalMat = l2g.slice(0); }}, + + getGlobalToLocalMatrix: { value: function() { return this._globalToLocalMat; }}, + setGlobalToLocalMatrix: { value: function() { this._globalToLocalMat = g2l.slice(0); }}, + + /////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////// + init: { + value: function( elt ) { + this._elt = elt; + var bounds = viewUtils.getElementViewBounds3D( elt ); + + // get the screen and align points from the bounds + this._screenPtArray = new Array(); + this._alignPtArray = new Array(); + this._localToGlobalMat = viewUtils.getLocalToGlobalMatrix( elt ); + //this._globalToLocalMat = this._localToGlobalMat.inverse(); + this._globalToLocalMat = glmat4.inverse( this._localToGlobalMat, []); + for (var i=0; i<4; i++) + { + this._screenPtArray[i] = viewUtils.localToGlobal( bounds[i], elt ); + var worldPt = viewUtils.localToStageWorld( bounds[i], elt ); + this._alignPtArray[i] = MathUtils.transformPoint( worldPt, snapManager.SnapManager._worldToDragPlane ); + + ////////////////////////////////////////////////////////////////////// + // DEBUG CODE + var tmp = MathUtils.transformHomogeneousPoint( bounds[i], this._localToGlobalMat ); + tmp = MathUtils.applyHomogeneousCoordinate( tmp ); + if (!MathUtils.pointsEqual( 3, tmp, this._screenPtArray[i] )) + console.log( "**** Snap2DRecord cache screen points do not agree **** " + tmp + " => " + this._screenPtArray[i] ); + ////////////////////////////////////////////////////////////////////// + } + + // add the center point + var xCtr = 0.5*(bounds[0][0] + bounds[3][0]), yCtr = 0.5*(bounds[0][1] + bounds[1][1]); + var ctr = Vector.create( [xCtr, yCtr, 0] ); + this._screenPtArray[4] = viewUtils.localToGlobal( ctr, elt ); + var worldPt = viewUtils.localToStageWorld( ctr, elt ); + this._alignPtArray[4] = MathUtils.transformPoint( worldPt, snapManager.SnapManager._worldToDragPlane ); + + // set up the align points + this.initAlignExtremalPoints() + } + }, + + initAlignExtremalPoints: { + value: function() { + var xMinArray = [0], xMaxArray = [0], + yMinArray = [0], yMaxArray = [0]; + var alignPts = this._alignPtArray; + var xMin = alignPts[0][0], xMax = alignPts[0][0], + yMin = alignPts[0][1], yMax = alignPts[0][1]; + var sign; + for (var i=1; i<4; i++) + { + var pt = alignPts[i]; + sign = MathUtils.fpCmp(pt[0], xMin); if (sign < 0) { xMinArray = [i]; xMin = pt[0]; } else if (sign == 0) xMinArray.push(i); + sign = MathUtils.fpCmp(pt[0], xMax); if (sign > 0) { xMaxArray = [i]; xMax = pt[0]; } else if (sign == 0) xMaxArray.push(i); + sign = MathUtils.fpCmp(pt[1], yMin); if (sign < 0) { yMinArray = [i]; yMin = pt[1]; } else if (sign == 0) yMinArray.push(i); + sign = MathUtils.fpCmp(pt[1], yMax); if (sign > 0) { yMaxArray = [i]; yMax = pt[1]; } else if (sign == 0) yMaxArray.push(i); + } + this._xMinArray = xMinArray; + this._xMaxArray = xMaxArray; + this._yMinArray = yMinArray; + this._yMaxArray = yMaxArray; + } + }, + + getScreenPoint: { + value: function( index ) { + var rtnPt; + if ((index >= 0) && (index < 4) && (this._screenPtArray != null)) + rtnPt = this._screenPtArray[index].slice(0); + + return rtnPt; + } + }, + + addAlignPoint: { + value: function( pt ) { + this._alignPtArray.push( pt ); + } + } +}); + -- cgit v1.2.3