/* 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.
*/ var Montage = require("montage/core/core").Montage, Component = require("montage/ui/component").Component, viewUtils = require("js/helper-classes/3D/view-utils").ViewUtils, vecUtils = require("js/helper-classes/3D/vec-utils").VecUtils, drawUtils = require("js/helper-classes/3D/draw-utils").DrawUtils; var ToolHandle = exports.ToolHandle = Montage.create(Component, { _x: { value: 0, writable: true }, _y: { value: 0, writable: true }, _width: { value: 4, writable: true }, _height: { value: 4, writable: true }, VERTEX_HIT_RAD: { value: 4, writable: true }, _cursor: { value: "default", writable: true }, _strokeStyle: { value: 'rgba(255,255,255,0.6)' }, _fillStyle: { value: 'rgba(0,0,0,1)' }, init: { value: function (cursorStyle) { this._cursor = cursorStyle; } }, draw: { value: function(x, y) { var context = this.application.ninja.stage.drawingContext; context.save(); context.fillStyle = this._fillStyle; this._x = x - this._width/2; this._y = y - this._height/2; context.fillRect(this._x, this._y, this._width, this._height); context.strokeStyle = this._strokeStyle; this._x = x - this._width/2 - 1; this._y = y - this._height/2 - 1; context.strokeRect(this._x, this._y, this._width + 2, this._height + 2); context.restore(); } }, collidesWithPoint: { value:function (x, y) { if(x < (this._x - this.VERTEX_HIT_RAD)) return false; if(x > (this._x + this._width + this.VERTEX_HIT_RAD)) return false; if(y < this._y - this.VERTEX_HIT_RAD) return false; if(y > (this._y + this._height + this.VERTEX_HIT_RAD)) return false; return true; } } }); exports.RotateHandle = Montage.create(ToolHandle, { _originL: { value: null, writable: true }, _origin: { value: null, writable: true }, _dirVec: { value: null, writable: true }, _dirVecL: { value: null, writable: true }, _radius: { value: 50, writable: true }, _transformCenterRadius: { value: 5, writable: true }, _cursor: { value: "default", writable: true }, _strokeStyle: { value: 'rgba(255,0,255,1)' }, _axis: { value: null, writable: true }, _lineWidth: { value: 2 }, _fillStyle: { value: 'rgba(255,0,255,1)' }, _nTriangles: { value: 30, writable: true }, _rotMat: { value: null, writable: true }, _rotMatInv: { value: null, writable: true }, _planeEq: { value: null, writable: true }, _matW: { value: null, writable: true }, _matL: { value: null, writable: true }, _vec: { value: null, writable: true }, _vec2: { value: null, writable: true }, _vec3: { value: null, writable: true }, _dragPlane: { value: null, writable: true }, init: { value: function (cursorStyle, color, axis) { this._cursor = cursorStyle; this._strokeStyle = color; this._fillStyle = color; this._axis = axis; switch(this._axis) { case "x": this._vec = [1, 0, 0]; this._vec2 = [0, 1, 0]; this._vec3 = [0, 0, 1]; break; case "y": this._vec = [0, 1, 0]; this._vec2 = [1, 0, 0]; this._vec3 = [0, 0, 1]; break; case "z": this._vec = [0, 0, 1]; this._vec2 = [1, 0, 0]; this._vec3 = [0, 1, 0]; break; } // get a matrix to rotate a point around the circle var angle = 2.0*Math.PI/Number(this._nTriangles); this._rotMat = Matrix.RotationZ( angle ); this._rotMatInv = glmat4.inverse(this._rotMat, []); } }, draw: { value: function(base, item, inLocalMode) { var context = this.application.ninja.stage.drawingContext; context.save(); context.strokeStyle = this._strokeStyle; context.fillStyle = this._fillStyle; context.lineWidth = this._lineWidth; context.shadowBlur = 2; context.shadowColor = "rgba(0, 0, 0, 0.8)"; var pointOnElt = base.slice(0); // this._origin = viewUtils.localToGlobal(pointOnElt, item); this._origin = pointOnElt; var viewMat = viewUtils.getMatrixFromElement(this.application.ninja.currentDocument.model.documentRoot); var transMat = viewMat.slice(0); if(inLocalMode) { var objMat = viewUtils.getMatrixFromElement(item); glmat4.multiply(viewMat, objMat, transMat); } this._planeEq = MathUtils.transformVector(this._vec, transMat); this._planeEq2 = MathUtils.transformVector(this._vec2, transMat); this._planeEq3 = MathUtils.transformVector(this._vec3, transMat); var viewVec = [0, 0, 1]; var angle2 = MathUtils.getAngleBetweenVectors(this._planeEq2, viewVec); var angle3 = MathUtils.getAngleBetweenVectors(this._planeEq3, viewVec); if(angle3 < angle2) { this._dirVec = vecUtils.vecNormalize(3, this._planeEq2, this._radius); } else { this._dirVec = vecUtils.vecNormalize(3, this._planeEq3, this._radius); } this._matW = drawUtils.getPlaneToWorldMatrix(this._planeEq, this._origin); this._matL = glmat4.inverse(this._matW, []); this._originL = MathUtils.transformPoint(this._origin, this._matL); this._planeEq[3] = -vecUtils.vecDot(3, this._planeEq, this._origin); this._dirVecL = MathUtils.transformPoint(this._dirVec, this._matL); context.beginPath(); var pt = [this._radius, 0.0, 0.0]; var pts; for (var i=0; i= -0.1) ) { return 1; } else if ( (t <= 1) && (t >= -1) ) { return 2; } } return 0; } localPt = MathUtils.transformPoint(localPt, this._matL); var theta = Math.atan2(localPt[1], localPt[0]); var xC = this._transformCenterRadius*Math.cos(theta); var yC = this._transformCenterRadius*Math.sin(theta); var ptOnCircle = [xC, yC, 0]; var dist = vecUtils.vecDist( 2, localPt, ptOnCircle ); if ( dist <= 5 ) { return 1; } xC = this._radius*Math.cos(theta); yC = this._radius*Math.sin(theta); ptOnCircle = [xC, yC, 0]; dist = vecUtils.vecDist( 2, localPt, ptOnCircle ); if ( dist <= 5 ) { return 2; } return 0; } }, drawShadedAngle: { value: function(angle, localPt) { var theta = Math.atan2(localPt[1], localPt[0]); var xC = this._radius*Math.cos(theta); var yC = this._radius*Math.sin(theta); var pt = [xC, yC, 0]; var context = this.application.ninja.stage.drawingContext; context.save(); context.strokeStyle = "rgba(0,0,0,1)"; context.lineWidth = 2; context.fillStyle = this._fillStyle; context.globalAlpha = 0.2; context.beginPath(); context.moveTo(this._origin[0], this._origin[1]); var pts = MathUtils.transformPoint(pt, this._matW); context.lineTo(pts[0], pts[1]); var n = Math.ceil(Math.abs( (this._nTriangles*angle) / (2*Math.PI) ) ); for (var i=0; i= 0) ) return 2; } return 0; } } });