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/hit-record.js | 291 +++++++++++++++++++++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 js/helper-classes/3D/hit-record.js (limited to 'js/helper-classes/3D/hit-record.js') diff --git a/js/helper-classes/3D/hit-record.js b/js/helper-classes/3D/hit-record.js new file mode 100644 index 00000000..5546cc5a --- /dev/null +++ b/js/helper-classes/3D/hit-record.js @@ -0,0 +1,291 @@ +/* +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 vecUtils = require("js/helper-classes/3D/vec-utils").VecUtils; +var drawUtils = require("js/helper-classes/3D/draw-utils").DrawUtils; +var snapManagerModule = require("js/helper-classes/3D/snap-manager"); + +var HitRecord = exports.HitRecord = Object.create(Object.prototype, +{ + + /////////////////////////////////////////////////////////////////////// + // Constant definitions + /////////////////////////////////////////////////////////////////////// + SNAP_TYPE_STAGE : { value: 1, writable: true }, + SNAP_TYPE_GRID_VERTEX : { value: 2, writable: true }, + SNAP_TYPE_GRID_HORIZONTAL : { value: 13, writable: true }, + SNAP_TYPE_GRID_VERTICAL: { value: 14, writable: true }, + SNAP_TYPE_ALIGN_MERGED: { value: 15, writable: true }, + SNAP_TYPE_HORIZONTAL_FROM_START: { value: 3, writable: true }, + SNAP_TYPE_VERTICAL_FROM_START: { value: 4, writable: true }, + SNAP_TYPE_ELEMENT: { value: 5, writable: true }, + SNAP_TYPE_ELEMENT_EDGE: { value: 6, writable: true }, + SNAP_TYPE_ELEMENT_VERTEX: { value: 7, writable: true }, + SNAP_TYPE_ALIGN_HORIZONTAL: { value: 8, writable: true }, + SNAP_TYPE_ALIGN_VERTICAL: { value: 9, writable: true }, + SNAP_TYPE_ALIGN_BOTH: { value: 10, writable: true }, + SNAP_TYPE_ELEMENT_CENTER: { value: 11, writable: true }, + SNAP_TYPE_CONTAINED_ELEMENT: { value: 12, writable: true }, + SNAP_TYPE_UNDEFINED: { value: null, writable: -1 }, + + /////////////////////////////////////////////////////////////////////// + // Instance variables + /////////////////////////////////////////////////////////////////////// + _type: { value: this.SNAP_TYPE_UNDEFINED, writable: true }, + _elt: { value: null, writable: true }, // this can be null. example: snapping to the working plane + _screenPt: { value: null, writable: true }, // snap point in global screen space + _localPoint: { value: null, writable: true }, // snap point in the local space of the element + _plane: { value: null, writable: true }, // plane equation at the snap point in local object space + _planeMat: { value: Matrix.I(4) , writable: true }, // transform to take the point from plane space to the transformed view space of the element + _assocScrPt: { value: null, writable: true }, // associated screen point + _assocScrPt2: { value: null, writable: true }, // a second associated point for drawing multiple snap align hits + _planarHit: { value: false, writable: true }, + _snapBoundaryIndex : { value: -1, writable: true }, // this used for snap align to object boundaries + _isQuadPt :{ value: false, writable: true }, // used for snapping to an object's quadrant point + + /////////////////////////////////////////////////////////////////////// + // Property accessors + /////////////////////////////////////////////////////////////////////// + getElt : { value: function() { return this._elt; }}, + setElt : { value: function(e) { this._elt = e; }}, + getElement : { value: function() { return this._elt; }}, + setElement : { value: function(e) { this._elt = e; }}, + + getZIndex : { value: function() { return this._zIndex; }}, + setZIndex : { value: function(i) { this._zIndex = i; }}, + + setScreenPoint : { value: function(s) { this._screenPt = s.slice(0); }}, + getScreenPoint : { value: function() { return this._screenPt.slice(0); }}, + + setLocalPoint : { value: function(s) { this._localPt = s.slice(0); }}, + getLocalPoint : { value: function() { return this._localPt.slice(0); }}, + + setAssociatedScreenPoint : { value: function(s) { this._assocScrPt = s.slice(0); }}, + getAssociatedScreenPoint : { value: function() { return this._assocScrPt.slice(0); }}, + hasAssociatedScreenPoint : { value: function() { return this._assocScrPt != null; }}, + + setAssociatedScreenPoint2 : { value: function(s) { this._assocScrPt2 = s.slice(0); }}, + getAssociatedScreenPoint2 : { value: function() { return this._assocScrPt2.slice(0); }}, + hasAssociatedScreenPoint2 : { value: function() { return this._assocScrPt2 != null; }}, + + setPlane : { value: function(p) { this._plane = p.slice(0); }}, + getPlane : { value: function() { return this._plane.slice(0); }}, + + setPlaneMatrix : { value: function(pm) { this._planeMat = pm.slice(0); }}, + getPlaneMatrix : { value: function() { return this._planeMat.slice(0); }}, + + setPlanarHit : { value: function(p) { this._planarHit = p; }}, + isPlanarHit : { value: function() { return this._planarHit; }}, + + getSnapBoundaryIndex : { value: function() { return this._snapBoundaryIndex; }}, + setSnapBoundaryIndex : { value: function(i) { this._snapBoundaryIndex = i; }}, + + getType : { value: function() { return this._type; }}, + setType : { value: function(t) {this._type = t; if (!this.checkType()) { throw new Error("invalid snap type"); return; } }}, + + getUseQuadPoint : { value: function() { return this._isQuadPt; }}, + setUseQuadPoint : { value: function(q) {this._isQuadPt = q; }}, + + /////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////// + + checkType :{ + value: function() { + var ok = false; + switch (this._type) + { + case this.SNAP_TYPE_STAGE: + //case this.SNAP_TYPE_GRID: + case this.SNAP_TYPE_GRID_VERTEX: + case this.SNAP_TYPE_GRID_HORIZONTAL: + case this.SNAP_TYPE_GRID_VERTICAL: + case this.SNAP_TYPE_HORIZONTAL_FROM_START: + case this.SNAP_TYPE_VERTICAL_FROM_START: + ok = true; + break; + + case this.SNAP_TYPE_ALIGN_MERGED: + ok = true; + break; + + case this.SNAP_TYPE_ELEMENT: + case this.SNAP_TYPE_ELEMENT_EDGE: + case this.SNAP_TYPE_ELEMENT_VERTEX: + case this.SNAP_TYPE_ELEMENT_CENTER: + case this.SNAP_TYPE_CONTAINED_ELEMENT: + ok = true; + break; + + case this.SNAP_TYPE_ALIGN_HORIZONTAL: + case this.SNAP_TYPE_ALIGN_VERTICAL: + case this.SNAP_TYPE_ALIGN_BOTH: + ok = true; + break; + } + + return ok; + } + }, + + isSomeGridTypeSnap : { + value: function() { + return + ( + (this._type == this.SNAP_TYPE_GRID_VERTEX) || + (this._type == this.SNAP_TYPE_GRID_HORIZONTAL) || + (this._type == this.SNAP_TYPE_GRID_VERTICAL) + ) + } + }, + + convertToWorkingPlane : { + value: function( wp ) { + var swp = this.calculateStageWorldPoint(); + var wpMat = drawUtils.getPlaneToWorldMatrix(wp, MathUtils.getPointOnPlane(wp)); + //var wpMatInv = wpMat.inverse(); + var wpMatInv = glmat4.inverse( wpMat, []); + var localPt = MathUtils.transformPoint( swp, wpMatInv ); + + // create a new hit record + var hr = Object.create(HitRecord);//new HitRecord(); + hr.setType( this.SNAP_TYPE_STAGE ); + hr.setScreenPoint( this.getScreenPoint() ); + hr.setLocalPoint( localPt ); + hr.setPlane( wp ); + hr.setPlaneMatrix( wpMat ); + hr.setElt( snapManagerModule.SnapManager.getStage() ); + + return hr; + } + }, + + calculateStageWorldPoint : { + value: function() { + var wPt; + var elt = this.getElt(); + if (elt != null) + { + var localPt = this.getLocalPoint(); + var planeMat = this.getPlaneMatrix(); + wPt = viewUtils.postViewToStageWorld( MathUtils.transformPoint(localPt,planeMat), elt ); + } + + return wPt; + } + }, + + + calculateScreenPoint : { + value: function() { + var scrPt; + + var stage = snapManagerModule.SnapManager.getStage(); + var stageMat = viewUtils.getMatrixFromElement( stage ); + var offset = viewUtils.getElementOffset( stage ); + offset[2] = 0; + viewUtils.pushViewportObj( stage ); + + var elt = this.getElt(); + if (elt != null) + { + var localPt = this.getLocalPoint(); + var planeMat = this.getPlaneMatrix(); + scrPt = viewUtils.postViewToStageWorld( MathUtils.transformPoint(localPt,planeMat), elt ); + scrPt = vecUtils.vecAdd( 3, viewUtils.viewToScreen( MathUtils.transformPoint(scrPt, stageMat) ), offset); + } + viewUtils.popViewportObj(); + + return scrPt; + } + }, + + calculateElementWorldPoint : { + value: function() { + var localPt = this.getLocalPoint(); + var worldPt = MathUtils.transformPoint( localPt, this.getPlaneMatrix() ); + + return worldPt; + } + }, + + calculateElementScreenPoint : { + value: function() { + var worldPt = this.calculateElementWorldPoint(); + viewUtils.pushViewportObj( this._elt ); + var scrPt = viewUtils.viewToScreen( worldPt ); + viewUtils.popViewportObj(); + + return scrPt; + } + }, + + calculateElementScreenToPlane : { + value: function( scrPt, plane ) { + var elt = this.getElt(); + viewUtils.pushViewportObj( elt ); + var viewPt = viewUtils.screenToView( scrPt[0], scrPt[1], scrPt[2] ); + var eyePt = viewUtils.getEyePoint(); + var projPt = MathUtils.vecIntersectPlane( eyePt, MathUtils.vecSubtract(viewPt,eyePt), plane ); + + return projPt; + } + }, + + calculateElementPreTransformScreenPoint : { + value: function() { + var localPt = this.getLocalPoint(); + + var worldPt = MathUtils.transformPoint( localPt, this.getPlaneMatrix() ); + var mat = viewUtils.getMatrixFromElement( this._elt ); + glmat4.inverse( mat ); + localPt = MathUtils.transformPoint( worldPt, mat ); + + viewUtils.pushViewportObj( this._elt ); + var scrPt = viewUtils.viewToScreen( localPt ); + viewUtils.popViewportObj(); + + return scrPt; + } + }, + + getTypeString :{ + value: function() { + var str; + switch (this.getType()) + { + case this.SNAP_TYPE_STAGE: str = "SNAP_TYPE_STAGE"; break; + case this.SNAP_TYPE_GRID_VERTEX: str = "SNAP_TYPE_GRID_VERTEX"; break; + case this.SNAP_TYPE_GRID_HORIZONTAL: str = "SNAP_TYPE_GRID_HORIZONTAL"; break; + case this.SNAP_TYPE_GRID_VERTICAL: str = "SNAP_TYPE_GRID_VERTICAL"; break; + case this.SNAP_TYPE_HORIZONTAL_FROM_START: str = "SNAP_TYPE_HORIZONTAL_FROM_START"; break; + case this.SNAP_TYPE_VERTICAL_FROM_START: str = "SNAP_TYPE_VERTICAL_FROM_START"; break; + case this.SNAP_TYPE_ELEMENT: str = "SNAP_TYPE_ELEMENT"; break; + case this.SNAP_TYPE_ELEMENT_EDGE: str = "SNAP_TYPE_ELEMENT_EDGE"; break; + case this.SNAP_TYPE_ELEMENT_VERTEX: str = "SNAP_TYPE_ELEMENT_VERTEX"; break; + case this.SNAP_TYPE_ELEMENT_CENTER: str = "SNAP_TYPE_ELEMENT_CENTER"; break; + case this.SNAP_TYPE_CONTAINED_ELEMENT: str = "SNAP_TYPE_CONTAINED_ELEMENT"; break; + case this.SNAP_TYPE_ALIGN_HORIZONTAL: str = "SNAP_TYPE_ALIGN_HORIZONTAL"; break; + case this.SNAP_TYPE_ALIGN_VERTICAL: str = "SNAP_TYPE_ALIGN_VERTICAL"; break; + case this.SNAP_TYPE_ALIGN_BOTH: str = "SNAP_TYPE_ALIGN_BOTH"; break; + case this.SNAP_TYPE_ALIGN_MERGED: str = "this.SNAP_TYPE_ALIGN_MERGED"; break; + + default: + str = "SNAP_TYPE_UNDEFINED"; + break; + } + + return str; + } + } +}); + -- cgit v1.2.3