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/stage/tool-handle.js | 724 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 724 insertions(+) create mode 100644 js/stage/tool-handle.js (limited to 'js/stage/tool-handle.js') diff --git a/js/stage/tool-handle.js b/js/stage/tool-handle.js new file mode 100644 index 00000000..03513de7 --- /dev/null +++ b/js/stage/tool-handle.js @@ -0,0 +1,724 @@ +/* +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 = Vector.create([1, 0, 0]); + this._vec2 = Vector.create([0, 1, 0]); + this._vec3 = Vector.create([0, 0, 1]); + break; + case "y": + this._vec = Vector.create([0, 1, 0]); + this._vec2 = Vector.create([1, 0, 0]); + this._vec3 = Vector.create([0, 0, 1]); + break; + case "z": + this._vec = Vector.create([0, 0, 1]); + this._vec2 = Vector.create([1, 0, 0]); + this._vec3 = Vector.create([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; + + var pointOnElt = base.slice(0); +// this._origin = viewUtils.localToGlobal(pointOnElt, item); + this._origin = pointOnElt; + + + var viewMat = viewUtils.getMatrixFromElement(this.application.ninja.currentDocument.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 = Vector.create([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 = Vector.create( [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 = Vector.create([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 = Vector.create([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 = Vector.create([xC, yC, 0]); + + var context = this.application.ninja.stage.drawingContext; + context.save(); + + context.strokeStyle = this._strokeStyle; + 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; + } + } + +}); -- cgit v1.2.3